赞
踩
算法一直维护两个表: Open和Close
将起点S加入Open中
将所有S可到达的点(障碍物以及位于Close表中的点均看成不可达)加入到Open中。将起点从Open中删去,并加入到Close中
①从Open中删去F值最小的点Min,并将其加入到Close中
②将Min点所有可到达的点加入Open中,并设这些点的父节点为Min。若某点已经在Open中,则比较其F值,若新路径F值较小,说明从Min走路更短,更新其父节点为Min;否则不更新此点
循环①②,直到Open中出现目的点E
公式表示为: f(n)=g(n)+h(n),
其中 f(n) 是从初始状态经由状态n到目标状态的代价估计,
g(n) 是在状态空间中从初始状态到状态n的实际代价,
h(n) 是从状态n到目标状态的最佳路径的估计代价。
g(n)代表你从起始点到下一点的实际距离(制定到下一点的距离的规则)
h(n)是自己设计的函数,可以是到目的地大致的距离
可将循环过程封装成函数:
举个栗子:
对于以下图:5行15列
000000000000000
0000000x0000000
00s0000x0000e00
0000000x0000000
000000000000000
其中x为墙壁,s为起点,e为终点,建立合适的模型,调用A star算法,找到一条s到e的最短路径。
取直走G值为10,斜走G值为14
这里H值设定为无视障碍到达终点所需的 步数*10
我们看开始的几步:
000000000000000
0000000x0000000
00s0000x0000e00
0000000x0000000
000000000000000
灰色的点G=10,H=9*10 ,其F值最小,加入Close
000000000000000
0000000x0000000
00s0000x0000e00
0000000x0000000
000000000000000
灰色的点G=10+10,H=8*10 ,其F值最小,加入Close
000000000000000
0000000x0000000
00s0000x0000e00
0000000x0000000
000000000000000
灰色的点G=10+10+10,H=7*10 ,其F值最小,加入Close
000000000000000
0000000x0000000
00s0000x0000e00
0000000x0000000
000000000000000
灰色的点G=10+10+10+10,H=6*10 ,其F值最小,加入Close
以此循环,直到e在Open中,此时只需要沿着父节点往回走就可以到达起点了,这条路就是当前情况下最优的解
结果:
000000000000000
0000000x0000000
00s0000x0000e00
0000000x0000000
000000000000000
C++实现:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。