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

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

由于从K已无法纵深扩展,故K成为一个死结点,所以 返回(回溯)至E(离K最近的一个活结点)。 而E也没有可扩展的结点,也成为了死结点。接下来 ,再继续回溯,返回至B处,同样B也成为死结点。再 返回A,从A可扩展移至C。从A移至C,r=30,获取价 值0。 从C可移至F或G,令先移至F,则F成为新的扩展结点 ,此时有活结点A,C,F。在F有r=30-w2=15,获取价值 25。 从F向纵深移至L处,有r=0,获取价值25+25=50。L是
当i<n时,当前扩展节点位于排列树的i-1层。此时算法选 择下一个要排列的圆,并计算相应的下界函数。
算法效率
如果不考虑计算当前圆排列中各圆的圆心横坐 标和计算当前圆排列长度所需的计算时间按,则 Backtrack需要O(n!)计算时间。由于算法Backtrack 在最坏情况下需要计算O(n!)次圆排列长度,每次 计算需要O(n)计算时间,从而整个算法的计算时间 复杂性为O((n+1)!)
递归回溯
Void backTrace (int t) {If(t>n) {
output(x); }else{
for(i=f(n,t);i<=g(n,t);i++){ x[t]=h[i]; if(constraint(t)&&bound(t)){ backtrack(t+1);}
} } }
迭代回溯
电路板排列问题
其中两个可能的排列如图所示,则该 电路板排列的密度分别是2,3
左下图中,跨越插槽2和3,4和5,以及插 槽5和6的连线数均为2。插槽6和7之间无 跨越连线。其余插槽之间只有1条跨越连 线。
算法分析
电路板排列问题是NP难问题,因此
NP难 问题
不大可能找到解此问题的多项式时间
算法。考虑采用回溯法系统的搜索问

