Я реализовал свой алгоритм A* таким образом, что он находит кратчайший путь к цели, учитывая, что он может перемещаться только в соседние/смежные ячейки. (Предположим, что узлы — это ячейки сетки). Таким образом, есть 8 окружающих клеток, которые он может перемещать.
OOO
O*O
OOO
Это работает и находит кратчайший путь, но что, если мне нужны только узлы, которые находятся на расстоянии около 20-40 ячеек друг от друга и меньше, если это необходимо (скажем, дверь находится всего в одной ячейке). Как я могу это сделать без постобработки пути? Так что-то вроде этого?
XXXXOXOXOXXXX
XXXXXOOOXXXXX
OOOOOO*OOOOOO
XXXXXOOOXXXXX
XXXXOXOXOXXXX
Где O — «соседи», а X — нет.
def search(grid,start,goal):
dist = {}
visited = {}
predecessors= {}
hscore = {}
gscore = {}
gscore[start] = 0
hscore[start] = gscore[start] + heuristic(start,goal)
pq = PriorityQueue()
pq.put((hscore[start],start))
while not pq.empty():
current = pq.get()
if current[1] == goal:
return build_path(predecessors,goal)
visited[current[1]] = current[1]
max_dist = 0
succs = successors(grid,current[1],goal,pixels=90)
for successor in succs:
if visited.get(successor[0],None) != None:
continue
grid.grid[successor[0]] = (0,255,0)
g = gscore[current[1]] + 1
in_pq = successor[0] in pq
if (not in_pq or g < gscore[successor[0]] ):
predecessors[successor[0]] = current[1]
gscore[successor[0]] = g
hscore[successor[0]] = g + heuristic(successor[0],goal)
max_dist = dist
if not in_pq:
pq.put((hscore[successor[0]],successor[0]))
return []
successors
?). - person Nico Schertler   schedule 08.10.2014