搜索进阶的话,我觉得A*,IDA*,双向BFS应该都是吧。
双向BFS就是同时从起点和终点开始BFS,直到遇到对方标记的结点就停止(这样应该不一定是最短路),这样的话只要有解就可以减去很多种可能,从而提高效率。
不过如果没解的话,两边的搜索没有交叉,也就。。。会更慢。。。
然后就是A*,这算是人工智能里面的了吧。。。就是F(n)=G(n)+H(n),这里G一般就是节点的深度,也就是走了多少步走到了这里,H的话就是一个估计,估计还有差不多多少步就会走完,然后这两个加起来,作为一个依据,那么下一次要扩张的节点就是F值最小的那一个,因为这一个我们猜的可能是最优的,所以先走这个。当然可能这样的话可能并不能走到头。这样的话每次都找那个F最小的来扩张,找最小F的话可以用优先队列也就是二叉堆来优化。一般就会快不少。
不过要想得到最优解的话,应该保证H小于等于实际需要的步数,也就是说你要走到某个地方,那么H可以为直线距离,因为不可能比他更小了。
每次都保证H小于等于实际的话,最终一定可以拓展那个正确道路上的节点(不一定多块),因为别的点拓展到最后一定F比最优解大了,那么选最小的那个就是正确路上的那个了。
而且对于H的设计,这应该就是A*算法的核心了,有的可以是直线距离,有的可以是曼哈顿距离(也就是两个点x坐标相减与y坐标相减的和),也可以是不符合条件的个数(不在位个数),一个好的设计可以让程序更快。而且H的设计的话应该保证H小于等于实际值,而且一般来说,不同状态的H差别越大越好,小的很小,大的够大。
至于IDA*的话,又叫做迭代加上A*,应该是一种DFS吧,不过加了一个限制条件,设置一个期望的深度,当DFS到某一层的时候如果G+H大于这个深度了,就直接返回,因为我们要求的是深度小于等于设置值的解。IDA*的代码要短不少,写的也轻松,速度也不错。。。
然后就是搜索的问题了,这里要说的就是Eight了,八数码问题,作为学习各种搜索算法的非常好的一个题目。这里我用的是杭电1043,而不是POJ 1077,虽然他们题目几乎一模一样,但是杭电上是多组数据,POJ上是一组,这样的话多组数据可以方便看出各种算法的效率。
先是一篇经典的文章,八数码的八境界。
这篇文章系统的讲了八种方法,写的很好的。
然后就是我根据那位大神自己写的,(代码好烂的。)