回溯求最有装载问题关于递归与回溯语句执行顺序问题


VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

一般解题步骤分为三步:

  1. 针对所给問题,定义问题的解空间
  2. 确定易于搜索的解空间结构(一般为子集树或者排列树)
  3. 以深度优先的方式搜索解空间,并且在搜索过程中用减枝函数避免无效搜索

1.其中子集树就是选一部分,比如0-1背包问题,装载问题;
2.而排列树就是选所有,只是顺序不一样,例如旅行商(邮递员)问题.
假设装载的集装箱n=3则空间树可以表示为上图,1表示装入该集装箱0表示不装入该集装箱,最优装载问题就是在这些空间树里寻找最优解。


已知n个集装箱,輪船载重量为c,集装箱i的重量为Wi,要求是在不超重的情况下,装尽可能多数量的集装箱.
注意: 有两个轮船时,以下代码用于轮船1,而轮船2用于放置剩餘的集装箱

  • 首先将轮船1尽可能装满
  • 然后将剩余的集装箱装上轮船2
 #define NUM 100 //注意,因为没有用类所以这些变量需要均写在外面。 
 
 
//形参代表搜索第t層节点,从1开始
 //如果当前载重量加上剩余集装箱的重量没有超过前一个最优装载量的话就不用考虑了
 r+=w[t]; //返回时还原剩余集装箱重量
 
 

  有一批共n个集装箱要装上2艘載重量分别为c1和c2的轮船其中集装箱i的重量是wi,且不能超

  最优装载方案: 将第一艘轮船尽可能的装满;  然后将剩余的装载第二艘船上

引入上界函数,用于剪去不含最优解的子树:

r;//剩余集装箱重量 r-=w[i];//计算剩余的集装箱的重量 r+=w[i];//如果得不到最优解再取消当前的集装箱,表示未选因此剩余容量要再加上当前集装箱重量

   为了构造最优解,必须在算法中保存最优解的记录因此需要两个成员数组 x ,bestx,一个鼡于记录当前的选择一个用于记录最优记录。

改进后的算法描述如下:

r;//剩余集装箱重量 r-=w[i];//计算剩余的集装箱的重量 r+=w[i];//如果得不到最优解再取消当前的集装箱,表示未选因此剩余容量要再加上当前集装箱重量

利用数组x所含的信息,可将上面方法表示成非递归与回溯的形式渻去O(n)递归与回溯栈空间。

//迭代回溯法返回最优装载量及其相应解,初始化根节点

我要回帖

更多关于 递归与回溯 的文章

 

随机推荐