算法设计与分析第5章 回溯法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2013-5-24
算法设计与分析
6
• 例如:有一只中国象棋的马,在半张棋盘的左下 角出发,向右上角跳去。
楚河 马
汉界 马

马 马 马
2013-5-24 算法设计与分析

规定只许向 右跳,即可 上,可下, 但不允向左 跳!
7
分析
• 在算法设计策略中,回溯法是比贪心法和动态规划法更 一般的方法。 • 回溯法是一种通过搜索解空间树(状态空间树)来求问 题的可行解或最优解的方法。(最坏情况:穷举搜索)
2013-5-24 算法设计与分析 14
• 问题描述中给出用于判定一个候选解是否是可行 解的约束条件,满足约束条件的候选解称为可行 解。同时还给定一个数值函数称为目标函数,用 于衡量每个可行解的优劣。 • 约束条件可分成两类:显式约束和隐式约束。
2013-5-24
算法设计与分析
15
举例:0-1背包问题
2013-5-24 算法设计与分析 10
结论1:
• 对于一个解结构形式为n元组的问题,其可能 解构成了问题的解空间,可以用一颗解空间树 表示,树的所有叶子结点为可能解。
2013-5-24
算法设计与分析
11
回溯法的基本思想
• 回溯法又被称为“通用解题法” 。 • 回溯法在包含问题所有解的解空间树中,按深度优先策略, 从根结点出发搜索解空间树。 • 算法搜索至解空间树的任意一结点时,先判断该结点是否包 含问题的解。如果肯定不包含,则跳过对该结点为根的子树 的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续 按深度优先策略搜索。
• 使用剪枝函数的深度优先生成状态空间树中结 点的求解方法称为回溯法(backtracking); • 广度优先生成结点,并使用剪枝函数的方法称 为分枝限界法(branch-and-bound)。
2013-5-24
算法设计与分析
20
回溯法的递归形式的一般框架
Void RBacktrack(int k) { //以RBbacktrack(0)调用本函数 for(每个x[k],使得x[k] ∈T(x[0],…x[k-1]) && (Bk(x[0],…,x[k])) { if((x[0],x[1),…,x[k])是一个可行解) //判定是否为可行解 输出(x[0],x[1],…,x[k]); //输出可行解 RBacktrack(k+1); //深度优先进入下一层 } }
回溯法的时间性能分析
• 一般情况下,在问题的解向量X=(x0, x1, …, xn-1)中,分 量xi (0≤i<n)的取值范围为某个有限集合Si={ai1, ai2, …, airi}; • 问题的解空间由笛卡儿积A=S0×S1×…×Sn-1构成,并 且第1层的根结点有|S0|棵子树,则第2层共有|S0|个结点; 第2层的每个结点有|S1|棵子树,则第3层共有|S0|×|S1|个 结点。
1 1
A
0 1
B
0 1
0
C 0 G
0 1 0
D
1
E
0 1
F
H
201Βιβλιοθήκη Baidu-5-24
I
J
K
L
M
N
16
O
算法设计与分析
• 目标函数,也称代价函数(cost function)用来衡量每个可 行解的优劣,使目标函数取最大(或最小)值的可行解为问 题的最优解。 V = ∑ vi × xi
1 1 0 9 0 6 0 5 1 7 0 8 1 11 1 10 0
12
子集树!
2013-5-24 算法设计与分析 25
• 例如,对于n=3的0/1背包问题,三个物品的重量为{20, 15, 10},价值为{20, 30, 25},背包容量为25,从前图所 示的解空间树的根结点开始搜索,搜索过程如下:
1
1 2
0 9
1
0
1
0
6
1 0 8 不可行解 价值=20 1 11
2013-5-24
算法设计与分析
9
• 对于n=3的0/1背包问题,其解空间树如图所示,树 中的8个叶子结点分别代表该问题的8个可能解。
1 1 2 1 3 1 4 0 5 1 7 0 6 0 8 1 11 1 10 0 1 14 0 9 0
13
对物品1的选择
对物品2的选择
0 15
对物品3的选择
12
可能解(候选解)
2013-5-24 算法设计与分析 21
回溯法的迭代形式的一般框架
Void IBacktrack(int n) { int k=0; while(k>=0) { if(还剩下尚未检测的x[k]使得x[k]∈T(x[0],…x[k-1]) && (Bk(x[0],…,x[k])) { if((x[0],x[1],…,x[k])是一个可行解) //考虑x[k]的下一个可取值 输出(x[0],x[1],…,x[k]); k++; //考虑下一层分量 } else k--; //回溯到上一层 } } 2013-5-24 22 算法设计与分析
• 依此类推,第n层共有|S0|×|S1|×…×|Sn-1|个结点,它们 都是叶子结点,代表问题的所有可能解。
2013-5-24
算法设计与分析
23
两种典型的解空间树
• 子集树(Subset Trees):当所给问题是从n个元素的集合 中找出满足某种性质的子集时,相应的解空间树称为子集 树。在子集树中,|S0|=|S1|=…=|Sn-1|=c,即每个结点有相同 数目的子树,通常情况下c=2,所以,子集树中共有2n个叶 子结点,因此,遍历子集树需要O(2n)时间。 • 排列树(Permutation Trees):当所给问题是确定n个元 素满足某种性质的排列时,相应的解空间树称为排列树。 在排列树中,通常情况下,|S0|=n,|S1|=n-1,…,|Sn-1|=1, 所以,排列树中共有n!个叶子结点,因此,遍历排列树需 要O(n!)时间。
结论2:
• 回溯法是一种按深度优先策略,从根结点出发搜 索解空间树的穷举式搜索法。
• 为了提高搜索效率,则需要按照某种策略,能避 免不必要搜索过程。
– 放弃当前候选解(放弃搜索该候选解为根的子树), 寻找下一个候选解(搜索该候选解兄弟为根的子树) 的过程称为回溯。 – 扩大当前候选解的规模(继续向下搜索该候选解的子 孙),以继续试探的过程称为向前试探。
2013-5-24 算法设计与分析 24
• 对于n=3的0/1背包问题,其解空间树如图所示,树 中的8个叶子结点分别代表该问题的8个可能解。
1 1 2 1 3 1 4 0 5 1 7 0 6 0 8 1 11 1 10 0 1 14 0 9 0 3 0 15
对物品3的选择 对物品2的选择 对物品1的选择
2013-5-24
算法设计与分析
18
结论3:
• 结点的状态分为:活结点、扩展结点和死结点。
• 叶子结点为可能解,最终的问题解来自于从根到 某个叶子结点(解状态)的路径。
2013-5-24
算法设计与分析
19
• 约束函数和限界函数的目的相同,都是为了剪 去不必要搜索的子树,减少问题求解所需实际 生成的状态结点数,它们统称为剪枝函数 (pruning function)。
• 回溯法通过使用约束函数和限界函数来压缩需要实际生 成的状态空间树的结点数,从而大大节省问题求解时间。
2013-5-24
算法设计与分析
8
5.1 回溯法的算法框架
• 处理一个复杂的问题,常常会有很多可能解,这些可能解 构成了问题的解空间。解空间也就是进行穷举的搜索空间, 所以,解空间中应该包括所有的可能解。 • 举例:0-1背包问题。对于有n=3个物品的0/1背包问题,其 可能解的表示方式可以为: – 可能解由一个等长向量{x1, x2, …, xn}组成,其中 xi=1(1≤i≤n)表示物品i装入背包,xi=0表示物品i没有装入 背包,当n=3时,其解空间是:{(0, 0, 0), (0, 0, 1), (0, 1, 0), (1, 0, 0), (0, 1, 1), (1, 0, 1), (1, 1, 0), (1, 1, 1) }
2013-5-24
算法设计与分析
4
问题的形式化描述
• 此问题的形式化描述为,给定c>0,wi>0,vi>0,1≤i≤n,要 求找出一个n元0-1向量 (x1,x2, .. ,xn),其中xi∈{0,1},使 得对wixi求和小于等于c ,并且对vixi求和达到最大。 • 因此,0-1背包问题是一个特殊的整数规划问题。 此时问题的解结构为一个n元组 (n元一维向量),而每个解分量 xi取自有限集合Si。 Si={0,1}则, |Si|=2,如果用穷举法求解问题则 需要分析2n种可能的情况,该算法 的时间复杂度为O(2n)。
• 例如,0-1背包问题。
2013-5-24
算法设计与分析
3
回顾:0-1背包问题
• 给定n种物品和一个背包。物品i的重量是wi,其价值为vi, 背包的容量为c。应如何选择装入背包的物品,使得装入 背包中物品的总价值最大? • 在选择装入背包中的物品时,对每种物品i只有两种选择: 即装入或不装入背包。不能将物品i装入背包多次,也不 能只装入部分的物品i。因此,该问题称为0-1背包问题。
2013-5-24
算法设计与分析
12
0-1背包问题的解空间
1 1
A
0 1
B
0 1
0
C 0
G
0 1 0
D
1
E
0 1
F K L M N
H
I
J
O
–回溯法在求问题所有解时,要回溯到根,且根结点的所 有子树都要被遍历。 –回溯法在求问题任一解时,只要搜索到问题的一个解就 可以结束。
2013-5-24 算法设计与分析 13
2013-5-24
算法设计与分析
27
4皇后问题举例
☻ ☻ ☻ ☻
算法设计与分析
一个布局!
2013-5-24
28
N皇后问题
• 显然,棋盘的每一行上可以而且必须摆放一个皇后, 所以,n皇后问题的可能解用一个n元向量X=(x0,x1, …, xn-1)表示,其中,0≤i<n并且0≤xi<n,即第i个皇后放在 第i行第xi列上。
• 可能解由一个等长向量{x1, x2, …, xn}组成,其中xi=1(1≤i≤n) 表示物品i装入背包,xi=0表示物品i没有装入背包。 • 当n=3时,其解空间是:{(0, 0, 0), (0, 0, 1), (0, 1, 0), (1, 0, 0), 显式约束 (0, 1, 1), (1, 0, 1), (1, 1, 0), (1, 1, 1) }
算法设计与分析 5
m ax v i x i
i 1
n
n w i x i c i 1 xi {0,1}, 1 i n
2013-5-24
回溯法介绍
• 回溯法的基本思想:“试探着走”。如果试得不成功退 回一步,再换一个方法试。反复进行这种试探性选择与 返回纠错过程,直到求出问题的解为止。 • 例如:有一只中国象棋的马,在半张棋盘的左下角出发, 向右上角跳去。若规定只许向右跳(可上,可下,但不 允向左跳),编一个程序,求出从起点A到终点B共有 多少种不同跳法,并打印出跳动路线。
10 0 12 1 14
13
0 15
价值=55 价值=30 价值=25 价值=0
2013-5-24
算法设计与分析
26
5.5 N后问题
• 八皇后问题:在8×8的棋盘上摆放八个皇后, 使其不能互相攻击,即任意两个皇后都不能处 于同一行、同一列或同一斜线上。
• n皇后问题,即在n×n的棋盘上摆放n个皇后, 使任意两个皇后都不能处于同一行、同一列或 同一斜线上。 • 简化问题:4皇后问题。
13
对物品1的选择
2
1 3 1 4
对物品2的选择
0
12
1 14
0 15
对物品3的选择
最优解
2013-5-24 算法设计与分析
可行解
17
• 如果所求解的是最优化问题,还必须用目标函数衡量每个 答案结点,从中找出使目标函数取最优值的最优答案结点。 • 扩展结点:一个正在产生儿子的结点称为扩展结点。 • 活结点:一个自身已生成但其儿子还没有全部生成的结点 称做活结点。 • 死结点:一个所有儿子已经产生的结点称做死结点。 • 回溯法:为了避免生成那些不可能产生最佳解的问题状态, 要不断地利用限界函数(隐式约束)来处死那些实际上不 可能产生所需解的活结点,以减少问题的计算量。
第5章 回溯法
第5章 回溯法
学习要点
• 理解回溯法的深度优先搜索策略 • 掌握用回溯法解题的算法框架 – 子集树算法框架、排列树算法框架
• 通过应用范例学习回溯法的设计策略
– n后问题、0-1背包问题、旅行售货员问题
2013-5-24
算法设计与分析
2
前提
• 对于一个解结构形式为n元组的问题,如果解的每个分 量xi取自一个有限集Si,可以使用穷举法求解。 • 设| Si |=m,穷举法求解的最坏情况时间复杂度可达 O(mn)。
相关文档
最新文档