Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

функция сортировки деревьев

Only working scripts
Post Reply
Alex
Moderator
Moderator
Posts: 351
Joined: 07.04.2005 4:41

функция сортировки деревьев

Post by Alex »

находит деревья рядом и сортирует по дальности от лодки, что бы экономить время на пробежках к лодке

Code: Select all

boat_coords = (2176,289)

def SearchTrees():
  tree_tiles = range(3203,3331)
  trees = []
  x,y = boat_coords
  for tile in tree_tiles:
    trees += GetStaticTilesArray(x-20,y-20,x+20,y+20,WorldNum(), tile)
  return trees

def SortTrees(trees):
  """ @param trees List of tuples(tile,x,y,z) """
  trees_by_distance = {}
  ordered_trees_list = []
  prev_last_tree = (0,boat_coords[0],boat_coords[1])

  def TreeDist(tree1,tree2):
    return Dist(tree1[1],tree1[2],tree2[1],tree2[2])

  for tree in trees:
    td = TreeDist(tree, prev_last_tree)
    if td % 2 == 0:
      td-=1
    trees_group = trees_by_distance.get(td, [])
    trees_group.append(tree)
    trees_by_distance[td] = trees_group

  for current_distance in trees_by_distance:
    trees = trees_by_distance[current_distance]
    first_tree = last_tree = trees[0]
    for tree1 in trees:
      for tree2 in trees:
        if(TreeDist(tree1, tree2) > TreeDist(first_tree,last_tree)):
          first_tree, last_tree = tree1, tree2
    if(TreeDist(prev_last_tree,last_tree) < TreeDist(prev_last_tree, first_tree)):
      first_tree, last_tree = last_tree, first_tree
    trees.sort(key=lambda tree: TreeDist(tree,first_tree))
    ordered_trees_list += trees
    prev_last_tree = last_tree
    
  return ordered_trees_list

ordered_trees_list = SortTrees(SearchTrees())

for tree in ordered_trees_list:
  tile,x,y,z = tree
  newMoveXY(x,y,True,1,False)
Attachments
lumber_graph.png
lumber_graph.png (17.07 KiB) Viewed 6412 times
Новый стелс лежит тут. Стелс это произведение искусства! :)
nah nah
Developer
Developer
Posts: 414
Joined: 13.07.2011 11:23
Contact:

Re: функция сортировки деревьев

Post by nah nah »

Украду и буду использовать. :roll:
Вот мне всегда было интересно, почему в боиске близжайшего дерева, расстояние считалось не от чара,а от дерева?
Alex
Moderator
Moderator
Posts: 351
Joined: 07.04.2005 4:41

Re: функция сортировки деревьев

Post by Alex »

кстати да, если в списке деревьев просто искать ближайшее к чару и лодке дерево, должен получится тоже хороший маршрут
Новый стелс лежит тут. Стелс это произведение искусства! :)
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Re: функция сортировки деревьев

Post by grundick »

а как бы их так отсортировать, чтоб пробег чара между деревьями был минимальным...
CFA
Developer
Developer
Posts: 492
Joined: 20.04.2006 6:03
Contact:

Re: функция сортировки деревьев

Post by CFA »

grundick wrote:а как бы их так отсортировать, чтоб пробег чара между деревьями был минимальным...
Это называется "задача коммивояжёра", простейший способ решения - полный перебор. Те придется вычислить путь от каждого дерева до каждого оставшегося. А потом среди них найти минимальный итоговый путь. Вычислительная сложность очень большая.
Alex
Moderator
Moderator
Posts: 351
Joined: 07.04.2005 4:41

Re: функция сортировки деревьев

Post by Alex »

CFA wrote:
grundick wrote:а как бы их так отсортировать, чтоб пробег чара между деревьями был минимальным...
Это называется "задача коммивояжёра", простейший способ решения - полный перебор. Те придется вычислить путь от каждого дерева до каждого оставшегося. А потом среди них найти минимальный итоговый путь. Вычислительная сложность очень большая.
ага, точно, коммивояжера) я пытался найти в инете код-реализацию одного из алгоритмов решения её..ничо подходящего не нашел, что странно. находил функции сортировки графов, но это не совсем то, как такую применить я даже не знаю.

а по поводу минимального пробега между деревьями, есть вариант как уменьшить вычислительную сложность - вместо большого массива всех деревьев - возле текущего дерева брать GetStaticTilesArray с небольшим радиусом, и только между найденными искать ближайшее
Новый стелс лежит тут. Стелс это произведение искусства! :)
Post Reply