如何基于重量、体积双约束以最优方式拆分bag对象列表
拆分算法优化方案
单约束拆分效果异常修复
你当前体积拆分效果不达标的核心原因是优先队列排序规则未匹配维度要求:
- 重量单约束拆分:原有逻辑正确,优先队列按
weightPerQty升序排列即可得到最优解 - 体积单约束拆分:需要把优先队列的排序规则改为按
volumePerQty升序排列,修改后即可达到和重量拆分一致的最优效果
双约束(重量+体积同时限制)最优拆分算法
你遇到的场景属于可拆分二维多箱装箱问题,因为允许拆分bag的数量,无需处理NP复杂逻辑,用以下贪心算法即可得到最少打包袋的最优拆分结果:
算法步骤
- 每个打包袋初始化时记录两个剩余容量:剩余承重
remW= 用户输入最大重量、剩余容积remV= 用户输入最大体积 - 优先队列动态排序规则:计算每个bag可装入当前打包袋的最大数量
maxPossibleQty = min(remW / bag.weightPerQty, remV / bag.volumePerQty),按maxPossibleQty降序排列,优先取可装数量最多的bag
- 将所有初始bag对象存入优先队列,新建第一个打包袋
- 从优先队列取出排序第一的bag,计算实际可装入数量
qty = min(bag.quantity, maxPossibleQty) - 将qty数量的bag装入当前打包袋,更新当前打包袋的剩余容量:
remW = remW - qty * bag.weightPerQty; remV = remV - qty * bag.volumePerQty; - 如果原bag的
quantity > qty,将剩余数量的bag重新放回优先队列 - 如果当前打包袋的
remW == 0或remV == 0(任意一个资源耗尽即为装满),新建打包袋并重置remW、remV为初始最大值 - 重复步骤2-5,直到优先队列为空
边界说明
如果你的「最优」定义不是最少打包袋数量,而是尽可能减少bag拆分次数,只需要调整优先队列的排序规则,将maxPossibleQty和bag的总数量做加权计算即可。
内容的提问来源于stack exchange,提问作者Java Programmer
相关产品推荐
相关产品推荐

