如何表达线性规划中的"not equals"关系?



我想用库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 告诉我,它不处理intLpAffineExpression之间的">"运算符,所以我写了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](我们不想检查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。其他配方也是可能的。有关详细信息,请参阅链接。

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

你的约束不起作用的原因是你要求x_i至少比x_j大 1 ,对于每个ij。所以你需要x_1 > x_2x_2 > x_1.您可以通过在if语句中用i > j或类似的东西替换x_i != x_j来解决此问题。

但在您的情况下,我会考虑使用二进制变量来指示每个x_i采用的值。例如,让y_{i,n} = 1x_i = n.然后你有一个约束,比如

适合所有n = 0,...,Nsum {i=1,...,N} y_{i,n} <= 1

(即,n的每个值最多可以使用一次(和另一个类似

适合所有i = 1,...,Nsum {n=0,...,N} y_{i,n} = 1

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

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

最新更新