第5章回溯法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
n=3时的0-1背包问题用完全二叉树表示的解空间
10
生成问题状态的基本方法
• 扩展结点:一个正在产生儿子的结点称为扩展结点 • 活结点:一个自身已生成但其儿子还没有全部生成的节点 称做活结点 • 死结点:一个所有儿子已经产生的结点称做死结点 • 深度优先的问题状态生成法:如果对一个扩展结点R,一 旦产生了它的一个儿子C,就把C当做新的扩展结点。在完 成对子树C(以C为根的子树)的穷尽搜索之后,将R重新 变成扩展结点,继续生成R的下一个儿子(如果存在) • 宽度优先的问题状态生成法:在一个扩展结点变成死结点 之前,它一直是扩展结点 • 回溯法:为了避免生成那些不可能产生最佳解的问题状态, 要不断地利用限界函数(bounding function)来处死那些 实际上不可能产生所需解的活结点,以减少问题的计算量。 具有限界函数的深度优先生成法称为回溯法
13
回溯法的基本思想(续)
(5)结点分支判定条件: 满足约束条件---分支扩张解向量 不满足约束条件,回溯到该结点的 父结点。 (6)结点状态:动态生成 白结点(尚未访问) 灰结点(正在访问该结点为根的子树) 黑结点(该结点为根的子树遍历完成) (7)存储:当前路径
14
回溯算法的适用条件
在结点<x1,x2,...,xk>处 P(x1, x2, …, xk) 为真 ⇔ 向量<x1, x2, …, xk > 满足某个性质 (n后中 k个皇后放在彼此不攻击的位置)
建模:城市集C={c1,c2,...,cn}, 距离 d(ci, cj)=d(cj, ci)∈Z+, 1≤i<j≤n 求:1,2, ..., n的排列 k1, k2, ..., kn使得
7
实例
8
搜索空间
排列树, 有(n-1)!片树叶
9
问题的解空间
• 问题的解向量:回溯法希望一个问题的解能够表示成一个n 元式(x1,x2,…,xn)的形式。 • 显约束:对分量xi的取值限定。 • 隐约束:为满足问题的解而对不同分量之间施加的约束。 • 解空间:对于问题的一个实例,解向量满足显式约束条件的 所有多元组,构成了该实例的一个解空间。 注意:同一个问题可以有多种表示,有些表示方法更简单, 所需表示的状态空间更小(存储量少,搜索方法简单)。
3
算法设计
解:n维0-1向量<x1, x2, ..., xn>, xi =1⇔物品 i 选入背包 结点:<x1, x2,..., xk>(部分向量) 搜索空间: 0-1取值的二叉树, 称为子集树, 有2n片树叶。 可行解:满足约束条件 的解 最优解:可行解中价值达到最大的解
4
实例
输入: V={12,11,9,8}, W={8,6,4,3}, B=13
不满足多米诺性质: 5x1+4x2−x3≤10⇏5x1+4x2≤10 变换使得问题满足多米诺性质: 令 x3 = 3 −x3', 5x1+ 4x2 + x3'≤ 13 1 ≤ x1, x2 ≤ 3, 0 ≤ x3'≤ 2
16
递归回溯
回溯法对解空间作深度优先搜索,因此,在一般情况下 用递归方法实现回溯法。 void backtrack (int t) { if (t>n) output(x); else for (int i=f(n,t);i<=g(n,t);i++) { x[t]=h(i); if (constraint(t)&&bound(t)) backtrack(t+1); } }
11
深度优先遍历和宽度优先遍历
深度优先遍历: 1→2→3→5→8→9 →6→7→4
宽度优先遍历: 1→2→3→4→5→6 →7→8→9
12
回溯法的基本思想
(1)适用:求解搜索问题和优化问题。 (2)搜索空间:树,结点对应部分解向 量,可行解在树叶上。 (3)搜索过程:采用系统的方法隐含 遍历搜索树。 (4)搜索策略:深度优先,宽度优先, 函数优先,宽深结合等。
第5章 回溯法
1
wk.baidu.com 回溯法
• 有许多问题,当需要找出它的解集或者要求回答什么 解是满足某些约束条件的最佳解时,往往要使用回溯 法。 • 回溯法的基本做法是搜索,或是一种组织得井井有条 的,能避免不必要搜索的穷举式搜索法。这种方法适 用于解一些组合数相当大的问题。 • 回溯法在问题的解空间树中,按深度优先策略,从根 结点出发搜索解空间树。算法搜索至解空间树的任意 一点时,先判断该结点是否包含问题的解。如果肯定 不包含,则跳过对该结点为根的子树的搜索,逐层向 其祖先结点回溯;否则,进入该子树,继续按深度优 先策略搜索。
¬P(x1,x2,…,xk)→¬P(x1,x2,…,xk+1) 0<k<n k 维向量不满足约束条件,扩张向量到 k+1维仍旧不满足,可以回溯。
15
一个反例
例 求不等式的整数解 5x1+4x2−x3≤10, 1≤ xk≤3, k=1,2,3 P(x1, …, xk) : 将 x1, x2, … , xk 代入原不等式 的相应部分,部分和小于等于10
2
例1:O/1背包
问题: 有n种物品,每种物品只有1个。第i种物品 价值为vi, 重量为wi ,i =1,2,…, n。问如何 选择放入背包的物品,使得总重量不超过 B,而价值达到最大? 实例: V={12,11,9,8}, W={8,6,4,3}, B=13
最优解: <0,1,1,1>,价值: 28,重量: 13
2个可行解:
<0,1,1,1>, 选入物品2,3,4,价值为28, 重量为13 <1,0,1,0>,选入物品1,3,价值为21, 重量为12
最优解: <0,1,1,1>
5
搜索空间
实例:V={12,11,9,8}, W={8,6,4,3}, B=13 搜索空间:子集树,2n片树叶
6
例2:货郎问题
问题:有n个城市,已知任两个城市之间的距 离,求一条每个城市恰好经过一次的回路, 使得总长度最小。
17
迭代回溯
采用树的非递归深度优先遍历算法,可将回溯法表示为一个非 递归迭代过程。 void iterativeBacktrack () { int t=1; while (t>0) { if (f(n,t)<=g(n,t)) for (int i=f(n,t);i<=g(n,t);i++) { x[t]=h(i); if (constraint(t)&&bound(t)) { if (solution(t)) output(x); else t++;} } else t--; } }