分支限界法实验(最优装载问题).doc

分支限界法实验(最优装载问题).doc

ID:55127967

大小:74.00 KB

页数:6页

时间:2020-04-28

分支限界法实验(最优装载问题).doc_第1页
分支限界法实验(最优装载问题).doc_第2页
分支限界法实验(最优装载问题).doc_第3页
分支限界法实验(最优装载问题).doc_第4页
分支限界法实验(最优装载问题).doc_第5页
资源描述:

《分支限界法实验(最优装载问题).doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、算法分析与设计实验报告第八次附加实验姓名学号班级时间12.26上午地点工训楼309实验名称分支限界法实验(最优装载问题)实验目的1.掌握分支限界法求解问题的思想2.学会利用队列求解最优装载问题实验原理问题描述:有一批共个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为Wi,且装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。容易证明:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。(1)首先将第一艘轮船尽可能装满;(2)将剩余的集装箱装上第二艘轮船。实验步骤(1)在算法的循环体中,首先检测当前扩展结

2、点的左儿子结点是否为可行结点;(2)如果是则将其加入到活结点队列中。然后将其右儿子结点加入到活结点队列中(右儿子结点一定是可行结点)。2个儿子结点都产生后,当前扩展结点被舍弃;(3)活结点队列中的队首元素被取出作为当前扩展结点,由于队列中每一层结点之后都有一个尾部标记-1,故在取队首元素时,活结点队列一定不空;(4)当取出的元素是-1时,再判断当前队列是否为空。如果队列非空,则将尾部标记-1加入活结点队列,算法开始处理下一层的活结点。关键代码voidMaxloading(intw[],intc,intn,intbestx[])//其中w[]为重量数组¦{//c为船的总载重量,

3、n为节点数//初始化queueQ;//活节点队列Q.push(0);//将第一个节点加入队列中,并用0表示同层节点的尾部标志inti=1;//当前扩展节点的层数,此时为intEw=0;//扩展节点相应的载重量intbestw=0;//当前最优载重量intr=0;//剩余集装箱的重量for(intj=2;j<=n;j++)//求得最初的剩余载重量r+=w[j];QNode*E=0;//当前扩展节点QNode*bestE;//当前最优扩展节点//搜索子集空间树while(true){//首先检查左儿子节点intwt=Ew+w[i];if(wt<=c)//左儿子节点

4、为可行结点{if(wt>bestw)bestw=wt;Enqueue(Q,wt,i,n,bestw,E,bestE,bestx,true);//将左节点加入队列}//检查右儿子节点,利用上届函数if(Ew+r>=bestw)Enqueue(Q,Ew,i,n,bestw,E,bestE,bestx,false);//将右节点加入队列E=Q.front();//取出当前扩展节点Q.pop();if(!E)//到达同层的最末,此时需要更新剩余装箱载重量{if(Q.empty())break;//此时队列为空Q.push(0);//加入0,表示该层结束E=Q.front();Q.po

5、p();i++;//进入下一层r-=w[i];//更新剩余集装箱的值}Ew=E->weight;//新扩展的节点对应的载重量}//构造当前最优解for(intj=n-1;j>0;j--){bestx[j]=bestE->LChild;bestE=bestE->parent;}cout<<"最优载重量为:"<

6、:实验心得最优装载就是求解载重量最好的载重方案,之前最优装载采用了贪心算法,这里使用的使分支限界法;其实在使用分支限界法进行了单源最短路径的实现之后,在完成这个实验就显得更简单一点。分支限界法的算法思想本身还是很好理解的,但是在这个问题中由于涉及到了剪枝的问题,所以新加入了一个0来判断一层是否结束,因为在一层结束的时候,代表该集装箱的情况已经考虑完了,需要考虑下一个集装箱,这个时候就需要更新剩余集装箱的重量,这会影响到一个右子树是否会被剪掉,因此要特别注意。实验得分助教签名附录:完整代码(分支限界法)//分支限界法求最优装载#include#include

7、#include#includeusingnamespacestd;classQNode{friendvoidEnqueue(queue&,int,int,int,int,QNode*,QNode*&,int*,bool);friendvoidMaxloading(int*,int,int,int*);private:QNode*parent;//指向父节点的指针boolLChild;//左儿子标志,用来表明自己是否为父节点的左儿子intw

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。