第五章回溯法

合集下载

第5章-回溯法-New剖析

第5章-回溯法-New剖析

第5章 回溯法
回溯法的基本思想
回溯法是带优化的穷举法。 回溯法的基本思想:在一棵含有问题全部可 能解的状态空间树上进行深度优先搜索,解为叶 子结点。搜索过程中,每到达一个结点时,则判 断该结点为根的子树是否含有问题的解,如果可 以确定该子树中不含有问题的解,则放弃对该子 树的搜索,退回到上层父结点,继续下一步深度 优先搜索过程。 在回溯法中,并不是先构造出整棵状态空间 树,再进行搜索,而是在搜索过程中逐步构造出 状态空间树,即边搜索,边构造。
}
遍历排列树需要O(n!)计算时间
第5章 回溯法
八皇后问题
是一个古老而著名的问题。该问题是十九 世纪著名的数学家高斯1850年提出。 在8X8格的国际象棋上摆放八个皇后,使 其不能互相攻击,即任意两个皇后都不能 处于同一行、同一列或同一斜线上,问有 多少种摆法。 高斯认为有76种方案。1854年在柏林的 象棋杂志上不同的作者发表了40种不同的 解,后来有人用图论的方法解出92种结果。
第5章 回溯法
第5章 回溯法
引入问题
回溯是重要的算法之一 要求找到一组解,或要求找到一个满足某些限制 的最优解。 ->通过彻底的搜索方法来解决。
*彻底搜索的运算量很大,有时大到计算机承受 不了的程度。
*彻底的搜索,以进行大量的比较、舍弃、运算 时间为代价。因此,用穷举法解某些实际问题是不 现实的. ->使用回溯法可以大大减少实际的搜索。例如,迷 宫问题,八皇后问题,骑士周游世界问题。
第5章 回溯法
N皇后问题
[问题描述] 在N*N的棋盘上,放置N个皇后,要求每 一横行,每一列,每一对角线上均只能放置一个皇后, 求可能的方案及方案数。
问题的状态即棋盘的布局状态,状态空间树的根为空 棋盘,每个布局的下一步可能布局为该布局结点的子 结点;

回溯法

回溯法

西安邮电大学计算机学院
第5章 回溯法
以示例图为例,当 n = 4 时,假定驻地为节点 1,则旅行售货员问题的解空间是:
{ ( 1,2,3,4,1 )、 ( 1,2,4,3,1 )、 ( 1,3,2,4,1 )、 ( 1,3,4,2,1 )、 ( 1,4,2,3,1 )、 ( 1,4,3,2,1 ) },共有(4 - 1)!= 3!= 6 种可能。 当节点数为 n 时,有 (n - 1)!种可能的解(这是一个排列问题)。
计算机科学的先驱、英国科学家阿兰· 麦席森· 图灵
第5章 回溯法
回溯法以深度优先的方式搜索解空间。如果回溯法在执行过程
中判断解空间树的某个节点不包含问题的解时,则跳过对以 该节点为根的子树的搜索(子树中一定不会包含问题的解), 逐层向其祖先节点回溯;否则进入该子树,继续按深度优先策 略搜索。这也是“回溯法”名称的由来。
西安邮电大学计算机学院
第5章 回溯法
5.1.4 迭代回溯
采用树的非递归深度优先遍历算法,可将回溯法表示为一个非递归迭代过程。 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--; } 回溯法
(2)解空间结构 定义了问题的解空间后,还应将解空间很好地组织起来,使得能用回溯法方便地 搜索整个解空间。通常将解空间组织成树或图的形式。如果将解空间组织成树的

第五章 回溯法

第五章  回溯法
2
5.1 回溯法的算法框架
本节介绍回溯法算法框架的有关问题: 一、问题的解空间 二、回溯法的基本思想 三、递归回溯 四、迭代回溯 五、子集树与排列树
3
一、问题的解空间
应用回溯法解问题时,首先应明确定义问题的解空间。问题 的解空间应至少包含问题的一个(最优)解。
问题的解向量:回溯法希望一个问题的解能够表示成一个n元式 (x1,x2,…,xn)的形式。 显约束:对分量xi的取值限定。 隐约束:为满足问题的解而对不同分量之间施加的约束。 解空间:对于问题的一个实例,解向量满足显式约束条件的所有多 元组,构成了该实例的一个解空间。 注意:同一个问题可以有多种表示,有些表示方法更简单,所需表 示的状态空间更小(存储量少,搜索方法简单)。
9
五、子集树与排列树

