首页 > 解决方案 > 如何用 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。

那么,无论如何我可以做些什么来解决这个问题?

提前致谢。

标签: pythonlinear-programmingpulpinteger-programming

解决方案


您需要手动对其进行线性化。

我们称之为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    

推荐阅读