马的遍历进阶版--骑士巡游(添加了评估函数)[Teaks & xgluxv & r]
上周发布了一个简单的马的遍历程序,由于方法不太好,无法有效的解决骑士巡游问题。这次发布的方法则可以在可容忍的时间范围内解决该问题,并且也大幅度提高了非巡游路线的搜索速度,可谓马的遍历进阶版。
所谓骑士巡游问题,即在马的遍历基础上,要求马在踏遍国际象棋棋盘后,如果再走一步,可以回到原出发点,那么本次遍历的路线即满足骑士巡游的要求。
骑士巡游问题其实就是一个哈密尔顿环问题。盲目搜索的话,代价比较大,很久都得不到结果。所以本次的方法中添加了评估函数(Navigator函数),具体方法就是查看下一步的所有候选点中,哪个点所能行动方向最少,那么就优先考虑这个点。这样往后走的时候,剩下的点拥有尽可能多的方向选择,更少机会被堵死,从而可以更快的找到有效解。
呵呵,这个方法是前人研究手工解决骑士巡游问题得到的方法,用纸笔都可解决,更何况用计算机穷搜^_^。
大家同样可下载到C++和C#两个版本的代码,他们所实现的算法是一致的,搜索过程也是完全一样的。
关于用这个算法测试C++和C#的性能问题,我认为不是很全面,毕竟算法只是使用了语言的一小部分功能,故不能完全体现两者的差异,只能大致看一下双方的执行效率。
在我的机器上,C++和C#版(都是Release版)以(0, 0)点为起点搜索到100000条骑士巡游路线(1530348条马的遍历路线)的执行时间大致分别是273.764秒和819.778秒,比值约为1:3。这个比值对于商业软件也许不至于有太多影响,但如果是做游戏的话,可就要好好考虑考虑了。
点击此处下载源代码(vs2005工程文件。C++项目为Win32控制台项目,C#项目基于.Net 2.0)
路漫漫其修远兮 吾将上下而求索
my blog