问题描述
我正在尝试优化来自多个工厂的采购订单。我需要的数量已设置。 我可以在服从每个工厂的能力的同时轻松解决问题,除了在运输时将项目的生产分配给制造部分集装箱的工厂。作为公司政策,我们不订购部分容器。获得准确的容器也几乎是不可能的,所以我想确保如果我们从工厂订购,所有装有产品的容器都需要装满 99% 并编写以下 PuLP 约束:
for f in factory:
model += (lp.lpSum([m3.loc[i,f] * qty[i,f]] for i in items) / m3_per_container) / \
math.ceil(lp.lpSum([m3.loc[i,f]] for i in items) / m3_per_container) * M) \
>= 0.99
但是,当我使用此约束运行问题时,出现此错误:
TypeError: must be real number,not LpAffineExpression
我猜,这是因为在我解决问题并先为其赋值之前,我无法将 LpVariable 向上舍入到最接近的更高整数。
有没有人有办法实现以下目标:确保在工厂下达的订单所生产的容器介于 0.99(0.99、1.98、2.97 等)的倍数和 1(1、2、3 的倍数)之间等)而不会遇到此错误?
提前致谢!
解决方法
您可以在 MIP 模型中模拟天花板函数,如下所示:
y=ceil(x)
大约相当于
y >= x
y <= x+0.999
y integer
我通常使用 1 而不是 0.999,如果 x 已经是整数值,那么让求解器选择最佳值。