Как реализовать A* с минимальным количеством узлов на пути?

Я реализовал свой алгоритм 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 []

person carboncomputed    schedule 07.10.2014    source источник
comment
возможный дубликат stackoverflow.com/questions/9996808/   -  person Kiloreux    schedule 07.10.2014
comment
Точно не дубликат. Хотя это минимум пройден, я хочу сделать минимум, чтобы путь работал. Думайте об этом как об удалении лишних узлов на пути. Мы можем добраться из точки А в Б за 10 узлов, а можем добраться за 1 узел, я хочу добраться за 1 узел.   -  person carboncomputed    schedule 07.10.2014
comment
Когда вы говорите, что реализовали это, мы можем увидеть код?   -  person Ryan McDonough    schedule 07.10.2014
comment
Я добавил функцию поиска. Я реализовал только базовый A*, проходящий по одному узлу за раз.   -  person carboncomputed    schedule 08.10.2014
comment
Я не совсем понимаю вашу спецификацию проблемы. Но похоже, что вам просто нужно добавить больше ребер в граф (вероятно, через successors?).   -  person Nico Schertler    schedule 08.10.2014