您能否在解决问题之前舍入 PuLP 变量或解决此问题?

问题描述

我正在尝试优化来自多个工厂的采购订单。我需要的数量已设置。 我可以在服从每个工厂的能力的同时轻松解决问题,除了在运输时将项目的生产分配给制造部分集装箱的工厂。作为公司政策,我们不订购部分容器。获得准确的容器也几乎是不可能的,所以我想确保如果我们从工厂订购,所有装有产品的容器都需要装满 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 已经是整数值,那么让求解器选择最佳值。