我正在用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 * 3 + remainder_1
x2 = quotient_2 * 3 + remainder_2
现在仍然需要对disjunction:]进行建模
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