我希望在Gurobi中添加约束n1 = x1 * x2 *x3
,其中x1
,x2
和x3
是0或1的变量。遗憾的是,无法找到解决方案。
有人可以帮助我吗?
答案 0 :(得分:4)
您正在尝试为二元变量创建看似非线性的约束。您可以将此建模为一系列线性约束,并指出当且仅当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 - 2
和n <= min(x1, x2, x3)
。
答案 1 :(得分:1)
n1<=x1
n1<=x2
n1<=x3
2+n1>=x1+x2+x3
如果x中的任何一个为0,则n将强制为零。如果全部为1,则强制为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
由于expressing boolean logic operations in zero-one integer linear programming (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)
答案 2 :(得分:-1)
简化将二进制字符串转换为整数的方法。并且,乘以它。不行吗?
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");