算法第五章作业
算法第五章作业
对回溯算法的理解
其实,在我看来,对于回溯法思路的一个简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。基本思想类同于:
-
图的深度优先搜索
-
二叉树的后序遍历
其中分支限定法思想类同于:图的广度优先遍历以及二叉树的层序遍历。
回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。在回溯法应用方面,当问题是要求满足某种性质(约束条件)的所有解或最优解时,往往使用回溯法。
请说明“子集和”问题的解空间结构和约束函数
“子集和”问题的解空间结构:
访问i=0,可取,取;
之后,访问i=1,不可取,不取
访问i=2,,不可取,不取
i=3,到达叶子节点,返回。
i=2的调用执行结束;
i=1的执行结束;
i=0的执行代码没有结束,继续执行,更新权重为不取第一个,即i=0的对应的元素不取。
i=0不取时,继续访问i=1,i=2
以此类推,最后完成整个解空间的搜索。
每次到达叶子节点,记录当前最优解和解法。
约束函数的描述:
用rest来表示从当前元素加到最后一个元素的总和,用来回溯时判断限界剪枝
当sum + rest >= c,即当前所选元素之和+从当前元素加到最后一个元素的总和>=目标值时,走右子树
本章学习问题及结对编程情况
1. 在学习回溯算法的过程中,再次通过背包问题,子集和等一些例题的讲解,基本理解了回溯算法解决问题的基本思路,但是真正思路上在解决问题时,会出现由于对剪枝函数的不当理解,而无法正确设计算法的情况,这也是解题思路出现问题的原因,所以还是想通过练习,多进行理解一下。
2. 截止到目前,我和队友已经完成了一学期的结对编程任务,同时也包括了我们期末大作业的代码编写工作,在这个过程中我主要负责问题分析,而队友主要负责根据算法设计思路来进行代码实现,在算法设计方面,通过不断的磨合配合,我们可以达到彼此进行细致的讨论,来选择合适的算法,并完善思路的设计的结果。总体来说配合还是很好的,而自己在这个过程中也是在更规范地编程以及代码的书写。经过讨论,可以找出更优解,找出升级版解法,自己也是在这个过程中收获了不一样的解题思路。