第5章回溯法(使用)
合集下载
第5章-回溯法-New剖析

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

第5章
教学要求
回溯
了解回溯算法的概念与回溯设计要领 掌握应用回溯算法求解桥本分数式、素数环、 数码串珠以及情侣拍照等典型案例
本章重点
理解回溯法 “向前走,碰壁回头”的实现
5.1 回溯概述
1. 回溯的概念
(1) 回溯法(Back track method)有“通用解题法”之美 称,是一种比枚举“聪明”的效率更高的搜索技术。
4. 4皇后问题的回溯举例
如何在4×4的方格棋盘上放置4个皇后,使它们互不攻击:
4皇后问题回溯描述
i=1;a[i]=1; while
(1) { g=1;for(k=i-1;k>=1;k--) if(a[i]=a[k] || abs(a[i]-a[k])=i-k) g=0; // 检测约束条件,不满足则返回 if(g && i==4) printf(a[1:4]); // 输出一个解 if(i<4 && g) {i++;a[i]=1;continue;} while(a[i]==4 && i>1) i--; // 向前回溯 if(a[i]==4 && i==1) break; //退出循环结束探索 else a[i]=a[i]+1; }
(2) 回溯描述 对于一般含参量m,n的搜索问题,输入正整数n,m,(n≥m) i=1;a[i]=<元素初值>; while (1) {for(g=1,k=i-1;k>=1;k--) if( <约束条件1> ) g=0; // 检测约束条件,不满足则返回 if(g && <约束条件2>) printf(a[1:m]); // 输出解 if(i<n && g) {i++;a[i]=<取值点>;continue;} while(a[i]=<回溯点> && i>1) i--; // 向前回溯 if(a[i]==n && i==1) break; // 退出循环,结束 else a[i]=a[i]+1; }
教学要求
回溯
了解回溯算法的概念与回溯设计要领 掌握应用回溯算法求解桥本分数式、素数环、 数码串珠以及情侣拍照等典型案例
本章重点
理解回溯法 “向前走,碰壁回头”的实现
5.1 回溯概述
1. 回溯的概念
(1) 回溯法(Back track method)有“通用解题法”之美 称,是一种比枚举“聪明”的效率更高的搜索技术。
4. 4皇后问题的回溯举例
如何在4×4的方格棋盘上放置4个皇后,使它们互不攻击:
4皇后问题回溯描述
i=1;a[i]=1; while
(1) { g=1;for(k=i-1;k>=1;k--) if(a[i]=a[k] || abs(a[i]-a[k])=i-k) g=0; // 检测约束条件,不满足则返回 if(g && i==4) printf(a[1:4]); // 输出一个解 if(i<4 && g) {i++;a[i]=1;continue;} while(a[i]==4 && i>1) i--; // 向前回溯 if(a[i]==4 && i==1) break; //退出循环结束探索 else a[i]=a[i]+1; }
(2) 回溯描述 对于一般含参量m,n的搜索问题,输入正整数n,m,(n≥m) i=1;a[i]=<元素初值>; while (1) {for(g=1,k=i-1;k>=1;k--) if( <约束条件1> ) g=0; // 检测约束条件,不满足则返回 if(g && <约束条件2>) printf(a[1:m]); // 输出解 if(i<n && g) {i++;a[i]=<取值点>;continue;} while(a[i]=<回溯点> && i>1) i--; // 向前回溯 if(a[i]==n && i==1) break; // 退出循环,结束 else a[i]=a[i]+1; }
回溯法_ppt课件

//h(i)表示在当前扩展节点处x[t]的第i个可选值
实 现 递 归
} }
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --;
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --; 分析:
算法设计与分析 >回溯法
5、回溯法解题步骤: 1).针对所给问题,定义问题的解空间 2).确定解空间结构. 3).以深度优先方式搜索解空间.
算法模式 Procedure BACKTRACK(n); {k:=l; repeat if TK (x1,x2,...xK-1 )中的值未取遍 then { xK:=TK (x1,x2,..., x K-1 )中未取过的一个值; if BK (x1, x2, ..., x K) then //状态结点(x1,...xk)被激活 if k=n then output(x1, x2, ..., xk) //输出度优先 e1se k:=k-l; //回溯 until k=0; end;{BACKTRACK}
if (Constraint(t)&&Bound(t) ) Backtrack(t + 1); if语句含义:Constraint(t)和Bound(t)表示当前扩展 节点处的约束函数和限界函数。 Constraint(t): 返回值为true时,在当前扩展节点处 x[1:t]的取值问题的约束条件,否则不满足问题的约束条 件,可剪去相应的子树 Bound(t): 返回的值为true时,在当前扩展节点处 x[1:t]的取值为时目标函数越界,还需由Backtrack(t+1) 对其相应的子树做进一步搜索。否则,当前扩展节点处 x[1:t]的取值是目标函数越界,可剪去相应的子树 for循环作用:搜索遍当前扩展的所有未搜索过的 子树。 递归出口:Backtrack(t)执行完毕,返回t-1层继续 执行,对还没有测试过的x[t-1]的值继续搜索。当t=1时, 若以测试完x[1]的所有可选值,外层调用就全部结束。
实 现 递 归
} }
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --;
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --; 分析:
算法设计与分析 >回溯法
5、回溯法解题步骤: 1).针对所给问题,定义问题的解空间 2).确定解空间结构. 3).以深度优先方式搜索解空间.
算法模式 Procedure BACKTRACK(n); {k:=l; repeat if TK (x1,x2,...xK-1 )中的值未取遍 then { xK:=TK (x1,x2,..., x K-1 )中未取过的一个值; if BK (x1, x2, ..., x K) then //状态结点(x1,...xk)被激活 if k=n then output(x1, x2, ..., xk) //输出度优先 e1se k:=k-l; //回溯 until k=0; end;{BACKTRACK}
if (Constraint(t)&&Bound(t) ) Backtrack(t + 1); if语句含义:Constraint(t)和Bound(t)表示当前扩展 节点处的约束函数和限界函数。 Constraint(t): 返回值为true时,在当前扩展节点处 x[1:t]的取值问题的约束条件,否则不满足问题的约束条 件,可剪去相应的子树 Bound(t): 返回的值为true时,在当前扩展节点处 x[1:t]的取值为时目标函数越界,还需由Backtrack(t+1) 对其相应的子树做进一步搜索。否则,当前扩展节点处 x[1:t]的取值是目标函数越界,可剪去相应的子树 for循环作用:搜索遍当前扩展的所有未搜索过的 子树。 递归出口:Backtrack(t)执行完毕,返回t-1层继续 执行,对还没有测试过的x[t-1]的值继续搜索。当t=1时, 若以测试完x[1]的所有可选值,外层调用就全部结束。
第5章 回溯法(1-例子)

n; // 作业数};
8
} //end Backtrack
旅行售货员问题
9
旅行售货员问题
解空间树 —— 排列树 剪枝函数:当搜索到第i 层,图G中存在从顶点1经i个 顶点到某其他顶点的一条路 径,且x[1:i]的费用和大于当前 已获得的最优值时,剪去该子 树的搜索。 算法效率:
O((n-1)!)*O(n) =O(n!)
cleft -= w[i];
b += p[i];
i++;
} // 装满背包
if (i <= n) b += p[i]/w[i] * cleft;
return b;
4
}
0-1背包问题
例:n=4,c=7,p=[9,10,7,4],w=[3,5,2,1] 解空间树如下:
物品 1 物品 2 物品 3 物品 4
class Flowshop { friend Flow(int**, int, int []);
f+=f2[i];
private:
if (f < bestf) {
void Backtrack(int i);
Swap(x[i], x[j]);
int **M, // 各作业所需的处理时间
Backtrack(i+1);
(2)将剩余的集装箱装上第二艘轮船。
将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,
使该子集中集装箱重量之和最接近c1。由此可知,装载问题等
价于以下特n殊的0-1背包问题。
max wi xi i 1
用回溯法设计解装载问题的O(2n)计
n
s.t. wi xi c1
算时间算法。
计算机算法设计与分析第5章 回溯算法PPT课件

注意:同一个问题可以有多种表示,有些 表示方法更简单,所需表示的状态空间更 小(存储量少,搜索方法简单)。
22.09.2020
15
5.1.1 问题的解空间
为了用回溯法求解一个具有n个输入的问题,一 般情况下,将其可能解表示为满足某个约束条 件的等长向量X=(x1, x2, …, xn),其中分量xi (1≤i≤n) 的取值范围是某个有限集合Si={ai1, ai2, …, airi}, 所有可能的解向量构成了问题的解空间。
22.09.2020
2
提纲
一、回溯法的算法框架 二、装载问题 三、n后问题 四、0-1背包问题 五、最大团问题 六、图的m着色问题 七、旅行售货员问题
22.09.2020
3
提纲
一、回溯法的算法框架 二、装载问题 三、n后问题 四、0-1背包问题 五、最大团问题 六、图的m着色问题 七、旅行售货员问题
17
2 旅行售货员问题
问题描述:某售货员 要到若干城市去推销 商品,一直各城市之 间的路程,他要选定 一条从驻地出发,经 过每个城市一遍,最 后回到住地的路线, 使总的路程最短。
(a) 二维搜索空间无解
(b) 三维搜索空间的解
错误的解空间将不能搜索到正确答案!
22.09.2020
13
5.1.1 问题的解空间
对于任何一个问题,可能解的表示方式和它相应的 解释隐含了解空间及其大小。
例如,对于有n个物品的0/1背包问题,其可能解的 表示方式可以有以下两种:
(1)可能解由一个不等长向量组成,当物品i(1≤i≤n)装入 背包时,解向量中包含分量i,否则,解向量中不包含分 量i,当n=3时,其解空间是:
计算机算法设计与分析
Design and Analysis of Computer Algorithms
22.09.2020
15
5.1.1 问题的解空间
为了用回溯法求解一个具有n个输入的问题,一 般情况下,将其可能解表示为满足某个约束条 件的等长向量X=(x1, x2, …, xn),其中分量xi (1≤i≤n) 的取值范围是某个有限集合Si={ai1, ai2, …, airi}, 所有可能的解向量构成了问题的解空间。
22.09.2020
2
提纲
一、回溯法的算法框架 二、装载问题 三、n后问题 四、0-1背包问题 五、最大团问题 六、图的m着色问题 七、旅行售货员问题
22.09.2020
3
提纲
一、回溯法的算法框架 二、装载问题 三、n后问题 四、0-1背包问题 五、最大团问题 六、图的m着色问题 七、旅行售货员问题
17
2 旅行售货员问题
问题描述:某售货员 要到若干城市去推销 商品,一直各城市之 间的路程,他要选定 一条从驻地出发,经 过每个城市一遍,最 后回到住地的路线, 使总的路程最短。
(a) 二维搜索空间无解
(b) 三维搜索空间的解
错误的解空间将不能搜索到正确答案!
22.09.2020
13
5.1.1 问题的解空间
对于任何一个问题,可能解的表示方式和它相应的 解释隐含了解空间及其大小。
例如,对于有n个物品的0/1背包问题,其可能解的 表示方式可以有以下两种:
(1)可能解由一个不等长向量组成,当物品i(1≤i≤n)装入 背包时,解向量中包含分量i,否则,解向量中不包含分 量i,当n=3时,其解空间是:
计算机算法设计与分析
Design and Analysis of Computer Algorithms
第五章 回溯法

• 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个集装箱要装上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
2020-wfx-第5章 回溯法-应用

1+2+3+4+5+6+7+8+9 45
1+2+3+4+5+6+7+8-9
36
1+2+3+4+5+6+7+89
117
1+2+3+4+5+6+7-8+9
f(a,n,k) for (j=i;j<n;j++)
其他情况
{ 交换a[i]与a[j];
f(a,n,i+1);
交换a[i]与a[j];//恢复环境
}
解空间为排列树时的递归回溯算法框架
int x[n];
//x存放解向量,并初始化
void backtrack(int i)
//求解排列树的递归框架
{ if(i>n)
交换 a[2],a[2]
交换 a[2],a[2]
交换 a[2],a[2]
交换 a[2],a[2]
交换 a[2],a[2]
{3,1,2}
交换 a[2],a[2]
{1,2,3} {1,3,2} {2,1,3} {2,3,1} {3,2,1} {3,1,2}
算法设计与分析
吴粉侠
第5章 回溯法
回溯法应用
3.确定a[2] 取3
取2
取3
取1
取1
取2
a={1,2,3}a={1,3,2}a={2,1,3}a={2,3,1} a={3,2,1}a={3,1,2}
解空间-排列树
{1,2,3}
取1
取2
取3
{1,2,3}
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
组织解空间(3)
子集和数问题
解空间由根结点到叶结点的所有路径确定
状态空间树
对于任何一个问题,一旦设想出一种状态空间树,那么就可 以先系统地生成问题状态,接着确定这些问题状态中的哪些 是解状态,最后确定哪些解状态是答案状态从而将问题解出 生成问题状态的两种方法 便于问题的描述,给出以下概念: 活结点:自己已经生成而其所有的儿子结点还没有全部生成 的结点。 E-结点(正在扩展的结点):当前正在生成其儿子结点的活 结点。 死结点:不再进一步扩展或者其儿子结点已全部生成的结点。
第八章 回溯法
回溯法概述
回溯法可以系统的搜索一个问题的所有解或任一 个解 它在包含问题的所有解的解空间树中,按照深度 优先的策略,从根结点出发搜索解空间树。算法 搜索到某一结点时,如果断定该结点肯定不包含 问题的解,则跳过以该结点为根的子树的搜索, 逐层向其祖先结点回溯 这种以深度优先方式搜索问题的解的方法称为回 溯法
子集和数问题解的另一种表达
解由n-元组(x1, x2, …, xn)表示; 显式约束条件xi∈{0,1} ,1≤i≤n,如果没有 选择Wi,则xi=0;如果选择了Wi,则xi=1。 于是上面的解可以表示为(1,1,0,1)和 (0,0,1,1); 隐式约束条件(xi × wi)的和数为M
解空间的大小为2n个元组
ESTIMATE是一个确定m值的算法
6.2
8-皇后问题
将n个皇后放置在一个n×n的棋盘上,要求一行、或同一 列、或者同一条斜线上都视为出现了攻击。
8-皇后问题的一个解
1
1 2 3 4 5 6 7 8
2
3
4
5
6
7
8
该解的8元组表示:
重新排列方法
用于检索效率的提高
基本思想:在其它因素相同的情况下,从 具有最少元素的集合中作下一次选择。
该策略已证明对n-皇后问题及其它一些问 题无效
效率分析
效率分析中应考虑的因素
(1)—(3)与实例无关 (4)与实例相关
有可能只生成O(n)个结点,有可能生成几 乎全部结点 最坏情况时间
生成问题状态的两种方法
在第一种方法中,当前的E-结点R一旦生成一个新的 儿子C,这个儿子结点就变成一个新的E-结点,当完全检 测了子树C之后,R结点就再次成为E-结点。这相当于问 题状态的深度优先生成。 在第二种状态生成方法中,一个E-结点一直保持到变 成死结点为止。 在这两种方法中,将用限界函数去杀死还没有全部生成 其儿子结点的那些活结点。 回溯法:使用限界函数的深度优先结点生成方法。 分枝-限界方法:E-结点一直保持到死为止的状态生成方 法。
解空间的树结构
回溯算法通过系统地检索给定问题的解空间来确定问题的解。 这检索可以用这个解空间的树结构来简化。 为了便于讨论,引进一些关于解空间树结构的术语。 ﹡问题状态(problem state):树中的每一个结点确定所求解 问题的一个问题状态。 ﹡状态空间(state space):由根结点到其它节点的所有路径 则确定了这个问题的状态空间。 ﹡解状态(solution states):解状态是这样一些问题状态S, 对于这些问题状态,由根到S的那条路径确定了这解空间中 的一个元组。 ﹡答案状态(answer states):对于这些解状态而言,由根到S 的这条路径确定了这问题的一个解(即,它满足隐式约束条 件)。 ﹡状态空间树(state space tree):解空间的树结构。
回溯算法的递归表示
procedure RBACKTRACK(k) global n, X(1:n) for 满足下式的每个X(k) X(k) ∈T(X(1),…X(k-1)) and B(X(1),…X(k))=true do if(X(1),…,X(k)) 是一条已抵达一答案结点的路径 then print(X(1),…,X(k)) endif call RBACKTRACK(k+1) repeat end RBACKTRACK
可用回溯法求解的问题
问题的解可以用一个n元组(x1,…,xn)来表示, 其中的xi取自于某个有穷集Si,并且这些解 必须使得某一规范函数P(x1,…,xn)(也称限 界函数)取极值或满足该规范函数条件。 例子:A(1:n)个元素的分类问题
问题的解为n元组; xi取自有穷集; 规范函数P:A(xi)<=A(xi+1)
xi>=0 xi=0或xi=1 l<=xi<=u
即si={所有非负实数} 即 si={0,1} 即si={a:l<=a<=u}
满足显式约束的所有元组确定一个可能的解 空间 隐式约束描述了xi必须彼此相关的情况,如 0/1背包问题中的背包重量M
回溯法求解的经典问题(1) 8-皇后问题
在一个8*8棋盘上放置8个皇后,且使得每两 个之间都不能互相“攻击”,也就是使得每 两个都不能在同一行、同一列及同一条斜角 线上。 8皇后问题的解可以表示为8-元组(x1,…,x8) , 其中xi是第i行皇后所在的列号。 显式约束条件是si={1,2,3,4,5,6,7,8}, 1≤i≤8 隐式约束条件是,没有两个xi可以相同且没 有两个皇后可以在同一条斜角线上。
算法说明:基本上是一棵树的后根次序周游。这个递归模型 最初由call RABCKTRACK(1)调用。
效率分析应考虑的因素
(1)生成下一个X(k)的时间 (2)满足显式约束条件的X(k)的数目 (3)限界函数Bi的计算时间 (4)对于所有的i,满足Bi的X(k)的数目 权衡:限界函数生成结点数和限界函数本 身所需的计算时间
回溯的一般方法-算法
procedure BACKTRACK(n) integer k, n; local X(1:n) k1 while k>0 do if 还剩有没检验过的X(k)使得 X(k) ∈T(X(1),…X(k-1)) and B(X(1),…X(k))=true then if(X(1),…,X(k)) 是一条已抵达一答案结点的路径 then print(X(1),…,X(k)) endif k k+1 else k k-1 endif repeat end BACKTRACK
回溯法如何提高效率?
由开始结点到当前E-结点构成解向量 (x1,…,xi) 如果判定(x1,…,xi)不能导致最优解,那么就 将可能要测试的mi+1…mn个向量略去。 因此回溯法的测试次数比硬性处理作的测 试次数要少得多。
如何判定(x1,…,xi)能否导致最优解?
约束条件
回溯法的解需要满足一组综合的约束条件, 通常分为:显式约束和隐式约束 显式约束条件限定每个xi只从一个给定的集 合上取值,例如:
O(p(n)2n),p(n)为n的多项式 O(q(n)n!),q(n)为n的多项式
Monte Carlo效率估计(1)
一般思想
在状态空间中生成一条随机路径 X为该路径上的一个结点,且X在第i级 mi为X没受限界的儿子结点数目 从mi随机选择一个结点作为下一个结点 … 路径生成的结束条件:1)叶子结点;或者2)所有儿 子结点都已被限界 所有这些mi可估算出状态空间树中不受限界结点的总 数m
4-皇后问题-回溯解
1 1 2 3 4
2
3
4
4-皇后问题回溯期间生成的树
上图显示了在4-皇后问题中求上述一个解的树的实际生成部 分。结点按它们生成的次序被编号。由限界函数所杀死的结点 则在其下方写上B。
回溯算法的形式描述
假设回溯算法要找出所有的答案结点而不是仅仅只找出一个。 ① 设(x1,x2,„,xi-1)是状态空间树中由根到一个结点(问题状 态)的路径。 ② T(x1,x2,„,xi-1)是下述所有结点的xi的集合,它使得对于 每一个xi, (x1,x2,„,xi)是一条由根到结点xi的路径 ③ 存在一些限界函数Bi(可以表示成一些谓词),如果路径 (x1,x2,„,xi)不可能延伸到一个答案结点,则 Bi(x1,x2,„,xi)取假值,否则取真值。 因此,解向量X(1:n)中的第i个分量就是那些选自集合 T(x1,x2,„,xi-1)且使Bi为真的xi。
m=1+m1+m1m2+m1m2m3+„
Monte Carlo效率估计算法
procedure ESTIMATE m1; r 1; k 1 loop Tk{X(k):X(k)∈ T(X(1),…X(k-1)) and B(X(1),…X(k))} if SIZE(Tk)=0 then exit endif rr*SIZE(Tk) mm+r X(k)CHOOSE(Tk) KK+1 repeat return(m) end ESTIMATE
问题求解的方法
硬性处理法
列出所有候选解,逐个检查是否为所需要的解 理论上,候选解数量有限,并且通过检查所有或部分候 选解能够得到所需解时,上述方法可行 实际中则很少使用,因为候选解的数量通常都非常大 (比如指数级,甚至是大数阶乘),即便采用最快的计 算机也只能解决规模较小的问题。 避免对很大的候选解集合进行完全检查 大大减少问题的求解时间 通常用来求解规模较大的问题
子集和数问题解的一种表示方法
若用Wi的下标表示解向量,这两个解向量为(1,2,4)和 (3,4)。 子集和数问题的解可以表示为k-元组(x1, x2, …, xk), 1≤k≤n 并且不同的解可以是大小不同的元组。 显式约束条件是xi∈{j|j为整数且1≤j≤n}。 隐式约束条件是 1)没有两个xi是相同的; 2)wxi的和为M; 3)xi<xi+1,1≤i<n(避免产生同一个子集的重复情况)
1
1 2 3 4
2
3
4
5
6
7