回溯法与分支界限法(精)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验6回溯法与分支界限法1 回溯法
C++代码
运行结果截图
算法分析
回溯法解决八皇后问题,并推广至N皇后问题,思路是很简单的,只需要一次新增加一个皇后,并判断此皇后可以放在当前行的哪些位置,如果可以在某些列放下去而不产生冲突,那么就在这些方法中继续递归求解下一行。如果在当前行任何位置都不能摆放一个皇后,就放弃当前的某一种尝试。
虽然代码很短,但是写起来是不好写的,因为递归程序并不好调试。所以要注意写递归程序的要点:
1) 合理定义递归程序的入口和出口
2) 每次递归,只是将问题的规模缩小,而问题性质是不变的。在这个算法中是一次求解棋盘中的一行达到规模缩小而问题性质不变。
2分支界限法C++代码
运行结果截图
算法分析
首先,这个算法是很神奇的,因为在之前使用动态规划法解决01背包问题之后,我一度以为使用穷举的方法因为运算量太大,是基本不可行的。但是使用分支界限法是可以得,而且,即使把分支界限法中的上界bound固定为一个非常大的数,也就是说,完完全全的使用穷举法,不对穷举法进行任何优化,也是可以在瞬间求解的。这充分说明了计算机强大的计算能力。
其次,分支界限法是对穷举法的改进,它抛弃了那些部分解肯定不在最优解
中的尝试,而这是通过确定部分解的上界来完成的。穷举法就是根据每个物品在或不在组合出所有可能,然后挑选最优解。而分支界限法一次判断一个物品是否会在最优解中,因为在判断若干物品(有时候甚至是少数几个物品)的组合中,我们就已经可以知道某些部分解是不可行包含在最优解中的(通过上界实现),所以这种方法可以在实际中极大的提高穷举法的运算时间。
最后,课本上关于上界的计算方法只是一个粗略的计算方式,如果问题规模变得更大,我们可以优化上界的计算方法。