装载问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
n
wi c1 c2
i 1
如果给定的装载问题有解,则采用下面的策略可 以得到最优装载方案: (1)首先将第一艘轮船尽可能装满。
(2)然后将剩余的集装箱装上第二艘轮船
将第一艘尽可能装满等价于选取全体集装箱的一个子集,使该子集中集 装箱重量之和最接近C1。由此装载问题等价于下列问题:
n
层结点之后都有一个尾部标记-1,故
If(Q.IsEmpty())
在取队首元素时,活结点队列一定
Return bestw;
不空。当取出的元素值是-1时,在判 Q.Add(-1);//同层结点尾部标志
断当前队列是否为空。如果队列非 Q.Delete(Ew);//取下一扩展结点
空,则将尾部标记-1加入活结点队列, i++;
算法开始处理下一层的活结点。
}}
为了在算法结束后能方便 的构造出与最优值相应的 最优解,算法必须存储相 应子集树中从活结点到根 结点的路径。为此目的, 可以在每个结点处设置指 向其父节点的指针,并设 置左右儿子标志。
找到最优之后,可以根据 parent 回 溯 到 根 结 点 , 找 到最优解。
max wi xi i 1
n
s.t.
wi xi c1
i 1
xi {0,1},1 i n
装载问题实质上是求第一艘船的最优装载
该算法只求出所要求的最优值。算法 MaxLoading实施对解空间的分支限界搜索。 队列Q用于存放活结点表,其中元素的值表 示活结点所相应的当前载重量。当元素值为1时,表示队列已到达解空间树同一层节点 的尾部。
解装载问题的优先队列式分支限界法用最大优先队列存储活结点表。活结点 x在优先队列中的优先级定义为从根结点到结点x的路径所相应的载重量再加 上剩余集装箱的重量之和。
优先队列中优先级最大的活结点成为下一个扩展结点。以节点x为根的子树 中所有结点相应的路径的载重量不超过它的优先级。子集树中叶节点所相应 的载重量与其优先级相同。
➢ 在算法的while循环中,首先检测当 While(true)
前扩展节点的左儿子节点是否为可 {
行节点。如果是,则将其加入到活 //检查左儿子结点
结点队列中,然后将其右儿子节点 if(Ew+w[i] <=c)//x[i]=1
加入到活结点队列中(右儿子结点
EnQueue(Q,Ew+w[i],bestw,i,n);
一定是可行结点)。两儿子节点都 //右儿子结点总是可行的
产生后,当前扩展节点被舍弃。
EnQueue(Q,Ew,bestw,i,n);//x[i]=0
➢ 活结点队列中的队首元素被取出作 Q.Delete(Ew);//取下一扩展结点
为当前扩展结点,由于队列中每一 If(Ew==-1){//同层结点尾 部
在优先队列式分支限界法中,一旦有一叶结点成为当前的扩展结点,则可以 断言该叶结点所相应的解即为最优解。此时可终止算法。
x谢谢~
➢ class QNode ➢{ ➢ QNode *parent;//指向父节点的指
针 ➢ bool LChild;//左儿子标志 ➢ Type weight;//结点所相应的载重量 ➢}
➢ //构造当前最优解 ➢ for(int j=n-1;j>0;j--) ➢{ ➢ bestx[j]=bestE->源自文库child; ➢ bestE=bestE->parent; ➢}
相关文档
最新文档