一 点睛
优先队列以当前节点的上界为优先级,把普通队列改成优先队列,这样就得到了优先队列式分支限界法。
二 算法设计
优先级定义为活节点代表的部分解所描述的已装入物品的上界,上界越大,优先级越高。活节点的价值上界 up=活节点的 cp + 剩余物品装满背包剩余容量的最大价值 rp'。
约束条件:cw+w[i]<=W
限界条件:up=cp+rp'>=bestp
三 图解背包问题
有一个背包和 4 个物品,每个物品的重量和价值都如下图所示,背包的容量 W=10,求在不超过背包容量的前提下,把哪些物品放入背包才能获得最大价值。
1 初始化
sumw 和 sumv 分别用来统计所有物品的总重量和总价值。sumw = 13,sumv =18,sumw>W,因此不能全部装完,需要搜索求解。
2 按价值重量比非递增排序
排序后的结果见下图
3 创建根节点 A
4 扩展节点 A
5 扩展节点 B
6 扩展节点 D
7 扩展节点 F
8 扩展节点 G
队头元素 G 出队,该节点的 up>=bestp,满足限界条件,可以扩展。t=5,已经处理完毕,bestp=cp=15,是最优解,解向量是 x[]=(1,1,1,0)。注意:虽然解是(1,1,1,0),但对应的物品原来的序号是1、4、3。节点 G 出队。
9 队头元素 C 出队
该节点的 up<bestp,不满足限界条件,不再扩展。
10 队头元素 E 出队
该节点的 up<bestp,不满足限界条件,不再扩展。