如何在线性规划中表达“不等于”的关系?

时间:2018-05-19 18:56:06

标签: python linear-programming pulp

我想使用库Pulpe(或任何其他)解决Python中的LP问题。

我想表达一个约束,声明我的所有变量必须具有不同的值(对于给定的整数N,它们的域为{0,1,2,3 ... N}。)x_1 != x_2 != x_3 ... != x_N

当我没有添加任何与我上面提到的相关的约束时,解算器给了我一个解决方案,但是当我这样做时,它告诉我即使它有一个解决方案,系统也不可行。

为了添加“所有不同”约束,我做了以下内容:

for x_i in variables:
    for x_j in variables:
        if the following constraint has not been already added and x_i != x_j:
            my_problem += x_i - x_j >= 1, "unique name for the constraint"

之前的代码不起作用。当我想添加约束x_i != x_j时,它只是不起作用。所以,当我使用一组有界整数时,我可以(我认为)将“不等于”重写为x_i - x_j> 0. Pulpe告诉我它没有处理“>” intLpAffineExpression之间的运算符,所以我写了x_i - x_j >= 1。然而,它运行但似乎它不起作用,我无法弄清楚为什么。

2 个答案:

答案 0 :(得分:2)

根据具体情况,有几种方法可以做到这一点。

您似乎有n个变量x[i]。他们可以假设值{0,...,n}并且必须全部不同。

顺便说一句:你的符号x[1] ≠ x[2] ≠ x[3]..并不完全正确。例如。 x[1]=1, x[2]=2, x[3]=1会满足x[1] ≠ x[2] ≠ x[3]

对于所有x[i] ≠ x[j],所有不同的约束可以成对写为i < j(我们不想两次检查ij)。这种不平等可以重写为:x[i] ≤ x[j]-1 OR x[i] ≥ x[j]+1。 OR条件可以在MIP模型中实现为:

 x[i] ≤ x[j]-1 + M δ[i,j]        ∀ i < j
 x[i] ≥ x[j]+1 - M (1-δ[i,j])    ∀ i < j
 δ[i,j] ∈ {0,1}

其中M=n+1。我们添加了额外的二进制变量δ[i,j]

这是“不平等”结构的最直接表述。它也具有相对较少的二元变量:约为n ^ 2/2。其他配方也是可能的。有关更多信息,请参阅link

请注意,约束编程求解器通常具有针对全不同约束的内置工具,因此使用CP求解器可能更容易(对于具有所有不同约束的模型,它们也可以更有效)。

答案 1 :(得分:0)

您的约束不起作用的原因是,对于每x_ix_j,您要求i至少比j大1 {}。因此,您需要x_1 > x_2x_2 > x_1。您可以在x_i != x_j语句中将i > j替换为if或类似内容,从而解决此问题。

但在你的情况下,我会考虑使用二进制变量来指示每个x_i占用的值。例如,如果y_{i,n} = 1,请x_i = n。然后你有一个像

这样的约束 所有sum {i=1,...,N} y_{i,n} <= 1

n = 0,...,N

(即,n的每个值最多可以使用一次)而另一个值可以使用

所有sum {n=0,...,N} y_{i,n} = 1

i = 1,...,N

(必须为每个i分配一些值n)。

然后,在您的表述中,将所有x_i变量替换为sum {n=0,...,N} y_{i,n}