遍历子集树需O(n!)计算时间 void backtrack (int t) { if (t>n) output(x); else for (int i=t;i<=n;i++) { x[t]=i; if (legal(t)) backtrack(t+1); } }
6
示例1 0-1背包问题
n=3, C=30, w={16, 15, 15}, v={45, 25, 25}
开始时,Cr=C=30,V=0,A为唯一活结点,也是当前扩展结点 扩展A,先到达B结点 Cr=Cr-w1=14,V=V+v1=45 r 此时A、B为活结点,B成为当前扩展结点 扩展B,先到达D • Cr<w2,D导致一个不可行解,回溯到B 再扩展B到达E • E可行,此时A、B、E是活结点,E成为新的扩展结点 • 扩展E,先到达J 1 1 r • Cr<w3,J导致一个不可行解,回溯到E • 再次扩展E到达K r • 由于K是叶结点,即得到一个可行解x=(1,0,0),V=45 • K不可扩展,成为死结点,返回到E • E没有可扩展结点,成为死结点,返回到B B没有可扩展结点,成为死结点,返回到A 2 2 A再次成为扩展结点,扩展A到达C r 2 r Cr=30,V=0,活结点为A、C,C为当前扩展结点 r 扩展C,先到达F • Cr=Cr-w2=15,V=V+v2=25,此时活结点为A、C、F,F成为当前扩展结点 • 扩展F,先到达L • Cr=Cr-w3=0,V=V+v3=50 • L是叶结点,且50>45,皆得到一个可行解x=(0,1,1),V=50 • L不可扩展,成为死结点,返回到F • 再扩展F到达M r 3 r 3 • M是叶结点,且25<50,不是最优解 • M不可扩展,成为死结点,返回到F r • F没有可扩展结点,成为死结点,返回到C 再扩展C到达G • Cr=30,V=0,活结点为A、C、G,G为当前扩展结点 • 扩展G,先到达N,N是叶结点,且25<50,不是最优解,又N不可扩展,返回到G • 再扩展G到达O,O是叶结点,且0<50,不是最优解,又O不可扩展,返回到G • G没有可扩展结点,成为死结点,返回到C C没有可扩展结点,成为死结点,返回到A A没有可扩展结点,成为死结点,算法结束,最优解X=(0,1,1),最优值V=50

第5章 回溯算法

第5章   回溯算法

第5章 回溯算法
当我们确定了解空间的组织结构以后,回溯算法便可以 从起始结点(根结点)出发,以深度优先方式搜索整个 解空间。于是,这个起始结点既成为活结点,同时又成 为当前的扩展结点。在当前的扩展结点处,搜索过程就 向着纵深方向移动到一个新的结点,而这个新的结点就 成为当前的一个新的活结点,并且成为当前的扩展结点。 如果在当前的扩展结点处不能再向纵深方向移动,那么 当前的这个扩展结点就成为死结点。此时,就不能继续 纵深下去,应立即往回移动(这就是回溯)到最近的一 个活结点处,并且使得这个活结点成为当前的扩展结点。 回溯算法就是以这种方式递归地在解空间中进行不断地 搜索活动,直到找出所需要的解或者解空间中已经不再 有活结点时为止。
第5章 回溯算法
例如,当我们在求解0/1背包问题时,通常在使 用回溯算法的同时采用剪枝函数剪除导致不可行 解的子树。在使用回溯算法求解旅行商问题时, 如果从根结点到当前的扩展结点处的部分周游路 线的成本已经超过了当前找到的周游路线成本, 那么就可以判定以此结点为根结点的子树中不包 含最优解,因此,可以将该子树剪除。

迭代回溯


0/1背包问题
回溯算法求解的经典问题
装箱问题
最大通信团体问题
第5章 回溯算法
回溯算法具有通用的解题算法之称。使用回溯算法可
以系统地搜索一个问题的全部解或者其中的任意一个解。 回溯算法是一个既具有系统性,同时又具有跳跃性的搜 索算法。它在问题的解空间树中,往往可以根据深度优 先策略,由根结点出发依次搜索整棵解空间树。当回溯 算法在搜索到解空间树中的任意一个结点时,应首先判 断该结点是否包含原问题的解。如果包含,就直接进入 到该子树,并且继续按照深度优先策略搜索问题的解; 如果不包含,那么就跳过对以此结点为根结点的子树的 搜索,并且依次逐层向其祖先结点回溯。当我们使用回 溯算法求一个问题的全部解时,通常要回溯到解空间树 的根结点,并且当根结点的所有子树都已经被搜索或者 遍历了一遍之后方能结束。然而,如果当只需要使用回 溯算法求问题的一个解时,通常只需要搜索到问题的一 个解就可以结束。这种以深度优先系统搜索问题的解的 算法称为回溯算法,它适用于求解数据规模比较大的问 题。

第5章 回溯法

第5章  回溯法
a(1)*m2*m3+a(4)*m1*m3=a(7)*m1*•m2成立。
设置中间变量g:先赋值g=1;若出现某两数字相同(即 a(i)=a(k))或a(1)>a(4),则赋值g=0(重复标记)。 首先从a(1)=1开始,逐步给a(i)(1≤i≤9)赋值,每一 个a(i)赋值从1开始递增至9。直至a(9)赋值,判断: 若i=9,g=1,a(1)*m2*m3+a(4)*m1*m3=a(7)*m1*m2•同时 满足,为一组解,用n统计解的个数后,格式输出这组解。 若i<9且g=1,表明还不到9个数字,则下一个a(i)从1开 始赋值继续。 若a(9)=9,则返回前一个数组元素a(8)增1赋值(此时, a(9)又从1开始)再试。若a(8)=9,则返回前一个数组元素 a(7)增1赋值再试。依此类推,直到a(1)=9时,已无法返 回,意味着已全部试毕,求解结束。
5.2 桥本分数式
案例提出:


日本数学家桥本吉彦教授于1993年10月在我国山东举行的中日美三 国数学教育研讨会上提出以下填数趣题:把1,2,„,9这9个数字填入 下式的9个方格中(数字不得重复),使下面分数等式成立:

□ □ □ ── + ── = ── □□ □□ □□
桥本教授当即给出了一个解答。这一填数趣题的解是否唯一?如果 不唯一究竟有多少个解?试求出所有解答 (等式左边两个分数交换次 序只算一个解答)。•
(4) 回溯实现



