9分支限界法.pptVIP

  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文档。上传文档
查看更多
9分支限界法

考虑一类问题: 分支限界 1 分支搜索 分支搜索法是一种在问题解空间上进行搜索尝试的算法。 所谓“分支”是采用广度优先的策略,依次生成E-结点所有分支,也就是所有的儿子结点。 和回溯法一样,可以在生成的结点中,抛弃那些不满足约束条件的结点,其余结点加入活结点表。然后从表中选择一个结点作为下一个E-结点。 选择下一个E-结点方式的不同导致几种分支搜索方式: 1 分支搜索-FIFO搜索 一开始,根结点是唯一的活结点,根结点入队。 从活结点队中取出根结点后,作为当前扩展结点。 对当前扩展结点,先从左到右地产生它的所有儿子,用约束条件检查,把所有满足约束函数的儿子加入活结点队列中。 再从活结点表中取出队首结点(队中最先进来的结点)为当前扩展结点,……,直到找到一个解或活结点队列为空为止。 1 分支搜索-LIFO搜索 一开始,根结点入栈。 从栈中弹出一个结点为当前扩展结点。 对当前扩展结点,先从左到右地产生它的所有儿子,用约束条件检查,把所有满足约束函数的儿子入栈; 再从栈中弹出一个结点(栈中最后进来的结点)为当前扩展结点,……,直到找到一个解或栈为空为止。 1 分支搜索-优先队列式搜索 为了加速搜索的进程,可以采用有效的方式选择E-结点进行扩展。 2 实例-例9.1 装载问题 例9.1 有两艘船,n个货箱。第一艘船的载重量是c1,第二艘船的载重量是c2,wi 是货箱i 的重量,且 w1+w2+……+wn≤c1+c2。 确定是否有一种可将所有n 个货箱全部装船的方法。若有的话,找出该方法。 2 例9.1 装载问题 2 例9.1-算法1 FIFO分支搜索 搜索顺序同广度优先搜索; 辅助数据结构:队列。 2 例9.1-算法1 FIFO分支搜索 float bestw,w[100]; int n; Queue Q; main( ) { float c1,c2;int i,n,s=0; input(c1,c2,n); for(i=1;i=n;i++) { input(w[i]); s=s+w[i]; } if (s=c1 or s=c2) { print(“need only one ship”); return; } if (sc1+c2) { print(“no solution”); return; } MaxLoading(c1); if (s-bestw=c2); { print(“The first ship loading”, bestw); print(“The second ship loading”, s-bestw);} else print(“no solution”); } 2 例9.1-算法1 FIFO分支搜索 AddLiveNode(float wt;int i) { if (i=n) //是叶子 { if (wtbestw) bestw=wt;} else //不是叶子 Add(Q,wt); } 2 例9.1-算法1 改进? 2 例9.1-限界 W={50,10,10},C1=60。 在此例中,结点3所在分支的所有子树中,装载货物的最大可能是多少? 2 例9.1-算法2 FIFO分支限界 搜索顺序仍采用FIFO的分支搜索,但当遇到: 若当前分支的“装载上界”,比现有的最大装载小,则该分支就无需继续搜索。 2 例9.1-算法2 FIFO分支限界-数据结构 float bestw,w[100],bestx[100]; int n; Queue Q; struct QNode { float weight; QNode *parent; QNode LChild;} main( ) { int c1,c2,n, s=0,i; input(c1,c2,n); for(i=1;i=n;i++) { input(w[i]); s=s+w[i];} if (s=c1 or s=c2) {print(“need only one ship”); return;} if (sc1+c2) {print(“no solution”); return;} MaxLoading(c1); if (s-bestw =c2); { print(“The first ship loading”, bestw,“chose:”); for(i=1;i=n;i++) if (bestx[i]=1) p

文档评论(0)

zyzsab + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档