网站大量收购独家精品文档,联系QQ:2885784924

算法第六章.ppt

  1. 1、本文档共83页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法第六章资料

例: n=3, (p1,p2,p3)=(1,2,5) ,(w1,w2,w3)=(2,3,4), M=6 S0={(0,0)} 将(p1,w1)=(1,2)加到S0的序偶(0,0)上, 得S11={(1,2)} S0 和S11归并, 得S1 ={(0,0),(1,2)} 将(p2,w2)=(2,3)加到S1的序偶(0,0)和(1,2)上, 得S21={(2,3),(3,5)} S1 和S21归并, 得S2 ={(0,0),(1,2),(2,3),(3,5)} 将(p3,w3)=(5,4)加到S2的4个序偶上, 得S31={(5,4),(6,6),(7,7),(8,9)} S2 和S31归并, 根据支配规则删去(3,5), 并将WM的那些序偶除掉, 得S3 ={(0,0),(1,2),(2,3),(5,4),(6,6)} 实例求解过程 再判断留在Sn-1的序偶(Pl,Wl)或(Pl-pn,Wl-wn)是否属于Sn-2以确定xn-1的取值。 例: S1 ={(0,0),(1,2)} S2 ={(0,0),(1,2),(2,3),(3,5)} S3 ={(0,0),(1,2),(2,3),(5,4),(6,6)} S3的最末序偶(Pl,Wl)=(6,6) 如果已找到 Sn 的最末序偶(Pl,Wl), 那么使∑pixi=Pl , ∑wixi=Wl 的x1,…,xn的决策值可通过检索 Si 来确定 若(Pl,Wl)∈Sn-1,则xn=0; 若(Pl,Wl) Sn-1,且(Pl-pn,Wl-wn)∈Sn-1,则xn=1; (6,6) S2, 并且(6-p3,6-w3)=(1,2) ∈S2 , 所以x3=1 再判断留在S2的序偶(1,2), 因(1,2) ∈S1 , 所以x2=0 (1,2) S0 , (1-p1,2-w1)=(0,0)∈S0,所以x1=1 最优解fn(M)的最优决策序列是(x1,x2,x3)=(1,0,1) 0/1背包问题非形式化的DKP算法 procedure DKP(p,w,n,M) S0 ={(0,0)}; for i=1 to n-1 do { Si1= {(Pl,Wl)|(Pl-pi,Wl-wi) ∈Si-1 and Wl≤M} Si = MERGE_PURGE(Si-1,Si1) } (PX,WX) = Sn-1的最末序偶 (PY,WY) = (Pl+pn,Wl+wn) ; 其中Wl 是Sn-1中使得W+wn≤M的所有序偶中取最大值的Wl if PXPY then xn=0 //PX是Sn的最末序偶// else xn=1 //PY是Sn的最末序偶// 沿Sn-1, … S1回溯确定xn-1,…,x1的值 end DKP S1 ={(0,0),(1,2)} S2 ={(0,0),(1,2),(2,3),(3,5)} (PX,WX)=(3,5) (P3,W3) =(5,4) , Wl =2 (PY,WY)=(1+5,2+4)=(6,6) (PX=3)(PY=6) 所以x3=1 0/1背包问题DKP算法的实现 可用两个一维数组P和W来存放所有的序偶(Pl ,Wl) 序偶集S0,S1,…,Sn-1互相邻接的存放 各个集合用指针F[i]来指示, 0≤i≤n, F[i]指示S中的第一个元素所在的位置 S0 ={(0,0)} S1 ={(0,0),(1,2)} S2 ={(0,0),(1,2),(2,3),(3,5)} 1 2 3 4 5 6 7 8 0 0 1 0 1 2 3 0 0 2 0 2 3 5 P W F[0] F[1] F[3] F[2] 在生成Si1的过程中, 同时将Si-1和Si1按支配规则进行归并而生成Si , 因此不需要附加空间存放Si1 在Si-1中序偶是按P和W的递增次序排列的, 因此Si的序偶也按这种次序生成 procedure DKNAP(p,w,n,M,m) F[0]=1; P[1]=W[1]=0; l=h=1; F[1]=next=2; for i=1 to n-1 do { k=l ; u=r ; r是在l≤r≤h中,使得W[r]+wi≤M最大 for j=l to u do { (pp,ww)=(P[j]+pi,W[j]+wi) while ( k≤h and W[k]ww ) do { P[next]=P[k]; W[next]=W[k]; next++; k++; } if ( k≤h and W[k]==ww) { pp=max{pp,P[k]} ; k++;} if ( ppP[

文档评论(0)

wyjy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档