算法第五章作业

算法第五章作业

对回溯算法的理解

其实,在我看来,对于回溯法思路的一个简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。基本思想类同于:

  1. 图的深度优先搜索

  2. 二叉树的后序遍历

其中分支限定法思想类同于:图的广度优先遍历以及二叉树的层序遍历。

回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。在回溯法应用方面,当问题是要求满足某种性质(约束条件)的所有解或最优解时,往往使用回溯法。

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

“子集和”问题的解空间结构:

 

 

访问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. 截止到目前,我和队友已经完成了一学期的结对编程任务,同时也包括了我们期末大作业的代码编写工作,在这个过程中我主要负责问题分析,而队友主要负责根据算法设计思路来进行代码实现,在算法设计方面,通过不断的磨合配合,我们可以达到彼此进行细致的讨论,来选择合适的算法,并完善思路的设计的结果。总体来说配合还是很好的,而自己在这个过程中也是在更规范地编程以及代码的书写。经过讨论,可以找出更优解,找出升级版解法,自己也是在这个过程中收获了不一样的解题思路。

posted @ 2019-12-19 09:35  愿我如苔  阅读(138)  评论(0编辑  收藏  举报