启发式搜索(简单易懂版)

A ∗ A^* A算法

A ∗ A^* A算法是 A A A算法的改进,但是 A ∗ A^* A算法也有缺陷,目前也有很多文献对其进行研究,但这里主要还是介绍经典的 A ∗ A^* A算法。

算法原理

  • A ∗ A^* A算法的821定律,8个方向移动,2个列表(open list和close list),1条公式

  • 1条公式:设 f ( x ) f(x) f(x)代表当前节点 x x x的全局代价, g ( x ) g(x) g(x)是从起点到 x x x的实际代价, h ( x ) h(x) h(x)代表 x x x到终点的预测值, h ∗ ( x ) h^*(x) h(x)代表 x x x到终点的实际值,显然 f ( x ) = g ( x ) + h ∗ ( x ) f(x) = g(x) + h^*(x) f(x)=g(x)+h(x)。我们的最终目标是找到一条最短路径使得 f ( x ) f(x) f(x)越小越好。因此使用预测函数 h ( x ) h(x) h(x) h ∗ ( x ) h^*(x) h(x)进行近似
    f ( x ) = g ( x ) + h ( x ) f(x) = g(x) + h(x) f(x)=g(x)+h(x)
    实际上这和我之前讲的那个强化学习中TD算法有一样的思路。因此我们的目标就是最小化 h ( x ) h(x) h(x)使得近似等于 h ∗ ( x ) h^*(x) h(x),当 h ( x ) = h ∗ ( x ) h(x)=h^*(x) h(x)=h(x)就是我们想要的结果,这里就假设 g ( x ) g(x) g(x)是取得最小值的,这里就不过多赘述了。

  • 8个方向:点 x x x(绿点也就是终点,记住是从终点开始寻址的)能移动的方向有8个,移动的代价如图下每个方块左下角的值,这里采用了欧式距离计算(实际上经过测试好像曼哈顿距离是最好的),右下角的值代表 f ( x → p r e ) f(x \rightarrow pre) f(xpre),左上角的值代表,左下和右下角相加之和。基于贪心策略,我们显然优先选取右节点作为我们的节点
    启发式搜索(简单易懂版)_第1张图片

  • 两个列表open list和close list

    • open list:这东西你就理解成一个优先队列,排序顺序基于上图中每个节点的左上值。每次节点更新的时候,首先你就检索一下有没有重复添加节点,具体看下面算法流程。
    • close list:这东西作用就是拿来输出路径的,就是记录一下当前节点的父节点是什么。

算法流程

(1)设置两个列表,将起始点入open list(优先队列),close list为空

(2)每次取一个优先队列的头节点 P P P,判断是否为终点 E E E,是的话就设置 E E E的父节点为 P P P,最后倒叙输出close list(这东西就是我们想要的路径)。若 P P P为空,则表明搜索结束,未找到有效路径。否则就将 P P P加入到close list列表中并从open list列表删除并执行下一步。

(3)遍历 P P P的所有可达节点 P n e x t P_{next} Pnext,进行不重复入队操作(若重复,取最小的左上角值那个,并且重新设置父节点),同时设置 P n e x t P_{next} Pnext的父节点为 P P P

(4)返回(2)

你可能感兴趣的:(人工智能,算法,启发式算法,人工智能)