Astar算法(1)

https://developer.aliyun.com/article/227136

 

 

状态空间搜索,将问题求解过程表现为从 初始状态到目标状态寻找这个路径的过程。

由于求解问题的过程中分枝有很多,主要是求解过程中求 解条件的不确定性,不完备性造成的,使得求解的路径很多这就构成了一个图,我们说这个图就是状态空 间。问题的求解实际上就是在这个图中找到一条路径可以从开始到结果。这个寻找的过程就是状态空间搜 索。  

 

常用的状态空间搜索有深度优先和广度优先。广度优先是从初始状态一层一层向下找,直到找到目标 为止。深度优先是按照一定的顺序前查找完一个分支,再查找另一个分支,以至找到目标为止。

 

前面说的广度和深度优先搜索有一个很大的缺陷就是他们都是在一个给定的状态空间中穷举。这在状 态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。他的效率 实在太低,甚至不可完成。在这里就要用到启发式搜索了。  

 

 

启发式搜索:

前面说的广度和深度优先搜索有一个很大的缺陷就是他们都是在一个给定的状态空间中穷举。这在状 态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。他的效率 实在太低,甚至不可完成。在这里就要用到启发式搜索了。  

 

估值函数:

f(n)=g(n)+h(n)

g(n):从初始节点到n节点的实际代价

h(n):n节点到目标节点的估算代价,h()需要搜索的启发信息

 

启发式搜索有很多种,包括:局部择优搜索算法,最好优先搜索法,A*算法。

 

局部择优搜索法,就是在搜索的过程中 选取“最佳节点”后舍弃其他的兄弟节点,父亲节点,而一直得搜索下去。这种搜索的结果很明显,由于舍 弃了其他的节点,可能也把最好的节点都舍弃了,因为求解的最佳节点只是在该阶段的最佳并不一定是全局 的最佳。

 

最好优先就聪明多了,他在搜索时,便没有舍弃节点(除非该节点是死节点),在每一步的估价中 都把当前的节点和以前的节点的估价值比较得到一个“最佳的节点”。这样可以有效的防止“最佳节点”的 丢失。

 

A* 算法也是一种最好优先的算法。只不过要加上一些约束 条件罢了。由于在一些问题求解时,我们希望能够求解出状态空间搜索的最短路径,也就是用最快的方法求 解问题, A* 就是干这种事情的!

 

 

A*算法:

A* 算法的估价函数克表示为:  

f'(n) = g'(n) + h'(n)  

 

f'(n) 是估价函数。

 g'(n) 是起点到终点的最短路径值。

 h'(n) 是 n 到目标的最短路径的启发值。

 

 

启发函数的选择:

https://blog.csdn.net/ChailangCompany/article/details/151904467

11. 曼哈顿距离(Manhattan Distance)

适用于四方向移动(上下左右)的网格地图:

h(n)=∣xn−xgoal∣+∣yn−ygoal∣ h(n) = |x_n - x_{goal}| + |y_n - y_{goal}|

 

其中 (xn,yn)(x_n, y_n)(xn​,yn​) 是当前节点坐标,(xgoal,ygoal)(x_{goal}, y_{goal})(xgoal​,ygoal​) 是目标坐标。

 

2. 欧几里得距离(Euclidean Distance

适用于八方向移动(允许对角线)的场景:

h(n)=(xn−xgoal)2+(yn−ygoal)2 h(n) = \sqrt{(x_n - x_{goal})^2 + (y_n - y_{goal})^2}

 

3. 切比雪夫距离(Chebyshev Distance

适用于八方向移动且允许斜向一步到位的情况(如国际象棋中的王):

h(n)=max⁡(∣xn−xgoal∣,∣yn−ygoal∣) h(n) = \max(|x_n - x_{goal}|, |y_n - y_{goal}|)

 

 

https://www.cnblogs.com/imreW/p/17119887.html

posted @ 2025-12-03 21:58  老禾的账本  阅读(0)  评论(0)    收藏  举报