a * поиск пути — стоимость преемника

#path-finding #a-star

#поиск пути #a-star

Вопрос:

Я переделываю старую пользовательскую игру warcraft 3, в которую когда-то играл, и устанавливаю ее на iphone. В принципе, у вас есть определенное количество времени, чтобы построить лабиринт из определенного количества блоков, и чем дольше крипу требуется пробежать лабиринт, тем больше очков вы получаете.

Я делаю все это в airplay с cocos2d, и прямо сейчас я внедряю алгоритм поиска пути a *. Я использую реализацию Джастина Хейз-Джонса и прямо сейчас работаю над классом node.

Однако меня смущает пара вещей. Класс выглядит следующим образом:

 class MapSearchNode
{
public:
    unsigned int x;  // the (x,y) positions of the node
    unsigned int y; 


    MapSearchNode() { x = y = 0; }
    MapSearchNode( unsigned int px, unsigned int py ) { x=px; y=py; }

    bool IsGoal( MapSearchNode amp;nodeGoal ) { return (x == nodeGoal.x amp;amp; y == nodeGoal.y); }
    bool IsSameState( MapSearchNode amp;rhs ) { return (x == rhs.x amp;amp; y == rhs.y); }

    float GoalDistanceEstimate( MapSearchNode amp;nodeGoal );
    float GetCost( MapSearchNode amp;successor );
    bool GetSuccessors( AStarSearch<MapSearchNode> *astarsearch, MapSearchNode *parent_node );

    //void PrintNodeInfo();
};
  

Я просто не уверен, что означает getCost. В этом примере лабиринта, где X — стены, а _ ‘s — проходимые области, будет ли стоимость перехода от (3,1) к (3,2) равна 0? И тогда во что обойдется переход от (3,1) к (4,1), поскольку это невозможно?

 X X _ X X
X _ _ X X
X _ X X X
X _ _ _ _
X X X X X
  

И тогда, я думаю, я могу просто реализовать GoalDistanceEstimate, используя формулу расстояния, правильно?

Ответ №1:

Общий A * основан на взвешенном графике. В практических приложениях для решения лабиринтов все ребра имеют одинаковый конечный вес (обычно 1) для проходимой местности и бесконечный (записывается как очень большое число, просто используйте 100000 или что-то в этом роде) для непроходимой местности.

Комментарии:

1. Если вы делаете это так, как будто вам нужно придумать эвристику получше, чем просто евклидово расстояние, иначе A * не будет намного быстрее, чем у Дейкстры.

Ответ №2:

Насколько я понимаю, стоимость была «общей суммой», которая определяла «самый быстрый путь». Стоимость добавляется к каждому квадрату или узлу, к которым они должны перейти. Это также может включать такие вещи, как ограничения по местности (например, замедление вашего движения и т.д.).

Комментарии:

1. Я думаю, что нашел ответ. Для каждого из узлов стоимость будет равна единице (переход на один тайл вперед), и в методе GetSuccessors я не буду добавлять никаких преемников, которые нельзя обойти. И оказывается, что стоимость — это стоимость перехода от одного узла к другому, общая стоимость сохраняется в узле, и когда создается новый узел, его общая стоимость устанавливается равной общей стоимости последнего узла плюс функция getCost для нового узла.