You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bin Packing Problem:求解器非连续选箱的优化调整问询

解决Bin Packing问题中箱子索引不连续的问题

方法1:后处理映射(无需修改模型)

在求解得到结果后,将实际使用的箱子索引映射为连续的0起始编号,实现简单且不影响模型求解效率。

修改结果输出部分的代码:

# 原求解逻辑不变,新增映射处理
bin_for_item = [-1 for i in range(num_items)]

for i in range(num_items):
    for j in range(num_bins):
        if x[i, j].SolutionValue() > 0.5:
            bin_for_item[i] = j

# 生成连续编号映射
used_bins = sorted(set(bin_for_item))
bin_mapping = {old_idx: new_idx for new_idx, old_idx in enumerate(used_bins)}
continuous_assign = [bin_mapping[idx] for idx in bin_for_item]

print(f"number of bins = {s.Objective().Value()}")
print(f"连续箱子分配结果: {continuous_assign}")

比如原分散索引[7,7,2,7,5,2,5,7,2,2]会被转换为[1,1,0,1,2,0,2,1,0,0],完全符合连续编号需求。

方法2:模型约束强化(从根源保证连续)

通过添加顺序约束,强制求解器优先使用编号更小的箱子,确保最终使用的箱子索引天然连续。

在原模型的约束定义部分添加以下代码:

# 新增:箱子使用顺序约束
for j in range(1, num_bins):
    s.Add(y[j] <= y[j-1])

该约束的逻辑是:若编号j的箱子被启用(y[j]=1),则编号j-1的箱子必须已被启用(y[j-1]=1)。这会迫使求解器从0号箱子开始依次使用,最终分配的索引必然是0,1,...,k-1(k为最优箱子数量)。

修改后重新求解,输出的bin_for_item直接就是连续的起始编号。

内容的提问来源于stack exchange,提问作者bobby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:26:21