回溯法的试探搜索,是一种组织得井井有条的、能避免一些不必 要搜索的枚举式搜索。回溯法在问题的解空间树中,从根结点出 发搜索解空间树,搜索至解空间树的任意一点,先判断该结点是 否包含问题的解;如果肯定不包含,则跳过对该结点为根的子树 的搜索,逐层向其父结点回溯;否则,进入该子树,继续搜索。 从解的角度理解,回溯法将问题的候选解按某种顺序进行枚举和 检验。当发现当前候选解不可能是解时,就选择下一个候选解。 在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回 溯。若当前候选解除了不满足问题规模要求外,满足所有其他要 求时,继续扩大当前候选解的规模,并继续试探。如果当前候选 解满足包括问题规模在内的所有要求时,该候选解就是问题的一 个解。 通过例5-1“4皇后问题的回溯”理解回溯过程的实现。

第五章 回溯法

第五章  回溯法

• Cr=C=30,V=0
C为容量,Cr为剩余空间,V为价值。 • A为唯一活结点,也是当前扩展结点。
H D 1 0 I 1
1 B 0 E 1 0 J K
A
0 C 1 F 1 0 L M N 0 G 1 0 O
5.1 回溯法的算法框架
• n=3, C=30, w={16,15,15}, v={45,25,25}
理论上
寻找问题的解的一种可靠的方法是首先列出所有候选解,然后依次检查每一个, 在检查完所有或部分候选解后,即可找到所需要的解。
但是
当候选解数量有限并且通过检查所有或部分候选解能够得到所需解时,上述方
法是可行的。
若候选解的数量非常大(指数级,大数阶乘),即便采用最快的计算机也只能 解决规模很小的问题。
显约束
对分量xi的取值限定。
隐约束 为满足问题的解而对不同分量之间施加的约束。
5.1 回溯法的算法框架
解空间(Solution Space)
对于问题的一个实例,解向量满足显式约束条件的所有多元组,构成了该 实例的一个解空间。 注意:同一问题可有多种表示,有些表示更简单,所需状态空间更小(存储 量少,搜索方法简单)。
回溯法引言
以深度优先的方式系统地搜索问题的解的算法称为回溯法 使用场合
对于许多问题,当需要找出它的解的集合或者要求回答什么解是满足某些
约束条件的最佳解时,往往要使用回溯法。 这种方法适用于解一些组合数相当大的问题,具有“通用解题法”之称。 回溯法的基本做法 是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。
一个正在产生儿子的结点称为扩展结点
活结点(L-结点,Live Node)
一个自身已生成但其儿子还没有全部生成的节点称做活结点

第五章 回溯法1--基本概念--n后问题

第五章    回溯法1--基本概念--n后问题
1 6 4 3 20 4 3 30 5 A A 2 10 2 1
B
3 4
C
4 G G 3 M M 2 H H 4 N N
D D
4 26>25 2 I I 3 P P 2 J J
E
3
图1 四个顶点的带权图
F
4 L L 59
K
2 Q Q
O
60+6>59 25
第五章 回溯法
19+6=25 29+30>25
活结点 当前扩展结点 死结点 D B 1 A
0 1 F 0
K
45
1
0
E
C 0 G 0 1 N
25
死结点 1
1
H
0
I
1
J
0 O
0
4
L
50
M
25
图5-2 在0-1背包问题的解空间树上搜索最优解
第五章 回溯法
例2:旅行售货员问题:某售货员要到若干城市推销商 品,已知各城市间的路程(或旅费)。他要选一条从 驻地出发,经过每个城市一遍,最后回到驻地的路线 使总的路程(总的旅费)最小。
第五章 回溯法 2
2. 解空间树
通常把解空间组织成解空间树。 例如:对于n=3时的0-1背包问题,其解空间用一 棵完全二叉树表示,如下图所示。
1
A
0
B
1 0 1
C
0
D 1 H
0 1
E
0
F
1 0 1
G
0
I
J
K
L
M
N
O
0-1背包问题的解空间树
第五章 回溯法
3
3. 搜索解空间树的过程

第五部分 回溯法

第五部分 回溯法

1
装载问题
• 有一批共n个集装箱要装上2艘载重量分别为c1和c2 n 的轮船,其中集装箱i个重量为wi,且 ∑ wi ≤ c1 + c2 • 装载问题要求确定,是否有一个合理的装载方案 可将这n个集装箱装上这2艘轮船。如果有,找出 n 2 一种装载方案。
– 例如,当n=3, c1=c2=50, 且w=[10,40,40]时,则可以将集 装箱1和2装到第一艘轮船上,而将集装箱3装到第二艘 轮船上;如果w=[20,40,40],则无法将这3个集装箱都装 上轮船。
• 限界函数
– 例如,c=7, w=[3, 5, 2, 1], v=[9, 10, 7, 4] 。v/w=[3, 2, 3.5, 4]。以物品单位重量价值的递减序装入物品。装入物品 4、3、1后,只能装入0.2的物品2,由此得到一个解 Bound (i) x=[1, 0.2, 1, 1],其相应的价值为22。尽管这个解不是一 //计算上界 个可行解,但其价值是最优值的一个上界,即对于该 cleft = c - cw // 剩余容量 问题,最优值不超过22。 bound = cp //以物品单位重量价值递减序装入物品 while i <= n and w[i] <= cleft O(n) cleft = cleft - w[i] bound = bound + p[i] i++ //装满背包 if i <= n bound = bound + p[i] / w[i] * cleft return bound
• • • •
活结点:自身已生成但其儿子结点还未全部生成的结点 扩展结点:当前正在处理的结点 死结点:所有儿子已经生成 叶结点:可行解 0-1背包:w=[16,15,15], v=[45,25,25], c=30

