• 【寻路】超级简单的A星寻路算法实现


    A星寻路算法


    A星寻路算法是一种计算最短路径的算法,通过遍历周围所有可以前进的点,计算出最优路径。
    它吸取了Dijkstra 算法中的优点,为每个边长设置权值,不停的计算每个顶点到起始顶点的距离(G),以获得最短路线,同时也汲取贪婪最佳优先搜索算法中不断向目标前进优势,并持续计算每个顶点到目标顶点的距离(Heuristic distance),以引导搜索队列不断想目标逼近,从而搜索更少的顶点,保持寻路的高效。

    伪代码:


    1、将起点加入OpenList;
    2、开始循环判断OpenList中是否有可前进的节点;
    3、将F值最小的节点从OpenList取出,放入Close List;
    4、判断该节点是否未终点,是则跳出循环,不是继续将该点周围可行进的节点添加到OpenList;
    5、循环第3步直到查找到终点或遍历完所有OpenList;

    公式:


    f = g + h
    f:寻路消耗;
    g:离起点的移动消耗;G值的计算可以进行拓展
    往上、下、左、右这4个格子走时,移动代价为10
    往左上、左下、右上、右下这4个格子走时,移动代价为14;即走斜线的移动代价为走直线的1.4倍。

    h:离终点的预估消耗,最常用最简单的方法就是使用曼哈顿距离进行预估
    H = 当前方块到结束点的水平消耗 + 当前方块到结束点的垂直消耗

    OpenList;用来存储可以前进并且没有计算过的节点。
    Close List:用来存储不再考虑的节点。

    核心代码

    1. public List<AstarNode> FindPath(int _startX, int _startY, int _endX, int _endY)
    2.     {
    3.         List<AstarNode> _path = new List<AstarNode>();
    4.         m_openList.Clear();
    5.         closeList.Clear();
    6.         bool findPathFlag = false;
    7.         AstarNode currNode = null;
    8.         addToOpenList(null, _startX, _startY, _endX, _endY);//将起点加入OpenList;
    9.         while (m_openList.Count > 0)
    10.         {
    11.             currNode = OpenList[0];//取F值最小的节点
    12.             m_openList.Remove(currNode);//将当前节点移出OpenList
    13.             closeList.Add(currNode);//将当前节点加入CloseList
    14.             if (currNode == null)
    15.             {
    16.                 break;
    17.             }
    18.             if (currNode.X == _endX && currNode.Y == _endY)//如果找到重点,退出循环
    19.             {
    20.                 findPathFlag = true;
    21.                 break;
    22.             }
    23.             genAroundNode(currNode, _endX, _endY);//将周围满足条件的节点加入OpenList
    24.         }
    25.         if (!findPathFlag)
    26.         {
    27.             currNode = findNearPointFromList(closeList, endX, endY);//如果没有找到终点,在CloseList找一个最近的点。
    28.         }
    29.         if (currNode == null)
    30.         {
    31.             return null;
    32.         }
    33.         while (true)//递归父节点,找到所有路径
    34.         {
    35.             _path.Add(currNode);
    36.             if (currNode.X == _startX && currNode.Y == _startY)
    37.             {
    38.                 break;
    39.             }
    40.             currNode = currNode.Parent;
    41.         }
    42.         _path.Reverse();
    43.         return _path;
    44.     }

    A星寻路算法Demohttps://download.csdn.net/download/qq_33461689/14928453

  • 相关阅读:
    【杂谈】关于中国足球的AI对话
    CPU段访问控制:特权级(RPL CPL DPL)和代码段一致性
    spring cloud 快速上手系列 -> 02-配置中心 Config -> 021-Config服务端
    Python:处理XML文件汇总
    Vue3 ~
    gxhxjxizj
    kettle pan.sh如何后台运行
    2023年中秋·国庆节放假通知
    198.打家劫舍
    php 权限节点的位运算
  • 原文地址:https://blog.csdn.net/qq_33461689/article/details/125535132