第五章作业
一、对回溯法的理解
基本思想:
构建问题的解空间树,在其解空间树中,从根节点出发,进行深度优先搜索。在搜索过程中,对解空间
树的每个结点进行判断,判断该结点是否包含问题的解,若肯定不包含,则跳过对以该结点为根的子树的
搜索,逐层向其祖先结点回溯。否则,则进入该子树,继续按深度优先策略搜索。
步骤:
1、针对所给问题,定义其解空间
2、确定易于搜索的解空间结构
3、深度优先搜索其解空间,并在搜索过程中用剪枝函数避免无效搜索
剪枝:
回溯法搜索空间树时,常用限界函数和约束函数避免无效搜索,其中约束函数将不满足约束的子树剪去,
限界函数将得不到最优解的子树。一般可以利用这两种剪枝方式提升算法的效率,避免大量的不必要搜索。
常见解空间:
常见的解空间有子集树和排列树两种,当问题是从n个元素的集合S中找到满足某种性质的s的子集时,相应的
解空间为子集树,通常存在2n个叶结点。0-1背包的问题相应解空间即为子集树。当问题是确定n个元素的满足
某种性质的序列时,相应的解空间树为排列树通常有n!个叶结点。旅行售货问题的解空间即为排列树。
二、“子集和”问题的解空间结构和约束函数
代码:
if(sum + a[t] <= c)
{
x[t] = 1 ;
sum = sum+a[t] ;
if ( backtrack(t+1) )
return true;
sum -= a[t];
}
if( sum + rest >= c)
{
x[t] = 0 ;
if ( backtrack(t+1) )
return true;
}
rest += a[t];
约束函数:
当递归的层数大于等于n时,表示当前层次已经大于元素的个数,接下来的为无用搜索,直接剪去该
结点的搜索即可,当搜索到当前结点后所得的值大于题目中的c,则表示接下来的搜索不可能找到等于c的
答案,直接剪去以该节为根的子树的搜索即可。
3.请说明在本章学习过程中遇到的问题及结对编程的情况
遇到的问题是学习剪枝方法和构建解空间树。结对编程中了解了回溯法的基本用法,对于大部分的题目中,都可以利用回溯法来解出他的答案,主要难点是构造解空间和搜索时的剪枝的方法,剪枝的方法会影响到算法的最终效率,需要多加考虑。在本次结对编程中,还是存在一些小问题,对同一题的不同想法等,在不断的交流中加深了对回溯法的理解,对学习理解有一定的帮助促进效果。
浙公网安备 33010602011771号