第5章 回溯法

第5章 回溯法
◎四川师范大学 计算机科学学院 刘芳 27
算法设计与分析<<回溯法
小结
回溯法解题的特征
在深度优先搜索过程中动态产生问题的解空间。 几个术语
扩展结点:一个正在产生儿子的结点称为扩展结点 活结点:一个自身已生成但其儿子还没有全部生成的
结点称做活结点 死结点:一个所有儿子已经产生的结点称做死结点。
有限集, 设已有满足约束条件的部分解(x1, x2,… xi)添 加xi+1 si+1,
若(x1, x2,… xi xi+1)满足约束条件, 则继续添加xi+2 ; 若所有可能的xi+1 si+1均不满足约束条件,则去掉xi ,
回溯到(x1, x2,… xi-1), 添加尚未考虑过的xi;
回溯法 分支限界法
◎四川师范大学 计算机科学学院 刘芳 3
算法设计与分析<<回溯法
问题的解空间
问题的解向量:
问题的解可以表示成一个n元式(x1, x2,… xn)的形式。
问题的解空间
E={(x1, x2,… xn)| xi si , si为有限集 }称为问题的解空

约束条件
分析:
可能解由一个等长向量(x1, x2, …, xn)组成, 其中 如:
xi=1(1≤i≤n)表示物品i装入背包 xi=0(1≤i≤n)表示物品i没有装入背包 当n=3时,其解空间是:
{ (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1) }
骤,而每一个步骤都有若干种可能的分支,为了完成 这一过程,又必须遵守一些规则,

[计算机软件及应用]第5章算法分析回溯法ppt课件

[计算机软件及应用]第5章算法分析回溯法ppt课件

• template<typename Type>
• void Loading<Type>::Backtrack(int i) //搜索第i层结点
•{
Байду номын сангаас
• if(i>n) //到达叶结点
•{

if(cw>bestw)

bestw=cw;

return;
•}
• if(cw+w[i]<=c) //进入左子树,x[i]=1
•{

cw+=w[i];

Backtrack(i+1); //继续搜索下一层

cw-=w[i]; //退出左子树
•}
• Backtrack(i+1); //进入右子树,x[i]=0
•}
template<typename Type> Type MaxLoading(Type w[],Type c,int n) //前往最优载分
A
1
0
B
1
0
C
1
0
D
1
0
E
1
0
F
1
0
G
1
0
H
I
J
K
L
M
N
O
• template<typename Type> • class Loading •{ • template<typename T> • friend T MaxLoading(T [],T,int);
• private: • void Backtrack(int i); • int n; //集装箱数 • Type *w; //集装箱分量数组 • Type c; //第1艘轮船的载分量 • Type cw; //当前载分量 • Type bestw; //当前最优载分量 • };

第5章 回溯法

第5章 回溯法
30 A 5 6 B
4
C 20 D
10
求赋权图G 的具有最小 权 的 Hamilton圈
B
C D B
C
D B
D
C
D
C
D
B
C
B
A
5
5.1回溯法的算法框架—基本思想
例2.定和子集问题:
已知一个正实数的集合 A={w1,w2,……wn},和正实数M.试求A的所有子集S,使得S中 的数之和等于M。 这个问题的解可以表示成0/1数组{x1,x2,……xn},依据w1是 否属于S,x1分别取值1或0。故解空间中共有2n个元素。它的树 1 结构是一棵完全二叉树。
7
5.1回溯法的算法框架—基本思想
从例3来看,解空间的确定与我们对问题的描述有关。 如何组织解空间的结构会直接影响对问题的求解效率。这是 因为回溯方法的基本思想是通过搜索解空间来找到问题的可 行解以至最优解。 当所给的问题是从n个元素的集合S中找出满足某种性质 的子集时,相应的解空间树称为子集合树。此时,解空间有 2n 个元素,遍历子集树的任何算法均需Ω(2n)的计算时间。 如例2。 当所给的问题是确定n个元素的满足某种性质的排列时, 相应的解空间树称为排列树,此时,解空间有n!个元素。遍 历排列树的任何算法均需Ω(n!)计算时间,如例1和例3。本 章只讨论具有上两类解空间树的求解问题。
11
5.1回溯法的算法框架—递归回溯
回溯法对解空间作深度优先搜索,因此,在一般情况下 用递归方法实现回溯法。 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); } } f(n,t)和g(n,t)分别表示在当前扩展结点处未搜索过子 树的起始编号与终止编号,h(i)表示当前扩展结点处x[t]的 第i个可选值。

(算法分析设计)第5章回溯法

(算法分析设计)第5章回溯法
展结点就成为死结点。此时,应往回移动(回溯)到最近
的活结点处,并使该结点成为当前的扩展结点。
– 回溯法按上述方式递归地在解空间中搜索,直到找到所 要求的解或解空间中无活结点为止。
7
实例分析
• n=3的0-1背包问题
– w=[16,15,15] – p=[45,25,25] – c=30
8
解空间为:
• 问题的解空间 • 回溯法的基本思想 • 递归回溯 • 迭代回溯 • 子集树与排列树
4
问题的解空间
• 解空间
– 应明确问题的解空间的定义
• 问题的解空间至少应包含问题的一个(最优解)。
– 对问题解空间进行组织
• 通常组织为树或图的形式。 ——有利于回溯法对整个解空间的搜索
5
知识点
• 问题的解空间 • 回溯法的基本思想 • 递归回溯 • 迭代回溯 • 子集树与排列树
backtrack(t+1);
32
旅行商问题(TSP)
1 6
30 2
5 10
4


