算法设计与分析-分枝限界法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图7-6(a)所示是一个带权无向图,(b)是该图的代价矩阵。
(a) 一个无向图
(b) 无向图的代价矩阵
图7-6 无向图及其代价矩阵
1.确定问题的上界16,下界14。 如何设计求上、下界策略?
2.确定限界函数计算方法
一般情况下,假设当前已确定的路径为U=(r1, r2, …, rk), 即路径上已确定了k个顶点,此时,该部分解的目标函数 值的计算方法如下:
7.4.1 TSP问题
问题描述:TSP问题是指旅行家要旅行n个城市,要求各 个城市经历且仅经历一次然后回到出发城市,并要求所 走的路程最短。
想法: Ø确定目标函数的界[down, up] 。(提示:如何确定上、 下界?) Ø确定目标函数值的计算方法(限界函数)。 Ø基于上、下界,按分枝限界法设计思想,搜索解空间树, 得到最优解。
Ø对于任意结点X,若ĉ(X)>U,则X子树可以剪除。
ĉ(X)是X子树上最小代价答案结点的代价,而U是整 个树的最小代价的上界值。
Ø在算法以及搜索到一个答案结点后,所有满足ĉ(X)>U的 子树都可以剪除,但如果在得到答案结点之前则可能会将 最小答案结点误剪除。为了能运用ĉ(X)>=U作为剪枝条件, 又不至于误剪去包含最小代价答案结点的子树,可以对所 有结点X,使用u(X)+ε作为该子树的最小代价上界值,ε是 一个小量。
Ø代价函数c(X)
若X是答案结点,则c(X)是由状态空间树的根结点到X的搜索代价(成本); 若X不是答案结点且子树X上不含任何答案结点,则c(X)=∞;若X不是答案结点但 子树X上包含答案结点,则c(X)等于子树X中具有最小搜索代价(成本)的答案结 点的代价(成本)。
Ø相对代价函数g(.)
衡量一个结点X的相对代价一般有两种标准:①在生成一个答案结点之前,子 树X上需要生成的结点数目;②在子树X上,离X最近的答案结点到X的路径长度。 容易看出,如果采用标准①总是生成最小数目的结点;如果采用标准②,则要成为E -结点的结点只是由根到最近的那个答案结点路径上的那些结点。
比较分枝限界法与回溯法 (1)求解目标:回溯法的求解目标是找出解空间树中满
足约束条件的所有解,而分支限界法的求解目标则是找出满足 约束条件的一个解,或是在满足约束条件的解中找出在某种意 义下的最优解。
(2)搜索方式的不同:回溯法以深度优先的方式搜索解 空间树,而分支限界法则以广度优先或以最小耗费优先的方式 搜索解空间树。
7.2 求最优解的分枝限界法
分枝限界法的三种形式:FIFO分枝限界法、LIFO分枝限 界法和LC分枝限界法都可用于求解最优化问题。当分枝限界法 用于求最优解时,需要使用上下界函数作为限界函数。
定义7-1 状态空间树上一个结点X的代价函数c(·)定义为: 若X是答案结点,则c(X)为X所代表的可行解的目标函数值;若 X为非可行解结点,则c(X)=;若X代表部分向量,则c(X)是以 X为根的子树上具有最小代价的结点代价。
从活结点表中选择下一扩展结点的不同方式导致不同的分
枝限界法。最常见的有以下两种方式。 (1)队列式(FIFO)分枝限界法 队列式分枝限界法将活结点表组织成一个队列,并按队列
的先进先出FIFO原则选取下一个结点为当前扩展结点,对当前 扩展结点的所有儿子进行检测,满足约束条件的儿子,放入活 结点表中,该扩展结点成为死结点,再从活结点表中取出的其 他结点作为新的扩展结点—先广后深。
(2)优先队列式(LC)分枝限界法 在FIFO分枝限界法中,对下一个E结点的选择规则相当死 板,而且在某种意义上是盲目的。这种选择规则对于有可能快 速检索到一个答案结点的结点没有给出任何优先权。对活结点 使用一个“有智力的”排序函数作为优先权来选择下一个E-结 点。
一个答案结点X的搜索代价cost(X)定义为:从根结点开始, 直到搜索到X为止所耗费的搜索时间。下面定义4个相关函数。
Ø相对代价估计函数
作为g(X)的估计值,用于估计结点X的相对代价,它是由X到达一个
答案结点所需代价的估计函数。一般地,假定 满足如下特性:如果Y是X的孩子,
则有
。
Ø代价估计函数
是代价估计函数,它由两部分组成:
,其中f(x)是由
根结点到结点X的代价(成本); 是由X到达一个答案结点的代价估计函数
Hale Waihona Puke Baidu
(下界)。一般而言,可令f(X)等于X在树中的层次。
3.1 i = 表PT中具有最大值的结点; 3.2 对结点i的每个孩子结点x执行下列操作:
3.2.1 如果结点x不满足约束条件,则丢弃该结点; 3.2.2 否则,估算结点x的目标函数值lb,
将结点x加入表PT中; 4. 将叶子结点对应的最优值输出,回溯求得最优解的各个分量。
7.3.2 带限期的作业排序
想法: Ø确定目标函数上、下界; Ø确定目标函数的计算方法; 一般情况下,假设当前已对前i个物品进行了某种特定的选 择,且背包中已装入物品的重量是w,获得的价值是v,计算该 结点的目标函数上界的一个简单方法是,将背包中剩余容 量全部装入第i+1个物品,并可以将背包装满,于是,得到限界 函数:
Ø依上计算从根结点到叶子结点的目标函数值直到表PT中 取得极大值。
Ø基于上、下界,按分枝限界法设计思想,搜索解空间树,得 到最优解。
例:设有带时限的作业排序实例:n=4,(p0, d0, t0)=(5, 1, 1),(p1, d1, t1)=(10, 3, 2),(p2, d2, t2)=(6, 2, 1)和(p3, d3, t3)=(3, 1, 1),求使得总收益最大的作业子集J。
本章要点
• 队列式分枝限界法 • 优先队列式分枝限界法 • 0/1背包问题 • 带限期作业排序 • TSP问题 • 单源点最短路径问题
章节内容
7.1 算法思想 7.2 求最优解的分枝限界法 7.3 组合问题中的分枝限界算法 7.4 图问题中的分枝限界算法 7.5 典型的c++程序 7.6 小结
7.1 算法思想
U的值是不断修改的,它根据在搜索中获取的越来越 多的关于最小代价的上界信息,使U的值逐渐逼近该最小 代价值,直到找到最小代价的答案结点。
基于上下界函数的分枝限界法的限界方法可描述 如下:
算法要求U的初值大于最优解的代价,并且在搜 索状态空间树的过程中不断修正U的值,对于某个结点 X,U的值可以按下列原则修正:
(1)如果X是答案结点,cost(X)是X所代表的可 行解的目标函数值,u(X)是该子树上最小代价答案结 点代价的上界值,则U=min{cost(X), u(X)+, U};
(2)如果X代表部分向量,则U=min{u(X)+, U}。 于是,算法可以使用ĉ(X)≥U作为剪枝条件尽可能剪除 多余分枝。
问题描述:设有n个作业和一台处理机,每个作业所需的处理 时间、要求的时限和收益可用三元组(ti, di, pi),0≤i<n表示, 其中,作业i的所需时间为ti,如果作业i能够在时限di内完成, 将可收益pi,求使得总收益最大的作业子集J。 想法:
Ø确定目标函数上界、下界;
(上界
、下界
)
Ø确定目标函数的计算方法(作业子集J中所有作业所获取的收 益之和 ,使得总收益最大的作业子集是问题的最优解);
基于上下界函数的FIFO分枝限界法FIFOBB函数
do{ for(对结点E的每个孩子){ x=new Node;x->parent=E;//构造E的孩子结点x if(ĉ(X)<U){ //未被限界函数剪枝的子树根x lst.Append(x);//x进队列 if(x是一个答案结点&&cost(x)<U) //x为答案结点时修正U if(u(x)+ < cost(x))U=u(x)+ ; else{U=cost(x);ans=x;} else if(u(x)+ < U) U=u(x)+ ;//x为非答案结点时修正U } } do{ if(lst.isempty()) return ans;//若队列为空,则返回指针ans lst.serve(E);//从队列中取出活结点 }while(ĉ(E)≥U); //ĉ(E)<U时,E成为扩展结点
7.2.1 FIFO分枝限界法
函数FIFOBB是采用FIFO队列为活结点表的分枝限界 法,算法使用上下界函数进行剪枝,算法在队列lst为空时 结束。
为了在算法结束后能方便地构造出与最优值相应的最 优解,算法必须存储相应子集树中从活结点到根结点的路 径。为此目的,可在每个结点处设置指向其父结点的指针, 并设置左、右儿子标志。找到最优值后,可以根据parent 回溯到根节点,找到最优解。函数如下:
分枝限界法常以广度优先或以最小耗费(最大效益)优先 的方式搜索问题的解空间树。问题的解空间树是表示问题解空 间的一棵有序树,常见的有子集树和排列树。
在搜索问题的解空间树时,分枝限界法与回溯法的主要区 别在于它们对当前扩展结点所采用的扩展方式不同。在分枝限 界法中,每一个活结点只有一次机会成为扩展结点。活结点一 旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子 结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其 余儿子结点被加入活结点表中。此后,从活结点表中取下一结 点成为当前扩展结点,并重复上述结点扩展过程。这个过程一 直持续到找到所需的解或活结点表为空时为止。
}while(1)
7.2.2 LC分枝限界法
与函数FIFOBB相比,函数LCBB采用优先权队列作为 活结点表。两者的区别在于前者只有当活结点表为空时,算 法才结束;后者以优先权队列为空或ĉ(X)≥U为算法终止条件。 ĉ(X)作为结点X的优先权。函数如下:
基于上下界函数的LC分枝限界法LCBB函数
定义7-2 函数u(·)和ĉ(·)分别是代价函数c(·)的上界和下界函 数。对所有结点X,总有ĉ(X)≤c(X)≤u(X)。
上下界函数的作用是一种限界作用,也是一种剪枝函数。 在求解最优化问题时,它可以进一步压缩所生成的状态空间树 的结点数目。对于许多问题虽然不能确切求得c(X),但却能得 到ĉ(·)和u(X),使得ĉ(X)≤c(X)≤u(X)。
搜索过程?
设n个物品的重量存储在数组w[n]中,价值存储在数组v[n]中, 背包容量为W,分枝限界法求解0/1背包问题算法用伪代码描述如下。
算法7.1:分枝限界法求解0/1背包问题 输入:n个物品的重量w[n],价值v[n],背包容量W 输出:背包获得的最大价值和装入背包的物品 1. 根据限界函数计算目标函数的上界up;采用贪心法得到下界down; 2. 计算根结点的目标函数值并加入待处理结点表PT; 3. 循环直到某个叶子结点的目标函数值在表PT中取极大值
解:图7-4为该实例的可变大小元组表示的状态空间树。 对于方形结点表示X,ĉ(X)=∞,代表因不满足约束条件而被剪 枝的子树。例如,结点12代表作业子集J={0,1,2},不存在一种 可能的作业排列,使得J中作业都能如期完成,因此,结点12
用方形结点表示。
图7-4 可变大小元组状态空间树
7.4 图问题中的分枝限界算法 7.4.1 TSP问题 7.4.2单源点最短路径问题
do{ for(对结点E的每个孩子){ x=new Node;x->parent=E;//构造E的孩子结点x if(ĉ(X)<U){ //x子树未被限界函数剪枝 lst.Append(x); if(x是一个答案结点&&cost(x)<U) //x为答案结点时修正U if(u(x)+ < cost(x))U=u(x)+ ; else{U=cost(x);ans=x;} else if(u(x)+ < U) U=u(x)+ ;//x为非答案结点时修正U } } if(!lst.isempty()){ lst.serve(E);//从队列中取出活结点E if(ĉ(E)≥U) return ans; //若ĉ(E)≥U,则算法结束 } else return ans; //若队列为空,则算法结束
}while(1)
7.3 组合问题中的分枝限界算法 7.3.1 0/1背包问题 7.3.2 带限期的作业排序
7.3.1 0/1背包问题
问题描述:给定n种物品和一个容量为W的背包,物品i的 重量是wi,其价值为vi,对每种物品i只有两种选择:装入背 包或不装入背包,如何选择装入背包的物品,使得装入 背包中物品的总价值最大?