赞
踩
一、问题分析
问题描述:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
要求:求解并输出八皇后问题的全部92个解。
问题分析:在处理这个问题时,首先我们要注意八个皇后的摆放位置,八个皇后不能相互攻击,也就是说一个皇后不能放到另一个皇后的攻击范围内,而且任意的两个皇后之间不能站在同一行、同一列或同一斜线上,利用计算机程序解出八皇后的92个解。
二、问题的设计思路
1、思路:从棋盘的第一行开始,从第一个位置开始,依次判断当前位置是否能放置皇后,这时候我们需要设置判断的依据:与所有皇后的所在位置进行比较,如果在同一行,同一列,或在同一斜线上,则都不符合要求,需要继续检验后序的位置符不符合要求,如果这一列或行的位置都不符合要求,则需要改变皇后的位置,继续进行比较,直到所有皇后的位置摆放完毕。算法的思路设计如
图2-1
1、算法设计过程:
针对八皇后问题我们小组设计了两种不同的程序方案来解决这个问题。
(1)第一种方案:利用循环嵌套的方法来解决这个问题,利用循环嵌套,其实也就是用8个for循环来解决这个问题。
首先定义一个计数器,来记录下每次成功的8位皇后的摆放位置。
图3-1
然后我们先摆放第一个皇后,在摆放第二个皇后的时候要考虑第二个皇后的位置符不符合要求(任意两个皇后都不能处于同一行、同一列或同一斜线上,不能互相攻击)所以每摆放一个新的皇后时都要与前面摆放过的皇后进行if语句的判断。
图3-2
同理,在摆放第三个皇后时需要与第二个皇后进行比较判断。如果if判断条件不成立,那么将返回上一层循环,对上一个皇后的位置进行重新摆放。
图3-3
在摆放其余的皇后时也是同样的操作方法。这是我们小组设计的第一种解决方案,利用循环嵌套法,比较暴力的解决八皇后问题。
(2)第二种方案:利用算法中学习到的回溯法来解决这一问题,回溯法的求解过程实质上是先序遍历“状态树”的过程。树中每一个叶子结点,都有可能是问题的答案。
首先我们也是先要定义一个数组用来存放八皇后的位置,然后再定义两个变量(cnt和col)cnt用来表示摆放了几个皇后,col用来表示这一列上摆放了几个皇后。然后再(cnt,col)这个坐标里摆放皇后。然后我们开始进行判断如果第一个皇后到了第八列的位置且第二个皇后已经到了第六列的位置,已经摆放不下皇后,那么就推出循环。然后就是判断皇后会不会相互攻击,如果能相互攻击到,那我们就用1表示,如果不能攻击到就用0表示,这段代码如图3-4
图3-4
如果判断的结果为0,那么表示这个位置可以摆放皇后,记录下当前皇后的位置,开始摆放下一个皇后,下一个皇后接着从第一行开始遍历,如果摆满了八个皇后,就打印输出八个皇后的摆法,然后将八个皇后全部撤回,从下一行开始遍历,寻找新的位置,如此循环往复,直到解出所有的解法。
(1)回溯法的概述:
求解八皇后问题所用到的关键技术就是回溯法。回溯法是基于搜索的算法,是对枚举法的改进,避免无效的搜索。回溯法实际上是一个类似穷举的搜索尝试过程,利用回溯法去不断的搜索尝试,在搜索过程中寻找解决问题的解,当发现不满足求解的要求时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以到达目标。
回溯法的基本行为是搜索,搜索过程使用剪枝函数来为了避免无效的搜索。剪枝函数包括两类:1. 使用约束函数,剪去不满足约束条件的路径;2.使用限界函数,剪去不能得到最优解的路径。
用回溯法解问题时,应明确定义问题的解空间。问题的解空间至少包含问题的一个(最优)解。
定义了问题的解空间后,还应该将解空间很好地组织起来,使得能用回溯法方便地搜索整个解空间。通常将解空间组织成树或者图的形式。
确定了解空间的组织结构后,回溯法从根节点出发,以深度优先搜索方式搜索整个解空间。回溯法以这种工作方式递归地在解空间中搜索,直到找到所要求的解或解空间所有解都被遍历过为止。
回溯法搜索解空间树时,通常采用两种策略避免无效搜索,提高回溯法的搜索效率。其一是用约束函数在当前节点(扩展节点)处剪去不满足约束的子树;其二是用限界函数剪去得不到最优解的子树。这两类函数统称为剪枝函数。
图4-1
图4-2
回溯法不仅可以用来求解八皇后问题,还可以用来求解01背包问题,走迷宫问题、以及地图着色等等问题,回溯法也可以用来解决现实中很多复杂的问题,比如物流车的动态导航,由于物流车在配送过程中经常会遇到堵车的情况,如果物流车仍然按照最优的路线进行配送,无法及时做出调整,那么将影响运送的效率。那么可以利用回溯法实现物流车的静态优化,以当前路径作为该车的初始路径。如果物流车遇到堵车,用回溯法对未配送的客户重新进行最短路线的规划,来提高配送效率。
五、总结:
回溯算法就是一种有组织的系统最优化搜索技术,可以看作蛮力法穷举搜索的改进。回溯法常常可以避免搜索所有可能的解,所以它适用于求解组织数量较大的问题。
回溯法的优点在于其结构明确,可读性强,易于理解,而且通过对问题的分析可以大大提高运行效率。
通过本次实验,不仅让我们深刻体会了回溯算法的奥妙,也让我们深刻感受到了在程序设计中团队合作的重要性,在设计算法时不断的尝试,成员之间互相探讨,共同攻克难关,看到算法顺利解答出问题时,更加深刻的感受到了算法的魅力所在。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。