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
相关产品推荐
相关产品推荐

