我正在尝试在Pyomo上运行MINLP问题。我已经制定了一个目标函数,我的约束之一是:
model.c2 = Constraint(expr = sum(model.x[i] for i in blocks) <= 4560)
我想要这样的东西:
x + y + z <= 3,x不等于y不等于z。
我如何为此写一个约束?
[Williams,H. Paul和Yan,Hong(2001),《约束满足的“ all_different”谓词(整数)编程,Informs Journal on Computing,13(2)。 96-103。
让我们更精确地定义问题。假设我们有n
个整数x[i]
,它们在1,...,n
之间取唯一值。我们可以这样实现:
我们可以引入二进制变量
y[i,k] = 1 if x[i]=k
0 otherwise
有了这个,我们可以写:
x[i] = sum(k, k*y[i,k]) (1) sum(k, y[i,k]) = 1 ∀i (2) sum(i, y[i,k]) = 1 ∀k (3) y[i,k] ∈ {0,1}
其中i ∈ {1,..,n}
和k ∈ {1,..,n}
。如果变量少于
n
,用i ∈ {1,..,m}
表示m < n
,那么我们需要将(3)替换为:
sum(i, y[i,k]) ≤ 1 ∀k (3a)