我想使用库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告诉我它没有处理“>” int
和LpAffineExpression
之间的运算符,所以我写了x_i - x_j >= 1
。然而,它运行但似乎它不起作用,我无法弄清楚为什么。
答案 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
(我们不想两次检查i
和j
)。这种不平等可以重写为: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_i
和x_j
,您要求i
至少比j
大1 {}。因此,您需要x_1 > x_2
和x_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}
。