【算法】图解A* 搜索算法

最新版本参考(含代码实现):【机器人】路径规划 - 图解A* 搜索算法 - 知乎

A* 算法是启发式搜索算法,是根据Dijkstra算法改进而来。

问题引入

如下图所示,S为起始(start)节点,G为目标(goal)节点。

  • 节点之间连线是两点的路径长度,如A到E的路径长度c(A,E) = 9。
  • 节点旁的h值时当前节点到达目标节点(G)的预估值,如h(A)=15, 表示从当前点A到达目标点G的估计路径长度为15,此处h(x)即为启发函数,启发函数的设计有很多方法,具体可参考链接,此处不再扩展。
  • 从起点S到达当前节点x的路径长度表示为g(x) 。
  • 从起点S到达目标G并经过点x的估计距离长度表示为f(x) = g(x) + h(x),该公式是A*算法的核心公式。
  • A*算法通过不断的选择估计距离f最小的节点,逐渐构建最短路径。

逻辑流程

创建两个集合OPEN集,CLOSED集,算法核心是从OPEN集中选择最优(f值小最优,或f相同时,h小的更优)的节点到CLOSED集中,然后将其后继节点放入OPEN集中,然后重复操作选取最优节点,直到到达目标,或者OPEN为空为止。最后再CLOSED集中根据目标G所包含的前序节点逆序查找最后到达起点S,这个链路的逆序即最优路径,具体流程如下图。

搜索过程

以下是前面网络的搜索过程展开图。

组合块中:

  • 灰色为前序节点
  • 蓝色当前节点x
  • g:起点S到当前节点x的路径距离。
  • h:当前节点x到终点G的估计距离
  • f:起点S途径x到达终点G的估计距离,即 f = g + h
  • 绿色框为当前OPEN集合中的最优节点
  • 红色框表示当前OPEN集合中需要被删除的节点

在OPEN、CLOSED中每一行表示一次完整迭代完成时两集合中的节点集合。

最后的最优路径是:S->B->F->k->G

注:当两个节点f相同时,h小的更优

更多阅读

【机器人】 D*算法-动态路径规划

  • 67
    点赞
  • 244
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
八数码问题是一种经典的拼图游戏,由一个3x3的九宫格和1-8的数字方块组成,最终目标是将九宫格中的数字方块按照特定的顺序排列。其中,空白方块可以和相邻的数字方块进行交换。 a算法是一种启发搜索算法,用于解决八数码问题。它通过评估每个状态的优先级,选择优先级高的状态进行搜索,以找到最优解。 下面我用图解的方式来说明a算法解决八数码问题的过程: 1. 首先,我们需要将输入的九宫格表示为一个初始状态。初始状态中的数字方块可以是随机排列的九个数字和一个空白方块。 2. 根据初始状态,我们计算出当前状态的优先级。优先级是通过计算当前状态与目标状态之间的差异来确定的。通常,我们使用曼哈顿距离来评估状态之间的差异。曼哈顿距离是通过计算每个数字方块与其目标位置之间的垂直和水平距离来计算的。 3. 接下来,我们将当前状态的所有可能的下一步状态计算出来,并计算每个下一步状态的优先级。 4. 我们选择优先级最高的下一步状态进行搜索。如果它是目标状态,那么问题解决。否则,我们将其加入到已搜索状态的列表中,并继续搜索。 5. 重复步骤3和4,直到找到目标状态。 通过a算法,我们可以找到八数码问题的最优解,即最少步数的解。该算法通过评估状态的优先级,选择最有可能导致目标的下一步状态进行搜索,从而提高搜索效率。我们可以根据a算法的优化来改进八数码问题的解决方法。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值