我想用库Pulpe(或任何其他库(解决Python中的LP问题。
我想表达一个约束,说明我的所有变量都必须有不同的值,(它们的域是 {0, 1, 2, 3...N} 表示给定整数 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
。但是,它运行但似乎不起作用,我不知道为什么。
有几种方法可以做到这一点,具体取决于具体情况。
您似乎x[i]
n
变量.它们可以{0,...,n}
假定值,并且必须完全不同。
顺便说一句:您的符号x[1] ≠ x[2] ≠ x[3]..
并不完全正确。 例如x[1]=1, x[2]=2, x[3]=1
会满足x[1] ≠ x[2] ≠ x[3]
.
对于所有i < j
,可以将所有不同的约束成对编写为x[i] ≠ x[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。其他配方也是可能的。有关详细信息,请参阅链接。
请注意,约束规划求解器通常具有针对所有不同约束的内置工具,因此使用 CP 求解器可能更容易(对于具有所有不同约束的模型,它们也可以更有效(。
你的约束不起作用的原因是你要求x_i
至少比x_j
大 1 ,对于每个i
和j
。所以你需要x_1 > x_2
和x_2 > x_1
.您可以通过在if
语句中用i > j
或类似的东西替换x_i != x_j
来解决此问题。
但在您的情况下,我会考虑使用二进制变量来指示每个x_i
采用的值。例如,让y_{i,n} = 1
x_i = n
.然后你有一个约束,比如
适合所有n = 0,...,N
sum {i=1,...,N} y_{i,n} <= 1
(即,n
的每个值最多可以使用一次(和另一个类似
适合所有i = 1,...,N
sum {n=0,...,N} y_{i,n} = 1
(每个i
都必须分配一些值n
(。
然后,在公式中,将所有x_i
变量替换为sum {n=0,...,N} y_{i,n}
。