20
4顶点的无向带权图

1

23
4


3
42
4

2
3
F G H IJ K
4
3
4
23
2
L M N OP Q
n=4的TSP问题的解空间树(排列树)
33
排列树
• 排列树
– 当所给问题是确定n个元素满足某种性质的排 列时,相应的解空间树被称为排列树.
的子树不可能包含更优的解,剪去。
46
#include <iostream.h> #include <iomanip.h> const int n=4; //图的顶点数

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

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

{
}
//形参t表示递归深度,n是问题规模 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); }
2.回溯法的基本思想 例1: 0-1背包
• 由于从K已无法纵深扩展,故K成为一个 死结点,所以返回(回溯)至E(离K最 近的一个活结点)。 • 而E也没有可扩展的结点,也成为了死 结点。接下来,再继续回溯,返回至B 处,同样B也成为死结点。再返回 A,从 A可扩展移至C。 • 从A移至C,r=30,获取价值0。
• 如,对于有n个可选择物品的0-1背包问题, 其解空间由长度为n的0-1向量组成。 • 对于n元式(x1,x2,…,xn)形式的解: • 对分量xi的取值约束条件, xi=0 or 1。
7
5.1 回溯法的算法框架
1.问题的解空间
• 解空间:对于问题的一个实例,满足约 束条件的所有多元组(解向量),构成了 该实例的一个解空间。
全部生成的节点称做活结点。 • 扩展结点:一个正在产生儿子的结点称为 扩展结点。
12
5.1 回溯法的算法框架
2.回溯法的基本思想
• 在当前扩展结点处,搜索向纵深方向移 至一个新结点。这个新结点就成为一个 新的活结点,并成为当前扩展结点。 • 如果在当前扩展结点处不能再向纵深方 向移动,则当前扩展结点就成为死结点。 • 死结点:一个所有儿子已经全部产生的结
21
2.回溯法的基本思想 例2: 旅行售货员问题
• 设G=(V,E)是一个带权图。图中各边的费 用(权)为一正数。图中一条周游路线是 包括V中每个顶点在内的一条回路。其费 用就是该路线上所有边的费用总和。 • 所谓旅行售货员问题就是要在图G中找出 一条有最小费用的周游路线。

第5章回溯法

第5章回溯法

