算法导论 课程设计
题 目: 回 溯 法
学院班级: 1613013 学 号: 16130130216 姓 名: 库 妍 主讲教师: 张立勇 日 期: 2019.5.30
|
一、0/1 Knapsack Problem
1、实验题目
运用回溯法实现实验3中的0/1背包问题
2、使用的算法
回溯法
3、算法分析与设计
利用回溯法试设计一个算法求出0-1背包问题的解,也就是求出一个解向量xi (即对n个物品放或不放的一种的方案) 其中, (xi = 0 或1,xi = 0表示物体i不放入背包,xi =1表示把物体i放入背包)。在递归函数Backtrack中:
当i>n时,算法搜索至叶子结点,得到一个新的物品装包方案。此时算法适时更新当前的最优价值。
当i<n时,当前扩展结点位于排列树的第(i-1)层,此时算法选择下一个要安排的物品,以深度优先方式递归的对相应的子树进行搜索,对不满足上界约束的结点,则剪去相应的子树。
4、项目测试(功能与性能)
因为物品只有选与不选2个决策,而总共有n个物品,所以时间复杂度为O(2^n)。因为递归栈最多达到n层,而且存储所有物品的信息也只需要常数个一维数组,所以最终的空间复杂度为O(n)。
5、实验总结
0/1背包属于找最优解问题,用回溯法需要构造解的子集树。对于每一个物品i,对于该物品只有选与不选2个决策,总共有n个物品,可以顺序依次考虑每个物品,这样就形成了一棵解空间树:基本思想就是遍历这棵树,以枚举所有情况,最后进行判断,如果重量不超过背包容量,且价值最大的话,该方案就是最后的答案。
二、8-Queen problem
1、实验题目
用回溯法实现8-queen问题。
2、使用的算法
回溯法
3、算法分析与设计
(1)使用一个一维数组表示皇后的位置,其中数组的下标表示皇后所在的行,数组元素的值表示皇后所在的列。
(2)假设前n-1行的皇后已经按照规则排列好,那么可以使用回溯法逐个试出第n行皇后的合法位置, 所有皇后的初始位置都是第0列, 那么逐个尝试就是从0试到N-1,如果达到N,仍未找到合法位置, 那么就置当前行的皇后的位置为初始位置0,然后回退一行,且该行的皇后的位置加1,继续尝试, 如果目前处于第0行,还要再回退,说明此问题已再无解。
(3)如果当前行的皇后的位置还是在0到N-1的合法范围内,那么首先要判断该行的皇后是否与前几行的皇后互相冲突,如果冲突,该行的皇后的位置加1,继续尝试,如果不冲突,判断下一行的皇后, 如果已经是最后一行,说明已经找到一个解,输出这个解,然后最后一行的皇后的位置加1,继续尝试下一个解。
4、项目测试(功能与性能)
5、实验总结
理解回溯法解题思路:
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。