我想用库Pulpe(或任何其他工具)来解决Python中的LP问题。在
我想表达一个约束,声明所有变量必须有不同的值,(它们的域是{0,1,2,3。。。N} 对于给定的整数N.),即x_1 != x_2 != x_3 ... != x_N
。在
当我不添加任何与我上面提到的约束相关的约束时,解算器会给我一个解决方案,但当我这样做时,它告诉我,即使只有一个解决方案,系统也不可行。在
为了添加“all different”约束,我执行了以下操作:
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
时,它就是不起作用。因此,当我处理一组有界整数时,我可以(我想)重写“not equals”为x_I-x_j>;0。Pulpe告诉我它不处理int
和{x_i - x_j >= 1
。然而,它运行,但似乎不起作用,我不知道为什么。在
根据具体情况,有几种方法可以做到这一点。在
您似乎有
n
变量x[i]
。它们可以假定值{0,...,n}
,并且必须全部不同。在顺便说一句:你的符号
x[1] ≠ x[2] ≠ x[3]..
并不完全正确。E、 g.x[1]=1, x[2]=2, x[3]=1
将满足x[1] ≠ x[2] ≠ x[3]
。在所有不同的约束可以成对地写成}两次)。这个不等式可以重述为:
x[i] ≠ x[j]
for alli < j
(我们不想检查i
和{x[i] ≤ x[j]-1 OR x[i] ≥ x[j]+1
。OR条件可以在MIP模型中实现为:其中
M=n+1
。我们添加了额外的二进制变量δ[i,j]
。在这是“不平等”结构最直接的表述。它也有相对较少的二进制变量:大约n^2/2。其他配方也可以。有关详细信息,请参见link。在
请注意,约束编程求解器通常具有针对所有不同约束的内置工具,因此使用CP解算器可能更容易(对于具有所有不同约束的模型,它们也可能更高效)。在
您的约束不起作用的原因是您要求}。所以您需要}。您可以通过在
x_i
至少比x_j
大1,对于每个i
和{x_1 > x_2
和{if
语句中将x_i != x_j
替换为i > j
或类似的东西来解决这个问题。在但在您的例子中,我会考虑使用二进制变量来指示每个
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}
。在相关问题 更多 >
编程相关推荐