- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
0034算法笔记【分支限界法】最优装载问题
?问题描述??有一批共个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为Wi,且装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。??容易证明:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。??(1)首先将第一艘轮船尽可能装满;?(2)将剩余的集装箱装上第二艘轮船。??1、队列式分支限界法求解?在算法的循环体中,首先检测当前扩展结点的左儿子结点是否为可行结点。如果是则将其加入到活结点队列中。然后将其右儿子结点加入到活结点队列中(右儿子结点一定是可行结点)。2个儿子结点都产生后,当前扩展结点被舍弃。?活结点队列中的队首元素被取出作为当前扩展结点,由于队列中每一层结点之后都有一个尾部标记-1,故在取队首元素时,活结点队列一定不空。当取出的元素是-1时,再判断当前队列是否为空。如果队列非空,则将尾部标记-1加入活结点队列,算法开始处理下一层的活结点。?节点的左子树表示将此集装箱装上船,右子树表示不将此集装箱装上船。设bestw是当前最优解;ew是当前扩展结点所相应的重量;r是剩余集装箱的重量。则当ew+rbestw时,可将其右子树剪去,因为此时若要船装最多集装箱,就应该把此箱装上船。另外,为了确保右子树成功剪枝,应该在算法每一次进入左子树的时候更新bestw的值。?为了在算法结束后能方便地构造出与最优值相应的最优解,算法必须存储相应子集树中从活结点到根结点的路径。为此目的,可在每个结点处设置指向其父结点的指针,并设置左、右儿子标志。?找到最优值后,可以根据parent回溯到根节点,找到最优解。?算法具体代码实现如下:?1、Queue.h[cpp]?/liufeng_king/article/details/8910956view plain?/liufeng_king/article/details/8910956copy#includeiostream?using?namespace?std;???template?class?T?class?Queue??{???public:???Queue(int?MaxQueueSize=50);???~Queue(){delete?[]?queue;}???bool?IsEmpty()const{return?front==rear;}???bool?IsFull(){return?(?(??(rear+1)??%MaxSize==front?)?1:0);}???T?Top()?const;???T?Last()?const;???QueueT?Add(const?T?x);???QueueT?AddLeft(const?T?x);???QueueT?Delete(T?x);???void?Output(ostream?out)const;???int?Length(){return?(rear-front);}???private:???int?front;???int?rear;???int?MaxSize;???T?*queue;??};???templateclass?T?QueueT::Queue(int?MaxQueueSize)??{???MaxSize=MaxQueueSize+1;???queue=new?T[MaxSize];???front=rear=0;??}???templateclass?T??T?QueueT::Top()const?{???if(IsEmpty())???{???coutqueue:no?element,no!endl;???return?0;???}???else?return?queue[(front+1)?%?MaxSize];??}???templateclass?T?T?QueueT?::Last()const?{???if(IsEmpty())???{???coutqueue:no?elementendl;???return?0;???}???else?return?queue[rear];??}???templateclass?T?QueueT?QueueT::Add(const?T?x)??{???if(IsFull())coutqueue:no?memoryendl;???else??{???rear=(rear+1)%?MaxSize;???queue[rear]=x;???}???return?*this;??}???templateclass?T?QueueT?QueueT::AddLeft(const?T?x)??{???if(IsFull())coutqueue:no?memoryendl;???else??{???front=(f
文档评论(0)