【作业】算法第5章作业

1、对回溯算法的理解

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

用回溯算法解决问题的一般步骤:
a、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。
b 、确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。
c 、以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。
在回溯法执行时,应当:保存当前步骤,如果是一个解就输出;维护状态,使搜索路径(含子路径)尽量不重复。必要时,应该对不可能为解的部分进行剪枝。

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

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

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

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

我们在做第二题时较顺利,做第一题时约束函数不够好,剪枝有点小问题,跟结对队友讨论之后改正了。回溯法主要是要找到一个好的解空间,然后绝佳地剪枝,就很perfect!感谢结对队友,也感恩老师!

猜你喜欢

转载自www.cnblogs.com/orchids/p/10148697.html
今日推荐