代码改变世界

第五章作业

2018-12-24 21:45  灿灿林  阅读(141)  评论(0编辑  收藏  举报

第五章作业

1、对回溯算法的理解

(1)回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

(2)用回溯算法解决问题的一般步骤:定义问题的解空间、确定问题解空间、以深度优先的方式搜索并在搜索过程中用剪枝函数避免无效搜索。

 

2、请说明“子集和”问题的解空间结构和约束函数

解空间结构:可以创建一个二叉树,其中level i 代表权重wi。 每一个节点引出两个branch, 一个branch标记为0, 一个标记为1. 标记为0的意思是这个branch引出的孩子节点对应的weight不再答案选中, 标记为1表示引出的child选中。要找到所有可能的答案, 就得遍历这棵树, 然后只要和为M, 就打印出从根节点到这条路径所有的节点即可。

约束函数:假设我们在level k 的时候, 我们积累到的和为S, 由于我们的所有的权重都是事先排好序, 从小到大的, 所以如果 S + wk > M, 那么我们就知道, 再沿着这条branch下去, 不可能得到解的。 只要还有能够找到解的possible, 我们就沿着这个branch继续找。另外如果全部子集相加也得不到所求结果那就不用继续往下了。

3、请说明在本章学习过程中遇到的问题及结对编程的情况

我和队友做第一题的时候遇到了较大的问题,因为约束函数不太好,剪枝有点小问题,在跟队友讨论上网查找资料之后,解决了问题。感觉每一次结对编程都会遇到问题,但是我和队友都会讨论一番,是在不行就上网 查找,最后收获也还是挺大的。