《算法设计与分析》第09章概要.ppt
《《算法设计与分析》第09章概要.ppt》由会员分享,可在线阅读,更多相关《《算法设计与分析》第09章概要.ppt(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、算法设计与分析算法设计与分析DeSign and Analysis of AlgorithmsIn C+“十一五十一五”国家级规划教国家级规划教材材 陈慧南陈慧南陈慧南陈慧南 编著编著编著编著电子工业出版社电子工业出版社电子工业出版社电子工业出版社第第2部分部分 算法设计策略算法设计策略第第9章章 分枝限界法分枝限界法 学习要点学习要点理解分支限界法的剪枝搜索策略。掌握分支限界法的算法框架1.队列式队列式(FIFO)(FIFO)分支限界法分支限界法2.优先队列式优先队列式(LC)(LC)分支限界法分支限界法 通过应用实例学习分支限界法的设计策略。1.1515谜问题谜问题2.0-10-1背包问题
2、;背包问题;3.旅行商问题旅行商问题4.批处理作业调度问题批处理作业调度问题概念回顾概念回顾活结点搜索过程中,一个自身已生成但其孩子结点尚未搜索过程中,一个自身已生成但其孩子结点尚未生成的结点叫做活结点生成的结点叫做活结点扩展结点:一个正在产生孩子的结点一个正在产生孩子的结点死结点一个所有孩子已经产生的结点一个所有孩子已经产生的结点问题状态、候选解、答案状态分支限界法一般方法分支限界法一般方法分支限界法与回溯法的区别:分支限界法分支限界法 =宽度优先搜索宽度优先搜索 +剪枝剪枝 。在分支限界法中,从根结点开始,每一个扩展结点,一次性产生其所有孩子结点。在这些孩子结点中,导致不可行解或导致非最优
3、解的孩子结点被舍弃,其余孩子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。分支限界法一般方法分支限界法一般方法设计策略(根据活结点表的类型划分)FIFOFIFO分支限界法:活结点采用一张先进先出表分支限界法:活结点采用一张先进先出表LIFOLIFO分支限界法:活结点采用一张先进后出表分支限界法:活结点采用一张先进后出表LCLC分支限界法:活结点采用优先权队列分支限界法:活结点采用优先权队列按照优先队列中规定的优先权选取优先权最高的结点成为当前扩展结点。o最大优先队列(最大堆):体现最大效益优先o最
4、小优先队列(最小堆):体现最小费用优先求求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 910101010111111111212121213131313141414141515151516161616171717171818181822222222262626263030303031313131参考参考参考参考图图图图8-38-38-38-3图图图图8-68-68-68-6存在性问题存在性问题-分枝限界法算法框架分枝限界法算法框架树结点的数据结构/状态
5、空间树采用树的双亲表示法,状态空间树采用树的双亲表示法,parentparent是指向其双亲的指针是指向其双亲的指针template template structstruct Node Node T cost;T cost;Node*parent;Node*parent;活结点表的类型记为 LiveList FIFO/LIFO/FIFO/LIFO/优选权队列优选权队列存在性问题存在性问题 分枝限界法算法框架分枝限界法算法框架template void template void BranchBound(NodeBranchBound(Node*t)*t)/t/t是指向空间树的根结点是指向空间
6、树的根结点 LiveListLiveListNode*Node*lst(mSizelst(mSize););/lstlst为活结点表,元素指向树结点为活结点表,元素指向树结点 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的孩子结点的孩子结点x x if(x
7、 if(x是一个答案结点是一个答案结点 )输出从输出从x x到到t t的一条路径;的一条路径;return;return;/输出第一个解后算法终止输出第一个解后算法终止 lst.Append(xlst.Append(x););/孩子结点孩子结点x x进活结点表进活结点表 if(lst.IsEmptyif(lst.IsEmpty()()coutcout “没有答案结点没有答案结点”;returnreturn;/搜索失败终止搜索失败终止 lst.Serve(Elst.Serve(E););/从表中输出一个活结点为从表中输出一个活结点为E-E-结点结点 whilewhile(1 1););LC分支限
8、界法分支限界法在LIFO和FIFO分枝-限界法中,对下一个E-结点的选择规则死板,在某种意义上是盲目的搜索。LC分支限界法在选择活结点时根据活结点的优先权来选择下一代活结点结点优先权定义为:结点优先权定义为:“在其分支下搜索一个答案在其分支下搜索一个答案状态需要花费在代价,代价越小,越优先状态需要花费在代价,代价越小,越优先”LC分支限界法分支限界法结点代价相关概念结点代价相关概念代价函数代价函数代价函数代价函数c(.)c(.)c(.)c(.):表示从根结点搜索到:表示从根结点搜索到X X,以及在,以及在X X之下搜之下搜索到一个答案状态所需的代价。如下定义索到一个答案状态所需的代价。如下定义
9、1.1.若若X X是答案结点,则是答案结点,则c(Xc(X)是由空间树根到结点是由空间树根到结点X X的代价;的代价;2.2.若若X X不是答案结点且子树不是答案结点且子树X X不包含任何答案结点,则不包含任何答案结点,则c(Xc(X)=)=;3.3.否则否则c(Xc(X)等于子树等于子树X X中具有最小代价的答案结点的代价。中具有最小代价的答案结点的代价。代价函数如同一个代价函数如同一个“有智力的有智力的”排序函数,基于其值排序函数,基于其值选取选取下一个下一个E-E-结点往往可以加快到达一答案结点的速度。结点往往可以加快到达一答案结点的速度。LC分支限界法分支限界法结点代价相关概念相对代价
10、函数相对代价函数相对代价函数相对代价函数g(.)g(.):衡量子树:衡量子树X X下搜索到一个答下搜索到一个答案状态所需的代价。案状态所需的代价。对任意结点X,可用两种标准来量度一个结点X的相对代价:1.在生成一个答案结点之前,子树X需要生成的结点数2.在子树X中离X最近的那个答案结点到X的路径长度结点代价相关概念结点代价相关概念代价函数与相对代价函数o设以下两个树A B 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
11、 i M M目标函数:目标函数:cost(Xcost(X)=)=p pi ix xi i 代价函数代价函数c(Xc(X):):若若X X是答案结点,是答案结点,c(Xc(X)=)=cost(Xcost(X)若若X X是叶子结点,但非答案结点,是叶子结点,但非答案结点,c(Xc(X)=-)=-若若X 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)设物品按单位收益由大到小设物品按单位收益由大到小
12、编号,即编号,即p(i)/w(i)p(i+1)/w(i+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背包问题
13、的最优解为背包问题的最优解为(x(xk k,x,xk+1k+1,x,xn-1n-1)记当背包载重为记当背包载重为cucu,剩余物品,剩余物品组成的组成的0/10/1背包问题的一个可行背包问题的一个可行解为解为(y(yk k,y,yk+1k+1,y,yn-1n-1)有:有:有:有:z zi ip pi i x xi ip pi i y yi ip pi i0/1背包问题背包问题定义下界函数定义下界函数 LBB(X)=LBB(X)=x xi ip pi i+y yi ip pi i定义上界函数定义上界函数 UBB(X)=UBB(X)=x xi ip pi i+z zi ip pi i算法实现:算法
14、实现:算法中使用下界变量算法中使用下界变量L L,用于记录迄今为止搜索到的所有,用于记录迄今为止搜索到的所有可行解中的最小值可行解中的最小值对任一结点对任一结点X X,若,若UBB(X)LUBB(X)L,则剪去,则剪去X X子树。子树。L L的修正公式的修正公式:若X是答案结点,L=maxcost(X),L,LBB(X)-e否则 L=maxL,LBB(X)-e有:有:有:有:z zi ip pi i x xi ip pi i y yi ip pi i0/1背包问题的背包问题的LC分枝限界算法分枝限界算法树结点:structstruct Node Node/状态空间树结点状态空间树结点Node(
15、NodeNode(Node*par,boolpar,bool lftlft)parent=par;left=parent=par;left=lftlft;Node*parent;Node*parent;/指向双亲结点的指针指向双亲结点的指针boolbool left;left;/若是双亲的左孩子结点,则取真值,否则为假若是双亲的左孩子结点,则取真值,否则为假;优先权队列中的元素:pqNode0/1背包问题的背包问题的LC分枝限界算法分枝限界算法优先权队列中的元素:优先权队列中的元素:pqNodepqNodetemplate template structstruct pqNodepqNode
16、/活结点结构活结点结构operator operator T()constT()const return UBB;return UBB;/以以UBBUBB为优先权为优先权pqNodepqNode()()pqNode(floatpqNode(float cap,Tcap,T prof,Tprof,T ub,intub,int lev,Nodelev,Node*p)*p)/构造构造cu=cu=cap;profitcap;profit=profprof;UBB=UBB=ubub;level=level=levlev;ptrptr=p;=p;float cu;float cu;/背包的剩余载重背包的剩
17、余载重T T profit,UBBprofit,UBB;/已获收益已获收益profitprofit和上界函数值和上界函数值UBBUBB(优先权)(优先权)intint level;level;/当前结点的当前结点的levellevel,根结点为,根结点为0 0Node*Node*ptrptr;/指向状态空间树上相应的结点指向状态空间树上相应的结点;0/1背包问题的背包问题的LC分枝限界算法分枝限界算法背包类:背包类:template class Knapsacktemplate class Knapsackpublic:public:Knapsack(TKnapsack(T*prof,floa
18、tprof,float*wei,floatwei,float mm,intmm,int lenlen););/初始化初始化 T LCBB();T LCBB();/LC/LC搜索求最优解值搜索求最优解值 void void GenerateAns(intGenerateAns(int*x);*x);/产生最优解产生最优解private:private:void void LUBound(TLUBound(T cp,floatcp,float cw,intcw,int k,Tk,T&LBB,T&UBB);&LBB,T&UBB);/计算计算UBBUBB和和LBBLBBT*p;T*p;/一维数组一维数
19、组p p保存保存n n个物品收益个物品收益float*float*w,mw,m;/一维数组一维数组w w保存保存n n个物品重量,个物品重量,m m为背为背包载重包载重intint n;n;/物品数目物品数目Node*Node*ansans,*root;,*root;/指向状态空间树的根和最优解结点指向状态空间树的根和最优解结点;0/1背包问题的背包问题的LC分枝限界算法分枝限界算法背包类中求上下界函数背包类中求上下界函数template template void Knapsack:void Knapsack:LUBound(TLUBound(T cp,floatcp,float cw,in
20、tcw,int k,Tk,T&LBB,T&UBB)&LBB,T&UBB)LBB=cp;float c=LBB=cp;float c=cwcw;/已获收益和剩余载重已获收益和剩余载重for(for(intint i=i=k;ik;i n;in;i+)+)/考察剩余物品考察剩余物品 if(cif(c wiwi)UBB=UBB=LBB+cLBB+c*pi/wipi/wi;/计算计算UBBUBB:一般背包的最优解值:一般背包的最优解值 for(intfor(int j=i+1;j j=i+1;j=wjwj)c=c=c-wj;LBBc-wj;LBB=LBB+pjLBB+pj;return;return;
21、c=c=c-wi;LBBc-wi;LBB=LBB+piLBB+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,*E;T LBB,UBB,L;T LBB,UBB,L;ansans=NULL;=NULL;PrioQueue
22、PrioQueue pqNodepqNode pq(mSizepq(mSize););/生成一个优先权队列实例生成一个优先权队列实例root=new root=new Node(NULL,falseNode(NULL,false););/构造状态空间树的根结点构造状态空间树的根结点E=root;E=root;LUBound(0,m,0,LBB,UBB);LUBound(0,m,0,LBB,UBB);/计算根结点的计算根结点的LBBLBB和和UBBUBBpqNodepqNode e(m,0,UBB,0,root);e(m,0,UBB,0,root);/根结点成为根结点成为E E结点结点L=LBB
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法设计与分析 算法 设计 分析 09 概要
限制150内