概率算法结束了,要交作业了,其中一个题目是用LV算法解n皇后问题,并且给出当皇后数为12-20时,对于的随机放置皇后数(stepVegas)值。
不想全部从头写,打算找一个用回溯法求解n皇后的正确代码(因为lv算法里面有用到回溯部分),如果找到了,只需修改部分就可以用了。
虽然有个小错误,但是其它都对,算法写的很精炼。有了回溯法,修改就方便了。
回溯法是采用了穷举遍历的思想,优点是可以一次性找到所有解,缺点是算法性能较差。
由于n皇后的解是离散分布的,导致了在遍历搜索的过程中,很多都是做“无用功”。
这个时候LV算法就有了用武之地,先随机放置stepVegas个皇后(在前stepVegas行),剩下的n-stepVegas行调用回溯算法就行了。
事实上stepVegas的个数与n皇后解的分布情况有关。
举个例子,对于8后而言一共有92个解:
简要统计
第1行皇后放第1列的解有4个。
第1行皇后放第2列的解有8个。
.....
分析前两个皇后
第1行皇后放第1列,第2行皇后必须放5,6,7才有解。7解最多。
第1行皇后放第2列,第2行皇后必须放4,5,6,7,8才有解。
第1行皇后放第3列,第2行皇后必须放1,5,6,7,8才有解。6解最多。
可以看到无论第一行皇后也即第一个皇后放哪,都有可行解。这个时候stepVegas=1显然不好,因为要返回所有解就必须随机取遍
所有位置。要返回所有解的话整体上的性能还不如回溯法。stepVegas=2,由于并不是每个随机组合都有解,此时可以体现LV算法的优势。
关于n皇后解的分布规律问题,本文不做进一步阐述,有兴趣的可以自己琢磨琢磨。
下面是代码部分,里面有lv算法也有回溯法:
但是概率算法的思想还是很有用的,特别是sherwood和lasvegas。
THE END