若仅输出
113,则程序段如下: 111 112 113,则程序段如下:
t=1; a[t]=0; do a[t]=a[t]+1; if(t==3) // 找到一种排列,则输出 找到一种排列,
输出a[1],a[2],a[3] 输出 else { ++t; a[t]=0; } //继续向前搜索 继续向前搜索 while (a[3]!=3)
} 上界函数: 上界函数:cw+r 当走到以Z为根的子树时, 当走到以Z为根的子树时,若cw+r < bestw,则可以剪 去Z的右子树
构造最优解 {♦ if (i>n) ♦
P147
void backtrack( int i ) { if(cw >bestw) return; } { bestw=cw; bestx[1:n] ←--- x[1:n]; }
bestw:目前已找到的最优载。 bestw:目前已找到的最优载。 目前已找到的最优载 。。重量 。。重量
O(2n)
♦ backtrack( i +1); //搜索右子树 搜索右子树
引入上界函数,剪去不含最优解的子树) 优化算法二(引入上界函数,剪去不含最优解的子树)
P146
void backtrack( int i ) {♦ if (i>n) ♦ { if (cw>bestw) bestw=cw; return; } ♦ r-=w[i]; //进入本层前,先计算剩余未判断的物品重量 进入本层前, 进入本层前 ♦ if (cw+w[i]<C) //搜索左子树 搜索左子树 { cw+=w[i]; backtrack( i +1); cw-=w[i]; } r:还 r:还未判断的物品重量和

回溯法 ppt课件

回溯法 ppt课件

回溯法举例:
[旅行商问题] 在这个问题中 ,给出一个n 顶点网络(有向 或无向) ,要求找出一个包含所有n 个顶点的具有最小耗 费的环路 。任何一个包含网络中所有n 个顶点的环路被称 作一个旅行(t o u r )。在旅行商问题中 ,要设法找到一 条最小耗费的旅行。 [分析]图给出了一个四顶点网络 。在这个网络中 ,一些旅
Bound(t) : 返回的值为true时 , 在当前扩展节点处 x[1: t]的取值为时 目标函数越界 , 还需由Backtrack(t+1) 对其相应的子树做进一步搜索 。否则 , 当前扩展节点处 x[1: t]的取值是目标函数越界 ,可剪去相应的子树
for循环作用: 搜索遍当前扩展的所有未搜索过的 子树。
si+1均不满足约束条件,则去掉xi , 回溯到(x 1 , x 2 , … xi-1), 添加尚 未考虑过的xi , 如此反复进行,直到(x1 , x2 , … xk) k n满足所有的 约束条件或证明无解.
E= { (x1 , x2 , … xn), xi si , si为有限集 }称为问题的解空间.
5. 1 回溯法基本思想
穷举法技术建议我们先生成所有的候选解 , 然后找出那个 具有需要特性的元素
1 、 回溯法主要思想是每次只构造解的一个分量 ,然后按照 鲜明的方法来评估这个部分构造解 。如果一个部分构造解可以进一 步构造而不会违反问题的约束 , 我们就接受对下一个分量所作的第 一个合法选择 。如果无法对下一个分量进行合法的选择 , 就不对剩 下的任何分量再做任何选择了 。在这种情况下 ,该算法进行回溯 , 把部分构造解的最后一个分量替换为它的下一个选择。
算法模式 Procedure BACKTRACK (n); {k := l;

第5章(5.3回溯算法)

第5章(5.3回溯算法)
1、问题提出 已知n个物体重量为:w1、w2… n个物体价值为:p1、p2… 背包载重为:M
两类背包问题:
①普通背包问题(贪心算法) 物体i可以部分的装入背包,若物体i的一部分xi装入 背包,则装入的重量为wi*xi,装入的价值为pi*xi; ②0-1背包问题(回溯算法) 每一件物体不能分割,要么全部放入,要么全部不 放入,称为0-1背包问题;
void backtrack (int t) { if (t>n) output(x); else for (int i=t;i<=n;i++) { swap(x[t], x[i]); if (legal(t)) backtrack(t+1); swap(x[t], x[i]); } }
补充: 0-1背包问题
x[2]=1 19
x[2]=4 x[2]=3 24 29
13
x[3]=2 x[3]=3

… …
x[3]=4 9 11
x[3]=3 x[3]=1 x[3]=1 x[3]=3 x[3]=4 x[3]=4
14
16
20
x[3]=4
22
25
27
30
32
x[4]=4
x[4]=3 x[4]=4 x[4]=3 x[4]=3
例5-5: n皇后问题
4、算法描述 对于n皇后问题的解空间共有nn个叶子节点,最多 有n* nn个节点; 最坏的情况下每个节点都要用place函数判断是否 可行,每一个节点判断时间为O(n); 故该算法的时间复杂度记为O(n* n*nn)= O(nn+2)
5.3.4 满m叉树
• 当所给问题的n个元素中每一个元素均有m种选择, 要求确定其中的一种选择,使得对这n个元素的选择 结果组成的向量满足某种性质,即寻找满足某种特性 的n个元素取值的一种组合。 这类问题的解空间树称为满m叉树。 • 解的形式为n元组(x1,x2,……,xn),分量 xi(i=1,2,……,n)表示第i个元素的选择为xi

第5章回溯法

第5章回溯法

作业1 作业1
对于n 对于n×m的棋盘,从(1,1)开始是否存在 的棋盘,从(1,1)开始是否存在 一条不重复的跳完所有棋盘格的路径,若存 在请给出该路径的描述?对任意的n,m 在请给出该路径的描述?对任意的n,m 是否 总是存在这样一条路径?若不是,能否给出 其存在的充要条件?
B3 A2 A1 A B1 B2 C2 C1 D3 D2 E1 D1
跳马问题
5. 从C2出发,有四条路径可以选择,选择D4, C2出发,有四条路径可以选择,选择D4,
从D4出发又有两条路径,选择E1错误,返 D4出发又有两条路径,选择E1错误,返 回D4选择E2,从E2出发有两条路径,先 D4选择E2,从E2出发有两条路径,先 选择F1错误,返回E2选择B,而B 选择F1错误,返回E2选择B,而B恰好是 我们要到达的目标点,至此,一条路径查找 成功。
回溯算法(一)
什么是回溯
迷宫游戏
入口 回溯
回溯 回溯
什么是回溯法
回溯法是一个既带 有系统性又带有跳跃 性的的搜索算法 性的的搜索算法
索问题 回溯法是以深度优先的方式系统地搜索问题 出口 深度优先 的解, 它适用于解一些组合数较大的问题。 的解 它适用于解一些组合数较大的问题。
n皇后问题
既然回溯算法是由一个节点开始逐步扩展的, 因此我们采用把皇后一个一个的放到棋盘上 的方式来分析问题。
n皇后问题
首先要把第一个皇后放到棋盘上由于第一个皇后有 n列可以放,因此可扩展出n种情况。先选其中一列 列可以放,因此可扩展出n 放下这个皇后; 然后开始放第二个皇后。同样第二个皇后也有n 然后开始放第二个皇后。同样第二个皇后也有n列 可以放,因此也能扩展出n 可以放,因此也能扩展出n种情况,但第二个皇后 可能会和第一个皇后发生攻击,而一旦发生攻击, 就没有必要往下扩展第三个皇后,而如果没有发生 攻击,则继续放第三个皇后; 依此类推,直到n 依此类推,直到n个皇后全都放下后,即得到一组 可行解。 扩展全部完成后即可得到结果。

第5章 回溯法ppt课件

第5章 回溯法ppt课件

2x3=2
x3=4 x3=2 x3=3
3
5
x4=4 x4=3
8 x4=4
10 13 15 x4=2 x4=3 x4=2
4
6
9
11 14 16
迷宫问题
演示
5.1 回溯法的算法框架
问题的解空间〔1)
1. 解向量:问题的解用向量表示
(x1, x2, …, xk) 模。 2. 约束条件
子树; 5. (2)限界函数:某个函数表达式或关系式。 6. 不真时,用于剪去得不到最优解的子树。 7. 回溯法:具有限界函数的深度优先搜索方法
回溯法的基本思想
1. 以深度优先方式搜索解空间。 2. 开始时,根结点为活结点,也是当前的扩展结点。 3. 对扩展结点,寻找儿子结点: 4. 如找到新结点,新结点成为活结点并成为扩展
子集树 void backtrack (int t){
if (t>n) output(x); else
for (int i=0;i<=1;i++) { x[t]=i; if (legal(t)) //若合法 backtrack(t+1);
} }
排列树 void backtrack (int t){
if (t>n) output(x); else
1装载问题2批处理作业调度3n后问题401背包问题5最大团问题6图的m着色问题7旅行售货员问题n皇后问题国际象棋中的皇后在横向直向和斜向都能走步和吃子问在nn格的棋盘上如何摆上n个皇后而使她们都不能相互吃掉
第5章 回溯法
上海大学计算机学院
学习要点与要求
• 掌握与理解回溯法的DFS搜索策略与方法
• (1〕掌握递归回溯

《算法设计与分析》-第五章 回溯法

《算法设计与分析》-第五章 回溯法
回溯法的应用—n后问题 后问题
例1(8-皇问题)
皇问题) 例1(8-皇问题) ( 皇问题
在8×8的棋盘上放置8个皇后,使得这8个皇 后不在同一行,同一列及同一斜角线上.如下 1 2 3 4 5 6 7 8 图6.1: Q
1 2 3 4 5 6 7 8
Q Q Q Q Q Q Q
5.1 回溯法的基本思想
(1)解空间 设问题的解向量为X=(x1,x2,…,xn) ,xi的取值范 围为有穷集Si .把xi的所有可能取值组合,称 为问题的解空间.每一个组合是问题的一个可 能解.
5.1 回溯法的基本思想
(1)解空间 例:0/1背包问题,S={0,1},当n=3时,0/1背 包问题的解空间是: {(0,0,0),(0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1, 1,0),(1,1,1)} 当输入规模为n时,有2n种可能的解.
A 2 C 3 F 4 L 4 2 G H 3 4 M N 1 B 3 D
4 4 I 2 O E 2 J 3 P 3 K 2 Q
----排列树 解空间大小: n!
5.1 回溯法的基本思想
(3)状态空间树的动态搜索
可行解和最优解: 可行解:满足约束条件的解,解空间中的一个子集 最优解:使目标函数取极值(极大或极小)的可行解,一 个或少数几个 例:货郎担问题,有nn种可能解. n!种可行解,只有一个或 几个解是最优解. 例:背包问题,有2n种可能解,有些是可行解,只有一个或 几个是最优解. 有些问题,只要可行解,不需要最优解,例如八后问题.
5.1 回溯法的基本思想
回溯法(backtracking)是一种系统地搜索问 题解的方法.为实现回溯,首先需要定义一个 解空间(solution space),然后以易于搜索 的方式组织解空间,最后用深度优先的方法搜 索解空间,获得问题的解.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1 2 5 3 6 9 7 4

8
23
算法分析与设计
Analysis and Design of Algorithm
Lesson 12
要点回顾

回溯法设计要素

适用对象:求解搜索问题和优化问题 搜索空间:树,结点对应部分解向量,可行解在树叶上 搜索过程:采用系统的方法隐含遍历搜索树 搜索策略:深度/宽度优先、函数优先、宽深结合 结点分支判定条件:
回溯法设计思想和适用条件
回顾一下

深度与宽度优先搜索
1 2 3 5 6 9 7 4
深度优先访问顺序: 1→2→3→5→8→9→6→7→4 宽度优先访问顺序: 1→2→3→4→5→6→7→8→9
8
21
回溯法基本设计思想

适用对象:求解搜索问题和优化问题 搜索空间:树,结点对应部分解向量,可行解在树叶上 搜索过程:采用系统的方法隐含遍历搜索树 搜索策略:深度/宽度优先、函数优先、宽深结合 结点分支判定条件:
第五章 回溯法
2
学习要点

理解回溯法的深度优先搜索策略 掌握用回溯法解题的算法框架

递归回溯最优子结构性质 迭代回溯贪心选择性质 子集树算法框架 排列树算法框架 n后问题、0-1背包问题 、旅行售货员问题 装载问题 图的着色问题
3

通过应用范例学习回溯法的设计策略

回溯法概述
36
实例
W=<90, 80, 40, 30, 20, 12, 10> c1 =152, c2 =130 解: 可以装,方案如下: 1,3,6,7装第一艘船 2,4,5装第二艘船 时间复杂度:O(2n)
37
90 80 0 40 30 20 0 0 0 0 12 10
图的着色问题


输入:无向连通图G和m种颜色的集合,用 这些颜色给图的顶点着色,每个顶点一种 颜色。要求是: G 的每条边的两个顶点着 不同颜色。 输出:所有可能的着色方案。如果不存在 着色方案,回答“NO”
1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Sort(W) B←c1; best←c1; i←1 while i≤n do if 装入i后重量不超过c1 then B←B-wi; x[i]←1; i←i +1 else x[i]←0; i←i +1 if B<best then 记录解; best←B Backtrack(i) 回溯 if i=1 then return 最优解 else goto 3
32
装载问题
问题:有 n 个集装箱,需要装上两艘载重分别为 c1 和 c2 的 轮 船 。 wi 为 第 i 个 集 装 箱 的 重 量 , 且 w1+w2+...+wn≤c1+c2 。问是否存在一种合理的装载 方案把这n个集装箱装上船? 实例: W=<90, 80, 40, 30, 20, 12, 10> c1 =152, c2 =130 解:1,3,6,7装第一艘船,其余第2艘
作用:k维向量不满足约束条件,扩张向量到k+1维仍旧不 满足,可以回溯! 27
(例如:n后中k个皇后放在彼此不攻击的位置)


一个实例
例:求不等式的整数解 5x1+4x2-x3≤10, 1≤xk≤3, k=1,2,3
P(x1, x2, ..., xk):将x1, x2, ..., xk代入原不等式的相应部分,部 分和小于等于10

解:n维0-1向量<x1, x2, ..., xn> xi =1 物品i选入背包 结点:<x1, x2, ..., xk>(部分向量) 搜索空间:一棵0-1取值的二叉树,称为子 集树,有2n片树叶 可行解:满足约束条件(不超重)的解 最优解:可行解中价值达到最大的解
13


实例

输入:V={12,11,9,8}, W={8,6,4,3}, B=13 2个可行解:
问题:有n种物品,每种物品的重量和价值分别 为wi, vi。如果背包的最大承重限制是B,每种物 品至多放 1个。怎么样选择放入背包的物品使得 背包所装物品价值最大?
实例:V={12,11,9,8}, W={8,6,4,3}, B=13 最优解:<0,1,1,1>,价值:28,重量:13
12
算法设计
38
实例
1 6 2 6 1 2
7
7
5 4
3
5 4
3
n=7, m=3
39
解向量

设G=(V, E), V={1,2,...,n} 颜色编号:1,2, ... , m 解向量:<x1, x2, ..., xn>

xi {1,2,...,m} 表示只给顶点1,2,...,k着色的部分方案
回溯法


有许多问题,当需要找出它的解集或者要求回答什 么解是满足某些约束条件的最佳解时,往往要使用 回溯法。 回溯法的基本做法是搜索,或是一种组织得井井有 条的(带有系统性),能避免不必要搜索(带有跳跃性 )的穷举式搜索法。这种方法适用于解一些组合数相 当大的问题。
5
回溯问题的解空间

问题的解向量:回溯法希望一个问题的解能够表示 成一个n元向量(x1, x2,…, xn)的形式
29
回溯法的实现及实例
回溯法两种实现


递归实现
算法ReBack(k)
1. 2. 3. 4. 5. 6. if k>n then <x1, x2, ..., xn>是解 else while Sk ∅ do xk ← Sk中最值 Sk ← Sk-{xk } 计算Sk+1 ReBack(k+1)

B为当前空隙 best为最小空隙
35
子过程 Backtrack

算法Backtrack(i)
1. while i > 1 and x[i]=0 do 2. i←i-1 3. if x[i]=1 沿右分支一直回 4. then x[i]←0 溯发现左分支边 5. B←B+wi 或到根为止 6. i←i+1
10
搜索空间:4叉树
<1> <2> <3> <2,4> <2,4,1> <2,4,1,3> <4> 第1层代表第1个皇后 可能选择的列号
• 每个结点有4个儿子,分别代表选择1,2,3,4列位置 • 第i层选择解向量中第i个分量值 • 最深层的树叶是解 • 按深度优先次序遍历树,找到所有解
11
0-1背包问题

显约束:对分量xi的取值限定 隐约束:为满足问题的解而对不同分量之间施加的约束 解空间:对于问题的一个实例,解向量满足显式约束条 件的所有多元组,构成了该实例的一个解空间

注意:同一个问题可以有多种表示,有些表示方法 更简单,所需表示的状态空间更小(存储量少,搜索 方法简单)
6
回溯问题的解空间
不满足多米诺性质: 5x1+4x2-x3≤10 5x1+4x2≤10 变换使得问题满足多米诺性质:
令 x3=3-x3*,那么原不等式变换为 5x1+4x2+x3*≤13 1≤x1, x2≤3, 0≤x3*≤2
28
小结

回溯法适用条件:多米诺性质 回溯法设计步骤
1. 定义解向量和每个分量的取值范围
算法ReBacktrack(n) 输入:n 输出:所有解
1. 2. for k←1 to n 计算Xk且Sk ← Xk ReBack(1)
31回溯法两种实现源自 迭代实现算法Backtrack(n) 输入:n 输出:所有解
1. 2. 3. 4. 5. 6. 7. 8. 9. 确定初 始取值
对于i=1,2,...,n确定Xi k←1 满足约束 计算Sk 分支搜索 while Sk ∅ do xk ← Sk中最值;Sk ← Sk-{xk } if k<n then k←k+1; 计算Sk else <x1, x2, ..., xn>是解 回溯 if k>1 then k ← k-1; goto 4

n 1 min d (cki , cki1 ) d (ckn , ck1 ) i 1
16
实例
输入: • C={1,2,3,4} • d(1,2)=5, d(1,3)=9 • d(1,4)=4, d(2,3)=13 • d(2,4)=2, d(3,4)=7
1 9 3 5 4 7 4 13 2 2

例如:有6根火柴,以之为边搭建4个等边三角形

该问题易产生误导,它暗示是一个二维空间,为解决问 题需拓展到三维。

对任意一个问题,解的表示方式和它相应的解隐含了解 空间及其大小。
7
几个回溯法的例子
9
4后问题
问题:在 4×4 的方格棋盘上放置 4 个皇后,使得没 有两个皇后在同一行、同一列、也不在同一条45度 的斜线上。问有多少种可能的布局? 解是4维向量:<x1, x2, x3, x4> 解:<2,4,1,3>, <3,1,4,2> 推广到8后问题 解:8维向量,有92个。 例如:<1,5,8,6,3,7,2,4>是解
33
求解思路
输入:W=<w1, w2, ..., wn>为集装箱重量,c1和c2为船 的最大载重 算法思想:令第一艘船的载入量为W1 1. 用回溯法求使得c1 -W1达到最小的装载方案 2. 若满足 w1+w2+...+wn -W1 ≤c2 则回答“YES”,否则回答“NO”
相关文档
最新文档