A*寻路算法

简介: 一种用于寻找有效路径的算法。一个7×5大小的迷宫,绿色的格子是起点,红色格子是终点,中间三个蓝色格子是墙。这里对于A*寻路的描述做了很大的简化。实际场景中可能会遇到斜向移动、特殊地形等等因素,有些时候需要对OpenList中的方格进行重新标记。

一种用于寻找有效路径的算法。

一个7×5大小的迷宫,绿色的格子是起点,红色格子是终点,中间三个蓝色格子是墙。这里对于A*寻路的描述做了很大的简化。实际场景中可能会遇到斜向移动、特殊地形等等因素,有些时候需要对OpenList中的方格进行重新标记。

游戏的规则是从起点开始,每一步只能上下左右移动一格,且不能穿越墙壁。如何让AI用最少的步数到达终点?

引入两个集合和一个公式:

OpenList:可到达的格子

CloseList:已到达的格子 

F=G+H :对格子价值的评估,其中G代表从起点走到当前格的成本,也就是走了多少步,H代表从当前格走到目标格的距离(不考虑障碍)。F值越小越好。

第一步:把起点放入OpenList    

OpenList:Node(1,2)

第二步:找出OpenList中F值最小的方格,即唯一的方格Node(1,2)作为当前方格,并把当前格移出OpenList,放入CloseList。代表这个格子已到达并检查过了。 

CloseList:Node(1,2)

第三步:找出当前格上下左右所有可到达的格子,看它们是否在OpenList当中。如果不在,加入OpenList,计算出相应的G、H、F值,并把当前格子作为它们的“父亲节点”(为了确定最终路线)。 

OpenList:Node(1,1) Node(0,2) Node(2,2) Node(1,3)

CloseList:Node(1,2) 

Round1 ~ 第一步:找出OpenList中F值最小的方格,即方格Node(2,2)作为当前方格,并把当前格移出OpenList,放入CloseList。代表这个格子已到达并检查过了。

OpenList:Node(1,1) Node(0,2)  Node(1,3)

CloseList:Node(1,2) Node(2,2)

Round2 ~ 第二步:找出当前格上下左右所有可到达的格子,看它们是否在OpenList当中。如果不在,加入OpenList,计算出相应的G、H、F值,并把当前格子作为它们的“父亲节点”。 

 

public Node aStarSearch(Node start, Node end) {
    // 把起点加入 open list  
    openList.add(start);
    //主循环,每一轮检查一个当前方格节点
    while (openList.size() > 0) {
        // 在OpenList中查找 F值最小的节点作为当前方格节点
        Node current = findMinNode();
        // 当前方格节点从open list中移除
        openList.remove(current);
        // 当前方格节点进入 close list
        closeList.add(current);
        // 找到所有邻近节点
        List<Node> neighbors = findNeighbors(current);
        for (Node node : neighbors) {
            if (!openList.contains(node)) {
                //邻近节点不在OpenList中,标记父亲、G、H、F,并放入OpenList
                markAndInvolve(current, end, node);
            }
        }
        //如果终点在OpenList中,直接返回终点格子
        if (find(openList, end) != null) {
            return find(openList, end);
        }
    }
    //OpenList用尽,仍然找不到终点,说明终点不可到达,返回空
    return null;
}

  

 

目录
相关文章
|
算法 定位技术
Threejs中使用A*算法寻路导航,Threejs室内室外地图导航
Threejs中使用A*算法寻路导航,Threejs室内室外地图导航
1186 0
|
5月前
|
算法
互动游戏解决遇到问题之基于射线投射寻路算法的问题如何解决
互动游戏解决遇到问题之基于射线投射寻路算法的问题如何解决
|
6月前
|
Dart 算法 数据可视化
用flutter实现五种寻路算法的可视化效果,快来看看!
半年前我写了一篇有关排序算法可视化的文章,挺有意思,还被张风捷特烈-张老师收录进了FlutterUnit,今天让我们再来做一个有关寻路算法的可视化效果吧!
|
8月前
|
算法 定位技术 图形学
unity3d寻路算法
unity3d寻路算法
163 8
|
算法
Threejs中使用astar(A*)算法寻路导航,Threejs寻路定位导航
Threejs中使用astar(A*)算法寻路导航,Threejs寻路定位导航
671 0
|
算法
cocoscreator A* 寻路算法
cocoscreator A* 寻路算法
399 0
|
存储 人工智能 算法
Unity 实现A* 寻路算法
Unity 实现A* 寻路算法
437 2
Unity 实现A* 寻路算法
|
算法 定位技术
“ 探索迷局:解密广度寻路算法 “(二)
“ 探索迷局:解密广度寻路算法 “
|
存储 算法 定位技术
“ 探索迷局:解密广度寻路算法 “(一)
“ 探索迷局:解密广度寻路算法 “
|
算法 关系型数据库 MySQL
数据结构与算法——深度寻路算法
📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段,因为最近参加新星计划算法赛道(白佬),所以加快了脚步,果然急迫感会增加动力>——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的 📖作者主页:king&南星 📖专栏链接:数据结构 🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔​ 💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾 ———————————————— 版权声明:本文为CSDN博主「热爱编程的小K」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。