簡體   English   中英

Gurobi:如何添加約束x1 * x2 * x3

[英]Gurobi: how to add a constraint x1*x2*x3

我希望在Gurobi中添加一個約束n1 = x1 * x2 *x3 ,其中x1x2x3是具有0或1的變量。不幸的是,找不到解決方案。

有人能幫我嗎?

您正在嘗試對二進制變量創建一個看似非線性的約束。 您可以通過將線性建模為一系列線性約束,只要且僅當x1,x2和x3均為1時, n的值為1。

// only if part
model.addConstr(n, GRB.LESS_EQUAL, x1);
model.addConstr(n, GRB.LESS_EQUAL, x2);
model.addConstr(n, GRB.LESS_EQUAL, x3);

// if part
GRBLinExpr all_three;
all_three.addTerm(1.0, x1);
all_three.addTerm(1.0, x2);
all_three.addTerm(1.0, x3);
all_three.addConstrant(-2);
model.addConstr(n, GRB.GREATER_EQUAL, all_three);

這將添加約束n >= x1 + x2 + x3 - 2n <= min(x1, x2, x3)

n1<=x1
n1<=x2
n1<=x3
2+n1>=x1+x2+x3

如果x中的任何一個為0,則n將強制為零。 如果全部為1,則將n強制為1。

編輯由於Gurobi可以識別二進制變量,因此您可以使用

3*n1<=x1+x2+x3
2+n1>=x1+x2+x3

第一個只允許0和1,而如果不是二進制要求,這將允許小數。

編輯約束

n3 = x2 * (n1 + n2 - n1 * n2) + x1 * (n1 - n2) *(n1 - n2)

似乎正在嘗試執行邏輯

IF n1 AND n2: 
    n3 = x2

IF n1 XOR n2:
    n3 = x1

IF (NOT n1) AND (NOT n2):
    n3 = 0

由於以零一整數線性編程(ILP)表示布爾邏輯運算的標准規則采用x1 AND x2 IMPLIES y1的形式,因此我將上面的內容重構為

n1 AND n2 IMPLIES i1
n1 XOR n2 IMPLIES i2
(NOT n1) AND (NOT n2) IMPLIES i3   

下面給出構造i1, i2, i3的約束

IF n1 AND n2, THEN i1 
    i1 ≥ n1 + n2 − 1
    i1 ≤ n1
    i1 ≤ n2
    0 ≤ i1 ≤ 1

IF n1 XOR n2, THEN i2
    i2 ≤ n1 + n2
    i2 ≥ n1 − n2
    i2 ≥ n2 − n1
    i2 ≤ 2 − n1 − n2
    0 ≤ i2 ≤ 1

IF NOT n1 AND NOT n2, THEN i3
    i3 ≥ 1 - n1 - n2
    i3 ≤ (1 - n1)
    i3 ≤ (1 - n2)
    0 ≤ i3 ≤ 1

這樣可以使用三個互斥的指標,並且原始問題可以重寫為

-(1 - i1) ≤ n3 - x2 ≤ (1 - i1)
-(1 - i2) ≤ n3 - x1 ≤ (1 - i2)
-(1 - i3) ≤ n3 ≤ (1 - i3)

簡化將二進制字符串轉換為整數的方法。 並且,乘以它。 這樣不好嗎

int x1 = Integer.parseInt("101011", 2);
int x2 = Integer.parseInt("00010", 2);
int x3 = Integer.parseInt("000101", 2);
int n1 = x1 * x2 * x3;
System.out.println(n1);

更新

我不知道Gurobi ,但是

  GRBVar x1 = model.AddVar(0.0, 1.0, 0.0, GRB.BINARY, "x1");
  GRBVar x2 = model.AddVar(0.0, 1.0, 0.0, GRB.BINARY, "x2");
  GRBVar x3 = model.AddVar(0.0, 1.0, 0.0, GRB.BINARY, "x3");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM