N皇后问题

N皇后问题是一个经典问题,问题描述为棋盘是N*N(N>3的整数),要在里面放置N个皇后,每行每列,每个对角线上只能有一个皇后,如何放置。解决这个问题的方法有很多,最普通的就是蛮力法,也就是回溯法,还有简化的算法为约束传播方法,但是这些的复杂度以及搜索范围还是太大,对于N很大的时候计算时间要非常的长,另外的一种比较好的方法叫做启发式修补,这是运用人工智能中的思想来解决问题的。它的方法是先随机的在N*N的棋盘中,每列随机的放置一个皇后,然后对每列进行最小冲突的计算,每次将皇后放置在冲突最小的那个位置,不断调整下去,直到符合要求。
这个方法的思想类似于人工智能中训练人工神经元网络一样,先设置权值,然后不断的根据输出跟想要的结果进行比较,然后不断的调整权值。看似这个算法很好实现,不过就是计算下最小冲突,然后调整嘛,我最初也是这样设想的,可以完成这个算法加起来的时间估计要超过6小时,原因何在?这里有很多细节需要考虑,在此详细的说明。
计算每列的最小冲突,如何计算?采用什么方法?每行的冲突数还好算,但是每个对角线的冲突数如何计算?计算对角线的冲突数我想了很久,光这一个地方就卡了我4小时。为什么?因为我一直想找到一种很巧妙的方法,不断的分析那些数,怎么样能算出对角线冲突,以至于后面都乱了,忘记了每次只是计算一列的冲突,走了很多的弯路。最终是如何实现的?用了最简单的方法,就是每个点向上下斜上,斜下,自己扩展,去计算是否有冲突,其实这也说明了一个道理,做事情,不要总想的很复杂,也许很简单的方法就可以实现,并且并不是很坏的方法。这种从节点不断的扩展,计算,计算机做起来是最轻松的,人编程也是很轻松的,以后实现算法也多往一些方向考虑。这说明编程的次数太少,真正的编程思维还没有养成。
解决了最小冲突以为就万事OK了?不!还有很重要的2个内容,一如何判断已调整好,无需调整并推出循环。二是出现调整过程中出现死循环如何解决?先说第一个,这里我采用的方法是再定义一个数组,这个数组只管保存每次调整后,冲突数组中的最小值,等到一轮调整结束后,判断是否此数组中的所有内容全为0,如是这样,则调整结束,否则继续。第二个,调整中出现死循环,是什么原因?这与所给初值有关,如果所给初值不好,会在调整的过程中出现这样的情况,假设是4*4的,则某行冲突数为1123,明显,这里面最小冲突值有2个,如果只是单纯的寻找最小值,那么每次都会将皇后放置在第二个位置,而不是第一个,如果所有的列都是这样的情况呢?那就不停的死循环。这恐怕也是贪心法的弊端,我采用的方法是,设置一个随机数,在0,1之间,如果是0就选倒数第一个,如果是1就选倒数第2个,这个随机数有个种子就是srand(time(0)),这个种子如果在相差无几的时间内,得出来的随机数是一样的,所以,当出现死循环后,循环一段时候后,自己会去改变放置皇后的位置,这样在很大程度上避免了死循环。
以上就是这次做好200皇后问题后的想法,总结了很多,希望下次能避免。希望有大牛给更多的指教,小弟菜鸟一只~但有颗想成为大牛的心
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值