第7章回溯法课题.pptxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第7章 回溯法;7.1 回溯法概述;  问题的解由一个不等长或等长的解向量X={x1,x2,…,xn}组成,其中分量xi表示第i步的操作。所有满足约束条件的解向量组构成了问题的解空间。   问题的解空间一般用树形式来组织,也称为解空间树或状态空间,树中的每一个结点确定所求解问题的一个问题状态。树的根结点位于第1层,表示搜索的初始状态,第2层的结点表示对解向量的第一个分量做出选择后到达的状态,以此类推。   在有些树中,所有的结点都是解状态,而有些树中,只有叶子结点才是解状态。通常情况下,从根结点到叶子结点(不含搜索失败的结点)的路径构成了解空间的一个可能解。;  例如,如图7.1所示是求集合{a,b,c}的幂集的解空间树,求解过程分为3步,分别对a、b、c元素做决策,该解空间的每个叶子结点都构成一个解(很多情况并非如此)。   在一个解空间中搜索解的过程构成搜索空间,由于图7.1中所有叶子结点都是解,所以该问题的解空间和搜索空间相同。;  解空间树通常有两种类型。当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树,后面介绍的求全排列的解空间树就是排列树。   需要注意的是,问题的解空间树是虚拟的,并不需要在算法运行时构造一棵真正的树结构,然后再在该解空间树中搜索问题的解,而是只存储从根结点到当前结点的路径。实际上,有些问题的解空间因过于复杂或状态过多难以画出来。;7.1.2 什么是回溯法;  如图7.4所示,当从状态si搜索到状态si+1后,如果si+1变为死结点,则从状态si+1回退到si,再从si找其他可能的路径,所以回溯法体现出走不通就退回再走的思路。   若用回溯法求问题的所有解时,需要回溯到根结点,且根结点的所有可行的子树都要已被搜索完才结束。而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。;  另外,回溯法搜索解空间时,通常采用两种策略避免无效搜索,提高回溯的搜索效率。   一是用约束函数在扩展结点处剪除不满足约束的子树;   其二是用限界函数剪去得不到问题解或最优解的子树。这两类函数统称为剪枝函数。;归纳起来,用回溯法解题的一般步骤如下:;7.1.3 回溯法的算法框架;2. 递归的算法框架;7.1.4 回溯法算法的时间分析;7.2 求解0/1背包问题;  问题的求解过程可用一棵二叉树来描述,每个结点表示背包的一种状态,记录当前放入背包的物品总重量和总价值,每个分枝结点下面有两条边表示对某项物品是否放入背包的两种可能的选择。;  对第i层上的某个分枝结点来说,指向左孩子的边表示第i个物品放入背包,使背包中物品总重量增加w[i],总价值增加v[i],用tw表示搜索完该分枝结点后装入背包的总重量,tv表示相应的总价值。指向右孩子的边表示第i个物品不放入背包,背包中物品总重量和总价值保持不变。   可能的解结点都在最底层的叶子结点中。每个叶子结点表示在考虑了n个物品的取舍之后的一种最终状态。找出满足条件tw≤W tvmaxv的最大叶子结点,根据从根结点到叶子结点的路径信息,即可求出问题的解。;物品编号;void knap(int w[],int v[],int W,int n,int i,int tw,int tv,int op[]) //考虑第i个物品 {  int j;   if (in) //找到一个叶子结点   { if (tw=W tvmaxv) //找到一个满足条件更优解,保存它     { maxv=tv;       maxw=tw;       for (j=1;j=n;j++)         x[j]=op[j];     }   }   else //尚未找完所有物品   { op[i]=1; //选取第i个物品     knap(w,v,W,n,i+1,tw+w[i],tv+v[i],op);     op[i]=0; //不选取第i个物品,回溯     knap(w,v,W,n,i+1,tw,tv,op);   } };  从中看到,有些分枝结点的总重量已超过了W,仍在扩展其孩子结点,这是不必要的,可以增加一个限界条件进行剪枝,剪枝后的解空间树如图7.9所示。;void knap(int w[],int v[],int W,int n,int i,int tw,int tv,int op[]) //考虑第i个物品 { int j,m;   if (in) //找到一个叶子结点   { if (tw=W tvmaxv) //找到一个满足条件更优解,保存它     { maxv=tv;       maxw=tw;       

文档评论(0)

舞林宝贝 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档