《算法设计与分析》第09章概要优秀PPT.ppt
《《算法设计与分析》第09章概要优秀PPT.ppt》由会员分享,可在线阅读,更多相关《《算法设计与分析》第09章概要优秀PPT.ppt(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、算法设计与分析算法设计与分析DeSign and Analysis of AlgorithmsIn C+“十一五十一五”国家级规划教国家级规划教材材 陈慧南陈慧南陈慧南陈慧南 编著编著编著编著电子工业出版社电子工业出版社电子工业出版社电子工业出版社第第2部分部分 算法设计策略算法设计策略第第9章章 分枝限界法分枝限界法 学习要点学习要点理解分支限界法的剪枝搜寻策略。驾驭分支限界法的算法框架队列式(FIFO)分支限界法优先队列式(LC)分支限界法 通过应用实例学习分支限界法的设计策略。15谜问题0-1背包问题;旅行商问题批处理作业调度问题概念回顾概念回顾活结点搜寻过程中,一个自身已生成但其孩子结
2、点尚未生成的结点叫做活结点扩展结点:一个正在产生孩子的结点死结点一个全部孩子已经产生的结点问题状态、候选解、答案状态分支限界法一般方法分支限界法一般方法分支限界法与回溯法的区分:分支限界法=宽度优先搜寻+剪枝。在分支限界法中,从根结点起先,每一个扩展结点,一次性产生其全部孩子结点。在这些孩子结点中,导致不行行解或导致非最优解的孩子结点被舍弃,其余孩子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程始终持续到找到所需的解或活结点表为空时为止。分支限界法一般方法分支限界法一般方法设计策略(依据活结点表的类型划分)FIFO分支限界法:活结点接受一张
3、先进先出表LIFO分支限界法:活结点接受一张先进后出表LC分支限界法:活结点接受优先权队列依据优先队列中规定的优先权选取优先权最高的结点成为当前扩展结点。最大优先队列(最大堆):体现最大效益优先最小优先队列(最小堆):体现最小费用优先求求4皇后问题第一个解皇后问题第一个解FIFO分支限界法生成的状态树1 1 1 12 2 2 23 3 3 34 4 4 45 5 5 56 6 6 67 7 7 78 8 8 89 9 9 910101010111111111212121213131313141414141515151516161616171717171818181822222222262626
4、263030303031313131参考参考参考参考图图图图8-38-38-38-3图图图图8-68-68-68-6存在性问题存在性问题-分枝限界法算法框架分枝限界法算法框架树结点的数据结构/状态空间树接受树的双亲表示法,parent是指向其双亲的指针template struct Node T cost;Node*parent;活结点表的类型记为 LiveList FIFO/LIFO/优选权队列存在性问题存在性问题 分枝限界法算法框架分枝限界法算法框架template void BranchBound(Node*t)/ttemplate void BranchBound(Node*t)/t是
5、指向空间树的根结点是指向空间树的根结点 LiveListNode*lst(mSize);/lst LiveListNode*lst(mSize);/lst为活结点表,元素指向树结点为活结点表,元素指向树结点 Node*x,*E=t;Node*x,*E=t;/E /E为指向扩展结点的指针,初始指向为指向扩展结点的指针,初始指向t t do /do /以下描述中不区分指针与其所指示的结点以下描述中不区分指针与其所指示的结点 for(for(对结点对结点E E的每个不受限的孩子的每个不受限的孩子)x=new Node;x-parent=E;x=new Node;x-parent=E;/构造构造E E
6、的孩子结点的孩子结点x x if(x if(x是一个答案结点是一个答案结点)输出从输出从x x到到t t的一条路径;的一条路径;return;return;/输出第一个解后算法终止输出第一个解后算法终止 lst.Append(x);lst.Append(x);/孩子结点孩子结点x x进活结点表进活结点表 if(lst.IsEmpty()if(lst.IsEmpty()cout “cout “没有答案结点没有答案结点”;return return;/搜寻失败终止搜寻失败终止 lst.Serve(E);lst.Serve(E);/从表中输出一个活结点为从表中输出一个活结点为E-E-结点结点 whi
7、le while(1 1););LC分支限界法分支限界法在LIFO和FIFO分枝-限界法中,对下一个E-结点的选择规则死板,在某种意义上是盲目的搜寻。LC分支限界法在选择活结点时依据活结点的优先权来选择下一代活结点结点优先权定义为:“在其分支下搜寻一个答案状态须要花费在代价,代价越小,越优先”LC分支限界法分支限界法结点代价相关概念结点代价相关概念代价函数代价函数c(.)c(.):表示从根结点搜寻到:表示从根结点搜寻到X X,以及在,以及在X X之下搜寻到一个答案状态所需的代价。如下定义之下搜寻到一个答案状态所需的代价。如下定义若若X X是答案结点,则是答案结点,则c(X)c(X)是由空间树根
8、到结点是由空间树根到结点X X的的代价;代价;若若X X不是答案结点且子树不是答案结点且子树X X不包含任何答案结点,不包含任何答案结点,则则c(X)=c(X)=;否则否则c(X)c(X)等于子树等于子树X X中具有最小代价的答案结点中具有最小代价的答案结点的代价。的代价。代价函数犹如一个代价函数犹如一个“有智力的有智力的”排序函数,基于排序函数,基于其值选取下一个其值选取下一个E-E-结点往往可以加快到达一答案结点往往可以加快到达一答案结点的速度。结点的速度。LC分支限界法分支限界法结点代价相关概念相对代价函数g(.):衡量子树X下搜寻到一个答案状态所需的代价。对随意结点X,可用两种标准来量
9、度一个结点X的相对代价:在生成一个答案结点之前,子树X须要生成的结点数在子树X中离X最近的那个答案结点到X的路径长度结点代价相关概念结点代价相关概念代价函数与相对代价函数o o设以下两个树设以下两个树A B C A B C 均为答案结点且均为答案结点且c(A)c(B)c(C)c(A)c(B)0,p0,pi i0,(0i0,(0in)解空间解空间解向量:解向量:(x(x0 0,x,x1 1,x,xn-1n-1)约束条件:约束条件:x xi i 0,1;w 0,1;wi ix xi i M M目标函数:目标函数:cost(X)=pcost(X)=pi ix xi i 代价函数代价函数c(X):c(
10、X):若若X X是答案结点,是答案结点,c(X)=cost(X)c(X)=cost(X)若若X X是叶子结点,但非答案结点,是叶子结点,但非答案结点,c(X)=-c(X)=-若若X X是中间结点,则是中间结点,则 c(X)=max c(lChild(X),c(rChild(X)c(X)=max c(lChild(X),c(rChild(X)0/1背包问题背包问题上、下界函数UBB(X)、LBB(X)设结点设结点X X对应的部分解为对应的部分解为(x(x0 0,x,x1 1,x,xk-1k-1)设物品按单位收益由大到小设物品按单位收益由大到小编号,即编号,即p(i)/w(i)p(i+1)/w(i
11、+1)p(i)/w(i)p(i+1)/w(i+1)到状态到状态X X时,背包剩余载重时,背包剩余载重cucu以以X X为根的子树可视为背包载为根的子树可视为背包载重为重为cucu,剩余物品组成的,剩余物品组成的0/10/1背背包问题的状态空间树。包问题的状态空间树。0/1背包问题背包问题记当背包载重为记当背包载重为cucu,剩余物品,剩余物品组成的一般背包问题的最优解为组成的一般背包问题的最优解为(z(zk k,z,zk+1k+1,z,zn-1n-1)。记当背包载重为记当背包载重为cucu,剩余物品,剩余物品组成的组成的0/10/1背包问题的最优解为背包问题的最优解为(x(xk k,x,xk+
12、1k+1,x,xn-1n-1)记当背包载重为记当背包载重为cucu,剩余物品,剩余物品组成的组成的0/10/1背包问题的一个可行背包问题的一个可行解为解为(y(yk k,y,yk+1k+1,y,yn-1n-1)有:有:有:有:zzi ip pi i x xi ip pi i yyi ip pi i0/1背包问题背包问题定义下界函数定义下界函数 LBB(X)=LBB(X)=xipi+yipixipi+yipi定义上界函数定义上界函数 UBB(X)=UBB(X)=xipi+zipixipi+zipi算法实现:算法实现:算法中运用下界变量算法中运用下界变量L L,用于记录迄今为止搜寻到,用于记录迄今
13、为止搜寻到的全部可行解中的最小值的全部可行解中的最小值对任一结点对任一结点X X,若,若UBB(X)LUBB(X)L,则剪去,则剪去X X子树。子树。L L的修正公式的修正公式:若若X X是答案结点是答案结点,L=maxcost(X),L,LBB(X)-e,L=maxcost(X),L,LBB(X)-e否则否则 L=maxL,LBB(X)-e L=maxL,LBB(X)-e有:有:有:有:zzi ip pi i x xi ip pi i yyi ip pi i0/1背包问题的背包问题的LC分枝限界算法分枝限界算法树结点:struct Nodestruct Node/状态空间树结点状态空间树结点
14、Node(Node*par,bool lft)Node(Node*par,bool lft)parent=par;left=lft;parent=par;left=lft;Node*parent;Node*parent;/指向双亲结点的指针指向双亲结点的指针bool left;bool left;/若是双亲的左孩子结点,则取真值,否则为假若是双亲的左孩子结点,则取真值,否则为假;优先权队列中的元素:pqNode0/1背包问题的背包问题的LC分枝限界算法分枝限界算法优先权队列中的元素:优先权队列中的元素:pqNodepqNodetemplate struct pqNodetemplate str
15、uct pqNode /活结点结构活结点结构operator T()const return UBB;operator T()const return UBB;/以以UBBUBB为优先权为优先权pqNode()pqNode()pqNode(float cap,T prof,T ub,int lev,Node*p)pqNode(float cap,T prof,T ub,int lev,Node*p)/构造构造cu=cap;profit=prof;cu=cap;profit=prof;UBB=ub;UBB=ub;level=lev;ptr=p;level=lev;ptr=p;float cu;f
16、loat cu;/背包的剩余载重背包的剩余载重T profit,UBB;T profit,UBB;/已获收益已获收益profitprofit和上界函数值和上界函数值UBBUBB(优先权)(优先权)int level;int level;/当前结点的当前结点的levellevel,根结点为,根结点为0 0Node*ptr;Node*ptr;/指向状态空间树上相应的结点指向状态空间树上相应的结点;0/1背包问题的背包问题的LC分枝限界算法分枝限界算法背包类:背包类:template class Knapsacktemplate class Knapsackpublic:public:Knapsac
17、k(T*prof,float*wei,float mm,int len);Knapsack(T*prof,float*wei,float mm,int len);/初始化初始化 T LCBB();T LCBB();/LC/LC搜寻求最优解值搜寻求最优解值 void GenerateAns(int*x);void GenerateAns(int*x);/产生最优解产生最优解private:private:void LUBound(T cp,float cw,int k,T&LBB,T&void LUBound(T cp,float cw,int k,T&LBB,T&UBB);/UBB);/计算计
18、算UBBUBB和和LBBLBBT*p;T*p;/一维数组一维数组p p保存保存n n个物品个物品收益收益float*w,m;float*w,m;/一维数组一维数组w w保存保存n n个物品重量,个物品重量,m m为背包载重为背包载重int n;int n;/物品数目物品数目Node*ans,*root;Node*ans,*root;/指向状态空间树的根和最优解指向状态空间树的根和最优解结点结点;0/1背包问题的背包问题的LC分枝限界算法分枝限界算法背包类中求上下界函数背包类中求上下界函数template template void Knapsack:LUBound(T cp,float cw,
19、int k,T&LBB,T&UBB)void Knapsack:LUBound(T cp,float cw,int k,T&LBB,T&UBB)LBB=cp;float c=cw;LBB=cp;float c=cw;/已获收益和剩余载重已获收益和剩余载重for(int i=k;in;i+)for(int i=k;in;i+)/考察剩余物品考察剩余物品 if(cwi)if(cwi)UBB=LBB+c*pi/wi;/UBB=LBB+c*pi/wi;/计算计算UBBUBB:一般背包的最:一般背包的最优解值优解值 for(int j=i+1;jn;j+)for(int j=i+1;j=wj)if(c=
20、wj)c=c-wj;LBB=LBB+pj;c=c-wj;LBB=LBB+pj;return;return;c=c-wi;LBB=LBB+pi;c=c-wi;LBB=LBB+pi;UBB=LBB;UBB=LBB;/剩余物品全部装入时,有剩余物品全部装入时,有LBB=UBBLBB=UBB 留意物品编号方式留意物品编号方式留意物品编号方式留意物品编号方式0/1背包问题的背包问题的LC分枝限界算法分枝限界算法背包类中的背包类中的LCBBLCBB方法方法template template T Knapsack:LCBB()T Knapsack:LCBB()Node*child,*E;Node*child
21、,*E;T LBB,UBB,L;T LBB,UBB,L;ans=NULL;ans=NULL;PrioQueuepqNode pq(mSize);PrioQueuepqNode pq(mSize);/生成一个优先权队列实例生成一个优先权队列实例root=new Node(NULL,false);root=new Node(NULL,false);/构造状态空间树的根结点构造状态空间树的根结点E=root;E=root;LUBound(0,m,0,LBB,UBB);LUBound(0,m,0,LBB,UBB);/计算根结点的计算根结点的LBBLBB和和UBBUBBpqNode e(m,0,UBB,
22、0,root);pqNode e(m,0,UBB,0,root);/根结点成为根结点成为E E结点结点L=LBB-epsilon;L=LBB-epsilon;/下界变量下界变量L L的初值为的初值为LBB-epsilonLBB-epsilondo do int k=e.level;float cap=e.cu;T prof=e.profit;E=e.ptr;int k=e.level;float cap=e.cu;T prof=e.profit;E=e.ptr;if(k=n)&(profL)if(k=n)&(profL)/记录答案结点,修正记录答案结点,修正L LL=prof;ans=E;L=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法设计与分析 算法 设计 分析 09 概要 优秀 PPT
限制150内