A*寻路算法

1 篇文章 0 订阅
1 篇文章 0 订阅

A*寻路算法


原创:程序员小灰

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
比如像这个样子:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第一步:
把起点放入 OpenList
在这里插入图片描述
第二步:
找出 OpenListF 值最小的方格,即唯一的方格 Node(1,2) 作为当前方格,并把当前格移出 OpenList,放入 CloseList。代表这个格子已到达并检查过了。
在这里插入图片描述
第三步:
找出当前格上下左右所有可到达的格子,看它们是否在 OpenList 当中。如果不在,加入 OpenList,计算出相应的 GHF 值,并把当前格子作为它们的“父亲节点”。
在这里插入图片描述

图中,每个格子的左下方数字是 G,右下方是 H,左上方是 F

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

为什么这一次 OpenList 只增加了两个新格子呢?因为 Node(3,2) 是墙壁,自然不用考虑,而 Node(1,2)CloseList 当中,说明已经检查过了,也不用考虑。

Round3 ~ 第一步:
找出 OpenListF 值最小的方格。由于这时候多个方格的 F 值相等,任意选择一个即可,比如 Node(2,3) 作为当前方格,并把当前格移出 OpenList,放入 CloseList。代表这个格子已到达并检查过了。
在这里插入图片描述
Round3 ~ 第二步:
找出当前格上下左右所有可到达的格子,看它们是否在 OpenList 当中。如果不在,加入 OpenList,计算出相应的 GHF 值,并把当前格子作为它们的“父亲节点”。

在这里插入图片描述
剩下的就是以前面的方式继续迭代,直到 OpenList 中出现终点方格为止。这里就仅用图片简单描述了,方格中数字表示 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;
}

在这里插入图片描述

这里对于 A* 寻路的描述做了很大的简化。实际场景中可能会遇到斜向移动、特殊地形等等因素,有些时候需要对 OpenList 中的方格进行重新标记。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值