- 1、本文档共41页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2016年秋季语音答疑回溯法的思想和例子
生成下一种颜色的算法 算法7 生成下一种颜色 Procedure NEXTVALUE(k) Global integer m,n,X(1:n),boolean GRAPH(1:n,1:n) Loop x(k)=(x(k)+1)mod (m+1) if x(k)=0 then return endif //表示m种都试过,不行! for j=1 to n do if GRAPH(k,j) and x(k)=x(j) then exit endif //退出FOR循环 Repeat If j=n+1 then return endif //表示第k点可着色返回x(k) Repeat end 复杂度分析 由于解空间树的内结点数有: 且在每个内部结点,为了确定其儿子结点的合法着色,要花费O(mn) 的时间(过程NEXTVALUE)。所以,总的复杂度为: 5 0/1背包问题 在第四章中,我们用动态规划的方法讨论了背包问题。这里,我们将用回溯的方法求解背包问题。 问题的解空间:由各分量 xi(取值0或1)的2n个不同的n元向量组成。与子集和数问题的解空间相同。也用树结构表示(满二叉树)。 限界函数:取能产生某些值的上界函数。如果扩展给定活结点和它的任一子孙所导致最好可行解的上界不大于迄今所确定的最好解的值,就可杀死此活结点。 上界函数的取法 如果在Z点处已确定了xi的值,1≤i≤k,则Z的上界可这样取: 对k+1≤i≤n,将xi=0或1改为: 0≤xi≤1,假定物品已按单位重量的效益值降序排序。用前面用到的贪习方法求背包问题求取上界值。 限界函数(用贪心方法求取上界值) Procedure BOUND(p,w,k,M) //p:当前效益总量;w:当前背包重量;k:上次去掉的物品;M:背包容量。返回一个新效益值// Global n,P(1:n),W(1:n);integer k,i;real b,c,p,w,M b=p; c=w; For i=k+1 to n do c=c+W(i) if cM then b=b+P(i) else return b+(1-(c-M)/W(i))*P(i) // 把背包装满则返回 endif Repeat Return (b) End Bound 关于限界函数的几点说明 由算法BOUND可知,状态空间树中结点Z的可行左儿子的上界与Z的上界是一样的。 因此,在向左儿子移动时,不需调用限界函数。 每次扩展时,最好首先试左儿子,(因无需调用限界函数) 在一系列的左儿子移动之后(直到不能再移),需要移向右儿子时,才需调用限界函数。 0/1背包问题的回溯法求解 Procedure BKNAP1(M,n,W,P,fw,fp,X) // fw:背包最后重量fp:背包取得的最大效益。 Integer n,k,Y(1:n);real M,W(1:n),P(1:n),fw,fp,cw,cp; cw=0;cp=0;k=1;fp=-1 // cw:背包当前重量,cp:当前效益 Loop while k≤n and cw+W(k) ≤M Do cw=cw+W(k);cp=cp+P(k);Y(k)=1;k=k+1; repeat if kn then fp=cp;fw=cw;k=n;X=Y //修改解// else Y(k)=0 // cw+W(k) M ,超出M,不装物品K end if While BOUND(cp,cw,k,M) ≤fp do //移向右儿子,调用BOUND while k≠0 and Y(k) ≠1 do k=k-1 repeat If k=0 then return endif Y(k)=0;cw=cw-W(k);cp=cp-P(k) Repeat K=k+1 Repeat End BKNAP1 例5:n=3时的0/1背包问题,考虑下面实例,W=[16,15,15], P=[45,25,25],M=30.从下图的根
文档评论(0)