【経路探索】超簡単なA-star経路探索アルゴリズムの実装

星の経路探索アルゴリズム


A-star パスファインディング アルゴリズムは、最短経路を計算するアルゴリズムであり、その周囲の可能なすべての点を横断することによって最適な経路を計算します。
ダイクストラアルゴリズムの利点を吸収し、各辺の長さに重みを設定し、各頂点から開始頂点までの距離 (G) を継続的に計算して最短経路を取得し、貪欲なベストファースト探索アルゴリズムも活用します。ターゲットに向かって継続的に前進し、各頂点からターゲット頂点までの距離 (ヒューリスティック距離) を継続的に計算して、探索キューが継続的にターゲットに近づくように誘導し、検索する頂点の数を減らし、パスファインディングの効率を維持します。

疑似コード:


1. OpenList に開始点を追加します;
2. OpenList 内で前に進むことができるノードがあるかどうかを判断するサイクルを開始します;
3. OpenList から最小の F 値を持つノードを取得し、それを Close List に入れます;
4. ノードが終点に到達していないかどうかを判断し、到達している場合は、その点の周囲に実行可能なノードを OpenList に追加し続けるのではなく、ループを終了します; 5. 終点が見つかるか、すべての OpenList が見つかるまでステップ 3 をループします
。横断しました。

公式:


f = g + h
f: 経路探索コスト;
g: 開始点からの移動コスト; G 値の計算は拡張可能上下左右
に移動する場合、左上に移動する場合の移動コストは 10
、左下、右上、右下の 4 つのマス目では、移動コストは 14、つまり斜めに進む場合の移動コストは直進する場合の 1.4 倍になります。

h: 終点からの推定消費量。最も一般的で簡単な方法は、マンハッタン距離を使用して推定することです。
H = 現在のブロックから終点までの水平消費量 + 現在のブロックから終点までの垂直消費量

OpenList; 先に進むことができ、まだ計算されていないノードを保存するために使用されます。
Close List: 考慮されなくなったノードを保存するために使用されます。

コアコード

public List<AstarNode> FindPath(int _startX, int _startY, int _endX, int _endY)
    {
        List<AstarNode> _path = new List<AstarNode>();
        m_openList.Clear();
        closeList.Clear();
        bool findPathFlag = false;

        AstarNode currNode = null;
        addToOpenList(null, _startX, _startY, _endX, _endY);//将起点加入OpenList;

        while (m_openList.Count > 0)
        {
            currNode = OpenList[0];//取F值最小的节点
            m_openList.Remove(currNode);//将当前节点移出OpenList
            closeList.Add(currNode);//将当前节点加入CloseList
            if (currNode == null)
            {
                break;
            }

            if (currNode.X == _endX && currNode.Y == _endY)//如果找到重点,退出循环
            {
                findPathFlag = true;
                break;
            }

            genAroundNode(currNode, _endX, _endY);//将周围满足条件的节点加入OpenList
        }
        if (!findPathFlag)
        {
            currNode = findNearPointFromList(closeList, endX, endY);//如果没有找到终点,在CloseList找一个最近的点。
        }
        if (currNode == null)
        {
            return null;
        }
        while (true)//递归父节点,找到所有路径
        {
            _path.Add(currNode);

            if (currNode.X == _startX && currNode.Y == _startY)
            {
                break;
            }
            currNode = currNode.Parent;
        }

        _path.Reverse();

        return _path;

    }

スターパスファインディングアルゴリズムのデモhttps://download.csdn.net/download/qq_33461689/14928453

おすすめ

転載: blog.csdn.net/qq_33461689/article/details/125535132
おすすめ