B站详解视频:https://www.bilibili.com/video/BV1EF411W7Rw?spm_id_from=333.999.0.0将从以下5个点进行改进:
1、启发函数——曼哈顿距离等
2、权重系数——动态加权等
3、搜索邻域——基于8邻域搜索改进
4、搜索策略——双向搜索、JPS策略等
5、路径平滑处理——贝塞尔曲线、B样条曲线等
权重系数改进
1、改进效果
以欧式距离为例
改进后的A星:
未改进的A星:
在保留规划出较优路径的前提下,搜索节点减少、搜索速度大大提升
主要对估价函数f(n)=g(n)+h(n)进行改进,上一节是对启发函数h(n)进行改进,这次是对公式整体进行改进,阅读大量论文,总结常见的改进方式如下:
2、f(n)=g(n)+w(n)*h(n)
理论:
在h(n)前增加一个权重系数w(n),即weight(n),g(n)与h(n)原本是1:1的权重分配,假如w(n)=2,权重分配变为1:2,这样对规划效果带来的影响是相比实际代价g(n)会更偏向用估计代价h(n)
权重系数w较大,此时A算法会尽快向终点扩展,搜索速度很快但会错过最优路径;当w较小,此时A算法会倾向于搜索最优路径而减慢搜索速度。
代码实现:
w = 2.0
d = math.hypot(n1.x - n2.x, n1.y - n2.y) # Euclidean
print(d)
h = w * d
return h
观察改进效果
3、动态加权
我们不可能只考虑搜索速度而不考虑规划的路径,也就是不可能一直让w=2,此时就考虑使用动态加权的方式,以原本的启发函数h(n)为判断依据,我们把它声明为d,当d>18时,w=3.0,此时算法搜索速度更快;当d<=18时,w=0.8,也就是接近终点的时候,优先考虑最优路径。
动态加权: 在放弃搜索最优路径的情况下,使用动态加权来缩短A星搜索的时间。其原则为,在搜索开始时,快速到达目的地所在区域更重要;在搜索结束时,得到到达目标的最佳路径更重要
当h较大时,权重系数w也应该较大,此时A算法会尽快向终点扩展,搜索速度很快但会错过最优路径;当h较小时,w也应该较小,此时A算法会倾向于搜索最优路径而减慢搜索速度。
此时代码变为:
if d > 18:
w = 3.0
else: w = 0.8
h = w * d
其中w与d的值要根据自己设定地图的大小、复杂程度进行多次调节,也可以按实际情况设置多段加权
本文仅提供简单的改进思路,更复杂更优的改进思路建议自己阅读论文。
参考:
论文《一种面向非结构化环境的改进跳点搜索路径规划算法》