1、,南京邮电大学计算机学院 2019/7/26,算法设计与分析,Design and Analysis of Algorithms In C+,主讲 王海艳 计算机学院 ,南京邮电大学计算机学院 2019/7/26,第9章 分枝限界法,基本要求:了解分枝限界法可用于求解可行解或最优解。理解分枝限界法的剪枝搜索策略,理解使用分枝限界法求最优化问题时为状态空间树的每个结点定义上下界函数的作用,掌握分枝限界法的算法框架并会用分枝限界法的设计策略求解问题的最优解 。,南京邮电大学计算机学院 2019/7/26,学习要点: 理解分枝限界法的剪枝搜索策略。 分枝限界法与回溯法的异同。 掌握几种常见的分枝限界
2、法思想: (1)FIFO(先进先出)分枝限界法 (2)LIFO(堆栈,即D-检索)分枝限界法 (3)LC(优先权队列)分枝限界法 分枝限界法的算法框架。 通过应用范例学习分枝限界法的设计策略。 (1)15谜问题 (2)带时限的作业排序 (3)旅行商问题,南京邮电大学计算机学院 2019/7/26,9.1 一般方法 9.2 求最优解的分枝限界法 9.3 带时限的作业排序 9.5 旅行商问题,南京邮电大学计算机学院 2019/7/26,9.1 一般方法,南京邮电大学计算机学院 2019/7/26,相关概念 (P54)未访问状态:结点尚未访问的状态;x未检测状态:x已访问但其后继未访问;x已检测状态
3、:x已访问且其后继已访问;扩展结点(E-结点):算法正从x出发,访问x的某个后继结点y;x被称为扩展结点。活结点:未检测结点;死结点:已检测结点;活结点表:保存活结点的数据结构;D-检索:以栈为活结点表按BFS的算法。,9.1.1 分枝限界法概述,南京邮电大学计算机学院 2019/7/26,采用广度优先产生状态空间树中的结点,并使用剪枝函数的方法称为分枝限界法。 采用深度优先产生状态空间树中的结点,并使用剪枝函数的方法称为回溯法。,南京邮电大学计算机学院 2019/7/26,分枝限界法的基本做法是: 以广度优先的方式搜索问题的状态空间树。每一个活结点只有一次机会成为E-结点。 按照广度优先原则
4、,活结点一旦成为E-结点R后,就依次生成它的所有孩子结点。在这些孩子结点中,导致不可行解或导致非最优解的孩子结点被舍弃,其余孩子结点被一一加入活结点表中。 然后R自身成为死结点,从活结点表中取下一结点成为当前E-结点,重复上述结点扩展过程, 直到找到所需的解或活结点表为空时为止。,南京邮电大学计算机学院 2019/7/26,分枝限界法分类按活结点表的结构FIFO分枝限界法活结点表是队列;按队列的FIFO原则选取下一个结点为当前扩展结点;LIFO分枝限界法(D-检索)活结点表是栈;按栈的LIFO原则选取下一个结点为当前扩展结点;LC分枝限界法活结点表是优先权队列;按优先权队列中规定的结点优先级选
5、取优先级最高的下一个结点为当前扩展结点。,南京邮电大学计算机学院 2019/7/26,例9-1 FIFO分枝限界法求解4-皇后问题,图9-1 FIFO分枝限界法求第一个解,对于n-皇后问题, FIFO分枝限界法并不占优, 它搜索了31个结点, 而回溯法只搜索了16个结点。,南京邮电大学计算机学院 2019/7/26,程序9-1 分枝限界算法框架,Template void BranchBound(Node *t) /t指向空间状态树的根 LiveList * lst(mSize);Node *x, *E=t; /lst为活结点表,表中元素为指针类型 do for (对结点E的每个不受限的孩子)
6、 x=new Node; x-parent=E; /构造E的孩子结点xif (x是一个答案节点) 输出从x到t的一条路经; return; /算法终止 lst.Append(x); ,南京邮电大学计算机学院 2019/7/26,程序9-1 分枝限界算法框架(续),if (lst.IsEmpty() /搜索失败终止. cout“没有答案结点”; return; lst.Serve(E); while(1); ,南京邮电大学计算机学院 2019/7/26,分枝限界法与回溯法的异同,分枝限界法与回溯法的共同点 都是在问题的状态空间树上搜索问题解的算法。 都用活结点表实现, 都可用约束函数剪去不含答案
7、结点的分枝, 都可用限界函数剪去不含最优解的分枝.,南京邮电大学计算机学院 2019/7/26,分枝限界法与回溯法的异同(续),分枝限界法与回溯法的不同点 求解目标不同:回溯法的求解目标是找出解空间树中满足约束条件的所有可行解;而分支限界法的求解目标则是找出满足约束条件的一个可行解,或某种意义下的最优解。 搜索方式不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或最小耗费优先的方式搜索解空间树。,南京邮电大学计算机学院 2019/7/26,分枝限界法与回溯法的异同(续),分枝限界法与回溯法的不同点(续) 对当前扩展结点的扩展方式不同:回溯法中的每个活结点可能多次成为当前扩展结
8、点,纵深方向扩其一个孩子,然后再回溯后扩展其他孩子;而分支限界法中每一个活结点只有一次机会成为扩展结点,一次产生所有孩子结点,自身成为死结点,之后无需再返回该结点处。,南京邮电大学计算机学院 2019/7/26,9.1.2 LC分枝限界法,从活结点表中选择下一个E-结点时, 用活结点的搜索代价作为衡量各个结点优先权的标准。 一个答案结点X的搜索代价cost(X)定义为:从根结点开始,直到搜索到X为止所消耗的搜索时间。,南京邮电大学计算机学院 2019/7/26,定义4个相关函数:,代价函数c():从根结点到X的搜索代价。 若X是答案结点, 则c(X)是从根结点到X的搜索代价; 若X不是答案结点
9、且子树X上不含任何答案结点, 则c(X)=; 若X不是答案结点但子树X上包含答案结点, 则c(X)等于子树X上具有最小搜索代价的答案结点的代价。,南京邮电大学计算机学院 2019/7/26,T,U,X,Y,W,V,Z,Q,A,C,B,ans,ans,ans,设有三个答案结点A、B、C,则c(T)=c(X)=c(Y) =c(A)=cost(A),c(Z)=c(B)=cost(B),c(W)=c(Q)=c(C)=cost(C),c(U)=c(V)=,南京邮电大学计算机学院 2019/7/26,定义4个相关函数(续):,相对代价函数g():衡量一个结点X的相对代价。 衡量标准一:生成答案结点前,子树
10、X上需要生成的结点数目。 衡量标准二:子树X上离X最近的答案结点到X的路径长度;,南京邮电大学计算机学院 2019/7/26,T,Y,X,Z,A,C,B,ans,ans,ans,设A、B、C是答案结点,若采用标准一, 则g(X)=4, g(Y)=3, g(Z)=2, 于是算法首先找到答案结点C。,南京邮电大学计算机学院 2019/7/26,T,Y,X,Z,A,C,B,ans,ans,ans,设A、B、C是答案结点,若采用标准二, 则g(X)=1, g(Y)=g(Z)=2, 于是算法首先找到答案结点A。,结点代价和相对代价都难以计算,因此通常采用它们的估计值作为评价函数。,南京邮电大学计算机学院
11、 2019/7/26,定义4个相关函数(续):,相对代价估计函数 :估计结点X的相对代价是g()的估计值,是X到达一个答案结点所需代价的估计函数。一般地,若Y是X的孩子,则 。,南京邮电大学计算机学院 2019/7/26,以代价估计函数 最小的活结点作为下一个扩展结点(E-结点)的搜索策略称为最小成本检索,简称LC-检索。,南京邮电大学计算机学院 2019/7/26,9.1.3 15迷问题,问题描述:在一个44的方形棋盘上放置了15块编了号的牌,还剩下一个空格。号牌的一次合法移动是指将位于空格四周(上、下、左、右)的一块号牌移入空格位置的四种移动方式。,初始状态1,3,南京邮电大学计算机学院
12、2019/7/26,要求:对于任意给定的一种初始排列,通过一系列的合法移动,将其转换成目标排列:,目标状态,初始状态1,初始状态2,南京邮电大学计算机学院 2019/7/26,15迷问题游戏,初始状态2,7,11,12,成功啦,南京邮电大学计算机学院 2019/7/26,15迷问题游戏(续),初始状态1,5,11,怎么移动呢?,实际上,此状态不能到达目标状态。,南京邮电大学计算机学院 2019/7/26,关于问题实例的解,若从某个状态出发,经过一系列合法的号牌移动能够到达另一个状态,则称后者可由前者到达。 并非所有可能的状态作为初始状态都能到达目标状态。 一个44的棋盘有16!20.91012
13、种不同的排列。 对于任一给定的初始状态,它可以到达的其他状态只是其中的一半。 如果目标状态不包含在从某个初始状态出发可以到达的状态集合中,则该实例无解。,南京邮电大学计算机学院 2019/7/26,定理9-1,对给定的初始状态, 当且仅当 为偶数时,可以由此初始状态到达目标状态。 i, j:是空格的行、列号; Less(i):小于号牌i但被放在了i后的号牌的数目.,Less(4):小于号牌4的号牌有1,2,3, 但在其后只有一个号牌2,故Less(4)=1,目标状态,Less(12):小于号牌12的号牌有1-11, 但在其后有6个号牌,故Less(12)=6,=37+1+1=39 故此状态不能
14、到达目标状态。,南京邮电大学计算机学院 2019/7/26,三种搜索方式,第一种搜索方式采用FIFO分枝限界法,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,23,22,上,右,下,左,右,下,目标,搜索23个结点到达目标状态。,南京邮电大学计算机学院 2019/7/26,三种搜索方式(续),第二种搜索方式采用深度优先搜索,每次移动空格,都是按照上、右、下、左的顺序移动。,这种搜索方式离目标状态更远了!,南京邮电大学计算机学院 2019/7/26,三种搜索方式(续),第三种搜索方式使用代价估计函数 进行LC检索,f(X): 从根到结点X的路径长度;,结点2,南京邮电大
15、学计算机学院 2019/7/26,图9-6 LC检索实际生成的那部分状态空间树,左,右,上,右,下,下,左,1,下,上,2,4,5,10,11,12,22,23,目标,3,计算c(X),南京邮电大学计算机学院 2019/7/26,图9-6 LC检索实际生成的那部分状态空间,左,右,上,右,下,下,左,1,下,上,2,4,5,10,11,12,22,23,目标,按照上、右、下、左顺时针的顺序生成,3,南京邮电大学计算机学院 2019/7/26,9.2 求最优解的分枝限界法,南京邮电大学计算机学院 2019/7/26,分枝限界法用于求最优解时,需要使用上下界函数作为限界函数,剪去不含最优解的分枝。
16、 本节使用的代价函数,不再是搜索代价,而是一个与最优化问题的目标函数有关的值。,9.2.1 上下界函数,南京邮电大学计算机学院 2019/7/26,定义9-1 状态空间树上一个结点X的代价函数c()定义为:若X时答案结点,则c(X)为X所代表的可行解的目标函数值;若X为非可行解结点,则c(X)=;若X代表部分向量,则c(X)是以X为根的子树上具有最小代价的结点代价。这样定义的c(X)也是难以计算的。,南京邮电大学计算机学院 2019/7/26,上下界函数也是一种剪枝函数,起限界作用。在求解最优化问题时,它可以进一步压缩所需生成的状态空间树的结点数目。,南京邮电大学计算机学院 2019/7/26
17、,基于上下界函数的分枝限界法的限界方法:要求U的初值大于最优解的代价,并在搜索状态空间树的过程中不断修正U的值。对于某个结点X,U的值可以按下列原则修正: (1)如果X是答案结点,cost(X)是X所代表的可行解的目标函数,u(X)是该子树上最小代价答案结点的上界值,则U=mincost(X),u(X)+,U; (2)如果是代表部分向量,则U=minu(X)+,U;,南京邮电大学计算机学院 2019/7/26,9.2.2 FIFO分枝限界法,南京邮电大学计算机学院 2019/7/26,南京邮电大学计算机学院 2019/7/26,9.2.3 LC分枝限界法,南京邮电大学计算机学院 2019/7/
18、26,南京邮电大学计算机学院 2019/7/26,9.3 带时限的作业排序,南京邮电大学计算机学院 2019/7/26,问题描述设有n个作业和一台处理机,每个作业所需的处理时间、要求的时限和收益用三元组(pi,di,ti),0in表示,其中作业i所需时间为ti,如果作业i能够在时限di内完成,将可收益pi,求使得总收益最大的作业子集J。,9.3.1 问题描述,南京邮电大学计算机学院 2019/7/26,例9-1,设有带时限的作业排序实例: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
19、,1), 求使得总收益最大的作业子集J。 最大收益子集为J=(2,1) 最大收益为16。,作业1,作业2,作业0,作业3,南京邮电大学计算机学院 2019/7/26,例9-1(续),(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=(2,1) 最大收益为16。,作业1,作业2,作业0,作业3,J=(1,2),?,?,南京邮电大学计算机学院 2019/7/26,9.3.2 分枝限界法求解,采用可变大小元组(x0,x1,xk)表示解。,隐式约束:对于选入子集J的作业(x0,
20、x1,xk),存在着一种作业排列使J中作业均能如期完成。,目标函数:使总收益 最大的作业子集是最优解。 或者:未能入选子集J的作业所造成的损失最小,即为,南京邮电大学计算机学院 2019/7/26,上下界函数,设X是状态空间树上的一个结点,J=(x0,x1,xk)是已入选的作业子集,它代表一条从根到X的路径。,实际上是由作业子集(x0, x1, xk)中,迄今为止未能入选J的作业所造成的损失。,南京邮电大学计算机学院 2019/7/26,可变大小元组状态空间树,x0=0,1,2,6,7,12,13,8,14,3,9,10,15,4,11,5,x0=3,x0=1,x0=2,x1=3,x1=1,x
21、1=2,x2=3,x2=2,x2=3,x2=3,x1=3,x1=3,x1=2,(p0,d0,t0)=(5,1,1) (p1,d1,t1)=(10,3,2) (p2,d2,t2)=(6,2,1) (p3,d3,t3)=(3,1,1),南京邮电大学计算机学院 2019/7/26,例如: (p0,d0,t0)=(5,1,1), (p1,d1,t1)=(10,3,2),(p2,d2,t2)=(6,2,1), (p3,d3,t3)=(3,1,1),南京邮电大学计算机学院 2019/7/26,显然,该值是在X处可以预见的最大损失。,上下界函数(续),上界函数:,迄今为止未入选J的作业所造成的损失。,假定作
22、业xk以后所有作业都未入选所造成的损失。,南京邮电大学计算机学院 2019/7/26,例如: (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, x0=0, =p1+p2+p3=19,J=1, x0=1, =p0+p2+p3=14,J=2, x0=2, =p0+p1+p3=18,J=3, x0=3, =p0+p1+p2=21,南京邮电大学计算机学院 2019/7/26,可变大小元组状态空间树,x0=0,1,2,6,7,12,13,8,14,3,9,10,15,4,11,5,x0=
23、3,x0=1,x0=2,x1=3,x1=1,x1=2,x2=3,x2=2,x2=3,x2=3,x1=3,x1=3,x1=2,u(2)=19,u(3)=14,u=9,c=8,u(4)=18,u(5)=21,南京邮电大学计算机学院 2019/7/26,图9-7 可变大小元组状态空间树,x0=0,1,2,6,7,12,13,8,14,3,9,10,15,4,11,5,c=8,x0=3,x0=1,x0=2,U=24,x1=3,x1=1,x1=2,x2=3,x2=2,x2=3,x2=3,x1=3,x1=3,x1=2,u=19,u=14,u=9,c=8,(p0,d0,t0)=(5,1,1) (p1,d1,
24、t1)=(10,3,2) (p2,d2,t2)=(6,2,1) (p3,d3,t3)=(3,1,1),= =5+10+6+3,u=18,u=21,U=19,由于u=19U=24 故修正U=19,由于u=14U=19 故修正U=14,U=14,同理,X=5被剪枝,用程序9-2的FIFOBB搜索,南京邮电大学计算机学院 2019/7/26,图9-7 可变大小元组状态空间树,x0=0,1,2,6,7,12,13,8,14,3,9,10,15,4,11,5,c=8,x0=3,x0=1,x0=2,U=24,x1=3,x1=1,x1=2,x2=3,x2=2,x2=3,x2=3,x1=3,x1=3,x1=2
25、,u=19,u=14,u=9,c=8,(p0,d0,t0)=(5,1,1) (p1,d1,t1)=(10,3,2) (p2,d2,t2)=(6,2,1) (p3,d3,t3)=(3,1,1),u=18,u=21,U=14,X=2出队,成为E-结点。,U=9,由于u=9U=14 故修正U=9,同理,X=8被剪枝,X=3出队,成为E-结点。,U=8,由于u=8U=9 故修正U=8,用程序9-2的FIFOBB搜索,南京邮电大学计算机学院 2019/7/26,图9-7 可变大小元组状态空间树,x0=0,1,2,6,7,12,13,8,14,3,9,10,15,4,11,5,c=8,x0=3,x0=1,
26、x0=2,U=24,x1=3,x1=1,x1=2,x2=3,x2=2,x2=3,x2=3,x1=3,x1=3,x1=2,u=19,u=14,u=9,c=8,(p0,d0,t0)=(5,1,1) (p1,d1,t1)=(10,3,2) (p2,d2,t2)=(6,2,1) (p3,d3,t3)=(3,1,1),用程序9-2的FIFOBB搜索,u=18,u=21,X=6出队,成为E-结点。,结点12,13不可能是答案结点,被剪枝,U=8,X=9出队,成为E-结点(此时队列为空) 。,J=(1,2)为最优解!,最优解值为16, 最小损失为8。,南京邮电大学计算机学院 2019/7/26,9.3.3
27、带时限作业排序算法,函数JSFIFOBB()采用程序9-2的算法框架,构造状态空间树,求最优解的值。要求作业事先已按时限的非减次序排列。 函数GenerateAns()根据JSFIFOBB()生成的状态空间树,产生问题的最优解(x0,x1,xk),k是解向量长度。,带时限作业排序算法FIFO分枝限界法,南京邮电大学计算机学院 2019/7/26,程序9-4 带时限作业排序算法,struct Node Node(Node *par, int k) parent=par; j=k; Node *parent; /指向该结点的双亲结点int j; /该结点代表的解分量xi=j ;,状态空间树结点结构
28、,南京邮电大学计算机学院 2019/7/26,程序9-4 带时限作业排序算法(续),template struct qNode qNode()qNode(T p, T los, int sd, int k, Node *pt) prof=p; loss=los; d=sd; ptr=pt; j=k; /当前结点X的下界函数c(X)=lossT prof, loss; /上界函数u(X)=24-profint j, d; /活结点所代表分量xj=j, d是迄今为止的时间Node *ptr; /指向状态空间树中相应的结点 ;,活结点表中的活结点结构,南京邮电大学计算机学院 2019/7/26,程序
29、9-4 带时限作业排序算法(续),template class JS public:JS(T *prof, int *de, int *time, int size);T JSFIFOBB();void GenerateAns(int *x, int ,JS类,南京邮电大学计算机学院 2019/7/26,程序9-4 带时限作业排序算法(续),template T JS:JSFIFOBB() Node *E,*child;SeqQueue q(mSize); /生成队列E=root=new Node(NULL,-1); /构造根结点qNode ep(0,0,0,-1,root); /ep为扩展结
30、点qNode ec; T U=total; /U是上界变量,JSFIFOBB()函数的实现,南京邮电大学计算机学院 2019/7/26,程序9-4 带时限作业排序算法(续),while(1) /loss为已造成的损失, prof为已获收益 T loss=ep.loss, prof=ep.prof; E=ep.ptr; for(int j=ep.j+1; jn; j+) /考察所有孩子 if(ep.d+tj=dj ,JSFIFOBB()函数的实现(续),南京邮电大学计算机学院 2019/7/26,程序9-4 带时限作业排序算法(续),do if(q.IsEmpty()return total=U
31、; /返回最小损失值q.Front(ep); /选择下一个扩展结点q.Serve();while(ep.loss=U); ,JSFIFOBB()函数的实现(续),南京邮电大学计算机学院 2019/7/26,程序9-4生成的状态空间树结构,1 -1 -1,NodeNum parent j,(x0, x1)=(2, 3),(p0,d0,t0)=(5,1,1) (p1,d1,t1)=(10,3,2) (p2,d2,t2)=(6,2,1) (p3,d3,t3)=(3,1,1),(p0,d0,t0)=(5,1,1) (p1,d1,t1)=(3,1,1) (p2,d2,t2)=(6,2,1) (p3,d3,t3)=(10,3,2),作业按时限的非减次序排列。,南京邮电大学计算机学院 2019/7/26,9.5 旅行商问题,9.5.1. 问题描述,旅行商问题:一个旅行商准备到n个村庄售货,他从A村出发经过其他n-1个村庄,又回到出发地,要求一条最短路径,使得每个村庄都经过且仅经过一次,