谢谢侬
编曲:吴瑞峰 填词:吴瑞峰 演唱:Eason
且now[j]!=total[j]。用这个条件来
计算插槽i和i+1间的连线密度。
算法效率
在解空间排列树的每个节点处,算法 Backtrack花费O(m)计算时间为每个儿 子节点计算密度。因此计算密度所消耗 的总计算时间为O(mn!)。另外,生成排 列树需要O(n!)时间。每次更新当前最优 解至少使bestd减少1,而算法运行结束 时bestd>=0。因此最优解被更新的额次 数为O(m)。更新最优解需要O(mn)时间 。综上,解电路板排列问题的回溯算法 Backtrack所需要的计算时间为O(mn!)
Void iterativeBacktrack(int t) {t=1;
While(t>0){ if(f(n,t)<=g(n,t)) for(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---; }
}
N后问题
在8×8的棋盘上放置8 个皇后,使得这8个皇 后不在同一行、同一列 及同一斜角线上。如图 :
1 2 34 5 6 7 8
1
Q
2
Q
3
Q
4
Q
5
Q
6Q
7
Q
8
Q
剪枝函数
8皇后问题可以表示成8元组 (x1,…,x8),其中xi是放在第i行 的皇后所在的列号。于是, 解空间由8个8元组组成。 约束条件:xi≠xj for all i, j
电路板排列问题 问题描述
设n=8, m=5,给定n块电路板及其m个连接块: B={1, 2, 3, 4, 5, 6, 7, 8},N1={4, 5, 6},N2={2, 3},N3={1, 3},N4={3, 6},N5={7, 8}; 在设计机箱时,插槽一侧的布线间隙由电路板的 排列的密度确定。因此,电路板排列问题要求对 于给定的电路板连接条件(连接块),确定电路板 的最佳排列,使其具有最小密度。
|xi-xj|≠| j-i | 约束条件之一为没有两个xi 相同(即任意两个皇后不在同 一列上)。其二为没有两个皇 后在同一斜线上。
N后问题主要算法部分
boolean place(int k) {
int i; for (i=1;i<k;i++) { if((x[i]==x[k])||(abs(x [i]-x[k])==abs(i-k))) return false; } return true; }
上述算法尚有许多改进的余地。例如,像 1,2,…,n-1,n和n,n-1, …,2,1这种互为镜像的排列具 有相同的圆排列长度,只计算一个就够了,可减少 约一半的计算量。另一方面,如果所给的n个圆中 有k个圆有相同的半径,则这k个圆产生的k!个完全 相同的圆排列,只计算一个就够了。
电路板排列问题
将n块电路板以最佳排列方式插入带 有n个插槽的机箱中。n块电路板的 不同排列方式对应于不同的电路板 插入方案。设B={1, 2, …, n}是n块电 路板的集合,L={N1, N2, …, Nm}是连 接这n块电路板中若干电路板的m个 连接块。Ni是B的一个子集,且Ni中 的电路板用同一条导线连接在一起 。设x表示n块电路板的一个排列,即 在机箱的第i个插槽中插入的电路板 编号是x[i]。x所确定的电路板排列 Density (x)密度定义为跨越相邻电路 板插槽的最大连线数。
题的解空间。每一个组合 是问题的一个可能解。
解空间
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种可能的解。
货郎担(旅行商)问题
叶结点,即获得一可行解,又获取了至今最高价值, 因此记录该可行解。
L不可扩展,返回F处。按此方式继续搜索,可搜索遍 整个解空间。搜索结束后找到的最好解是相应0-1背包 问题的最优解。
单击增加标题内容
避免无效搜索
用约束函数在扩 展结点出剪去不 满足约束的子树
用限界函数剪去得不 到最优解的子树
两类函数通称为剪枝函数
可行解和 最优解
当前扩展结点成为死结点时,应往回移动(回溯)至最近的 一个活结点处,并使这个活结点成为当前的扩展结点
百度文库
所搜索到的结 点不是叶结点, 且满足约束条 件和目标函数 的界,其儿子 结点还未全部 搜索完毕
正在搜索其儿 子结点的结点, 它也是一个活 结点
不满足约束条件、 目标函数、或其 儿子结点已全部 搜索完毕的结点、 或者叶结点。以 死结点作为根的 子树,可以在搜 索过程中删除
从n个元素的集合S中找出满 足某种性质的子集时
子集树 解空间大小: 2n
确定n个元素满足某 种性质的排列时
Add text in here too Add text in here
排列树 解空间大小: n!
满足约束条件的解,解 空间中的一个子集
可行解
最优解
使目标函数取极值(极 大或极小)的可行解, 一个或少数几个
S={1,2,…,n},当n=3时, S={1,2,3} ,货郎担问 题的解空间是:
{(1,1,1),(1,1,2),(1,1,3),(1,2,1),(1,2,2),(1,2,3),┅,(3, 3,1),(3,3,2),(3,3,3)} 当输入规模为n时,它有nn种 可能的解。考虑到约束方程xi≠xj。因此,货郎担 问题的解空间压缩为: {(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)}当输 入规模为n时,它有n!种可能的解。
void backTrack(int t) {
if (t>n) {
sum++; print(x); } else{ for(i=1;i<=n;i++){
x[t]=i; if (place(t))
backtrack(t+1); } }
圆排列问题
给定n个大小不等的圆 c1,c2,…,cn,现要将这n个圆 排进一个矩形框中,且要求 各圆与矩形框的底边相切。 圆排列问题要求从n个圆的所 有排列中找出有最小长度的 圆排列。例如,当n=3,且所 给的3个圆的半径分别为1,1 ,2时,这3个圆的最小长度 的圆排列如图所示。其最小 长度为
,计算结束后返回相应于最优解的圆排列。center计算圆在 当前圆排列中的横坐标,由x^2 = sqrt((r1+r2)^2-(r1-r2)^2) 推导出x = 2*sqrt(r1*r2)。Compoute计算当前圆排列的长度
。变量min记录当前最小圆排列长度。数组r表示当前圆排列 。数组x则记录当前圆排列中各圆的圆心横坐标。 在递归算法Backtrack中,当i>n时,算法搜索至叶节点,得 到新的圆排列方案。此时算法调用Compute计算当前圆排列 的长度,适时更新当前最优值。
5.3 n后问题
5.5 电路板排版
基本思想
问题
Ps:利用限界函数避免移动到不可能产生解的子空间。
定义一个解空间, 它包含问题的解
回溯法解题的一个显著特征 是在搜索过程中动态产生问 题的解空间。
用易于搜索的方式 组织解空间
深度优先搜索解 空间,获得问题 的解。
单击增加标题内容
解空间
设问题的解向量为: X=(x1,x2,…,xn) ,xi的取值 范围为有穷集Si 。把xi的所 有可能取值组合,称为问
题解空间的排列树,找出电路板的最
佳排列。设用数组B表示输入。B[i][j]
的值为1当且仅当电路板i在连接块Nj
中。设total[j]是连接块Nj中的电路板
数。对于电路板的部分排列x[1:i],
设now[j]是x[1:i]中所包含的Nj中的
电路板数。由此可知,连接块Nj的连
线跨越插槽i和i+1当且仅当now[j]>0
算法设计
圆排列问题的解空间是一棵排列树。按照回溯法搜索排列树 的算法框架,设开始时a=[r1,r2,……rn]是所给的n个元的半 径,则相应的排列树由a[1:n]的所有排列构成。
解圆排列问题的回溯算法中,CirclePerm(n,a)返回找到 的最小的圆排列长度。初始时,数组a是输入的n个圆的半径
《算法设计与分析》-回溯
单击增加标题内容
对于许多问题, 当需要找出问题 的所有解或者找 出满足某些约束 条件的(最优) 解时,往往要使 用回溯法。
回溯法有“通用的解题法”之称。
0-1背包 圆排列问题
N后问题
电路板排版问题
回溯 算法 应用 领域
5.2 回溯法的 算法框架
5.4 圆排列问题
5.1 回溯法的
回溯法即以这种工作方式递归地在解空间中搜索,直至找 到所要求的解,或解空间中已无活结点时终止
n=3,w=[16,15,15],p=[45,25,25],c=30。
从其解空间树的根结点开始搜索其解空间。 开始时,根结点A是唯一的活结点,也是当前扩 展结点。 在当前扩展结点A处,可纵深移至B或C。
在当前扩展结点A处,可纵深移至B或C。 选择先移至B,即选取物品w1,此时,A、B均为活 结点,B成为当前扩展结点。在B处剩余背包容量是 r=30-16=14,获取价值45。 从B可纵深移至D或E,先考虑移至D,但现仅有的背 包容量容不下物品w2,故移至D导致一个不可行解。 而从B移至E不占用背包容量,因而可行。从而我们 选择移至E。此时E成为新的扩展结点。 此时,A、B和E是活结点。在E处容量仍为14,所得 价值仍为45。 从E可以移至J和K。移至J会导致一个不可行解,而 移向K是可行的,于是移至K,K成为新的扩展结点。 由于K是一个叶结点,所以我们得到一个可行解 (1,0,0),v=45。
相关文档
最新文档