关于A*算法的一点心得

173 阅读4分钟

思路来源

blog.csdn.net/haolexiao/a…

www.cnblogs.com/yyf0309/p/8…

心得

启发式搜索,听上去挺高端的,

这也是我入acm界一年多没学这个,对其望而生畏的原因之一

 

实际上,就是有目的的搜索,先选择那些最有可能搜到答案的情况,

而dfs、bfs搜索是盲目的暴力穷举,虽然可以部分小剪枝,

但没有很明显的调整搜索顺序从而优化的思想在里面。

 

比如最短路问题,如果我们当前从源点s走到了某个中间点i,实际花费为g(s->i),

那么我们要从i再去终点e,理想花费为h(i->n),

那最短路的理想状况就是g(s->i)+h(i->n)啦。

 

那么在我们面前有多个中转点i时,

记g(n)=g(s->i),h(n)=h(i->n),

我们优先选择g(n)+h(n)最小的点,是最优的。

 

其实质也是一种贪心思想,优先更新这些点,会使更新次数大大减少。

此时若选择次优的点,某些点很可能需要松弛两次以上,

而松弛最优点,只需要松弛一次。

 

以下各条摘自上述思路来源博客,自己对其加点批注。

先考虑极端情况, 如果h(n)=0的情况下,只有g(n)起作用,那么A*算法就是Dijkstra算法。①

若没有评估函数h(n),则每步走的都是真实的,那我们直接选当前最短的去更新就好了。

如果h(n)始终小于等于实际n点到终点的距离,那么必然能够保证A*算法找的解就是最优解。②

评估函数的情况往往比实际情况理想,我们对这些点抱有期望才去更新这些点。

h(n)越小,则A*扩展的节点也就越多,A*算法运行的也就越慢。③

存在一个期望落差,需要用实际遍历更多的点来确定新的g(n),来弥补期望落差。

如果h(n)始终都等于实际n点到终点的距离,那么A*算法只会严格走从起点到终点的最短路径。

如果h(n)有时候大于实际n点到终点的距离,那么不能保证A*算法能够找到最短路径。④

显然若h(n)大于实际距离,则我们误将该距离认为理想可更新距离,对其进行更新,

其结果就是,最后过该点的路,被g(n)发现比实际距离大时,已经作为错误答案更新其它边了。

另外一种极端情况,就是如果只有h(n)发挥作用,则A*算法就相当于贪心算法。⑤

对于未知,我们还是优先选择那些看上去像是最短路的路,尝试一下。

 

这个东西,可以变得更通俗易懂。

我在北京,想飞往纽约,直飞机票是10000元(g(终点))。

而北京飞东京,已经知道是3000元(g(i1)),东京飞纽约,专家估价8000元。(h(i1))。

北京飞西雅图,已经知道是4000元(g(i2)),西雅图飞底特律,专家估价2000元,底特律飞纽约,专家估价2000元。(h(i2))。

那我们先试试i2方案,即使最后不一定选择该方案,最后的花销还是按实际市场行情算的。

 

若能更新成功,我们会庆幸选了这么一条路。

若不能,我们只是没能因此更新其它路线而已。

最坏的影响,就是多搜了一波这条路上的这些点。

因此,专家的评估与真实值的贴近水平至关重要。

它决定着我们会能少搜多少点,起码别多搜啊QAQ。

 

若专家估价给高了,本来东京飞纽约应该1000元的,是最短路,

结果估价8000元,因此没能成为我们选择的目标。

最终我们理想错失最短路,选择了一条别的看似最短的路更新,

更新出来的路,肯定不是最短路。