AMPL装箱模型约束优化求助:允许空箱的订单分配问题
装箱问题AMPL模型修正方案
问题根源
你的模型总成本随Max_Carts增大反而上升的核心原因是:目标函数对每个cart强制累加固定成本1,无论该cart是否被使用。新增的空cart也会贡献这部分固定成本,直接推高总成本。同时现有约束未明确区分cart的使用状态,无法让模型自动忽略空cart的无效成本。
修正后的完整代码
set ORDERS; # 订单集合 param Cost{ORDERS}; # 每个订单的成本 param Max_Order_Per_Cart = 20; # 每个cart最多容纳的订单数 param Max_Carts = 10; var Assign{ORDERS, c in 1..Max_Carts} binary; # 订单到cart的分配变量(1=分配,0=不分配) var Cart_Used{c in 1..Max_Carts} binary; # cart是否被使用(1=已使用,0=未使用) var Cart_Cost{c in 1..Max_Carts} >= 0; # 每个cart的成本 minimize Total_Cost: sum {c in 1..Max_Carts} (Cart_Cost[c] + 1*Cart_Used[c]); # 仅对使用的cart计算固定成本 subject to Cart_Assignment{o in ORDERS}: sum {c in 1..Max_Carts} Assign[o, c] = 1; # 每个订单必须分配到恰好一个cart subject to Cart_Usage_Constraint{c in 1..Max_Carts}: sum {o in ORDERS} Assign[o, c] <= Max_Order_Per_Cart * Cart_Used[c]; # 未使用的cart不能分配订单 subject to Max_Order_Per_Cart_Constraint{c in 1..Max_Carts}: sum {o in ORDERS} Assign[o, c] <= Max_Order_Per_Cart; # 每个cart最多装20个订单 subject to Cart_Cost_Constraint{c in 1..Max_Carts}: Cart_Cost[c] = sum {o in ORDERS} Cost[o] * Assign[o, c]; # cart成本等于其分配订单的总成本
关键修正点说明
- 新增
Cart_Used二进制变量:明确标记cart的使用状态,将固定成本与使用状态绑定,空cart不再产生额外成本。 - 调整目标函数逻辑:仅对实际使用的cart(
Cart_Used=1)计算固定成本,避免空cart的无效成本累加。 - 新增
Cart_Usage_Constraint约束:确保未使用的cart无法分配任何订单,但不强制cart必须被使用,完全符合允许空箱的需求。 - 简化成本约束:直接让cart成本等于其分配订单的总成本,消除原约束中
>=可能导致的成本冗余,提升模型计算效率。
内容的提问来源于stack exchange,提问作者Developppeur
相关产品推荐
相关产品推荐

