繁体   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