python - 如何用 int 修改 LpVariable?
问题描述
我正在用 Python 中的纸浆进行线性编程。这是我的限制之一:纸浆是第三方包。
from pulp import *
x1 = LpVariable('x1', 1, 5, cat='Integer')
x2 = LpVariable('x2', 2, 6, cat='Integer')
prob += x1 % 3 != x2 % 3
显然,%
不支持 LpVariable。
那么,无论如何我可以做些什么来解决这个问题?
提前致谢。
解决方案
您需要手动对其进行线性化。
我们称之为3
除数。
线性化可能看起来像(未经测试;但基本理论应该没问题 -> 在复制粘贴之前尝试考虑一下):
Helper-variables
----------------
add new var quotient_1 : integer-variable in [0, inf)
add new var remainder_1 : integer-variable in [0, divisor - 1]
add new var quotient_2 : integer-variable in [0, inf)
add new var remainder_2 : integer-variable in [0, divisor - 1]
Helper-constraints
------------------
x1 = quotient_1 * divisor + remainder_1
x2 = quotient_2 * divisor + remainder_2
现在仍然需要对析取进行建模:
Helper-variables
----------------
add new var disjunction : boolean-variable
meaning:
disjunction = 1 <-> remainder_1 > remainder_2
disjunction = 0 <-> remainder_2 < remainder_1
Constraints
-----------
(1-disjunction) * divisor + remainder_1 >= remainder_2 + 1
disjunction * divisor + remainder_2 >= remainder_1 + 1