Java 古罗比:如何添加约束x1*x2*x3

Java 古罗比:如何添加约束x1*x2*x3,java,python,linear-programming,gurobi,Java,Python,Linear Programming,Gurobi,我希望在Gurobi中添加一个约束,其中x1、x2和x3是0或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中添加一个约束,其中
x1
x2
x3
是0或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);
更新

我不知道古罗比,但是

  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");

简化将二进制字符串转换为整数的方法。然后,乘以它。不好吗

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);
更新

我不知道古罗比,但是

  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");

您试图在二进制变量上创建一个看似非线性的约束。您可以将其建模为一系列线性约束,注意
n
的值为1,当且仅当x1、x2和x3均为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您试图在二进制变量上创建一个看似非线性的约束。您可以将其建模为一系列线性约束,注意
n
的值为1,当且仅当x1、x2和x3均为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
似乎在试图强化逻辑

IF n1 AND n2: 
    n3 = x2

IF n1 XOR n2:
    n3 = x1

IF (NOT n1) AND (NOT n2):
    n3 = 0
因为它的标准规则是以
x1和x2的形式表示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)
似乎在试图强化逻辑

IF n1 AND n2: 
    n3 = x2

IF n1 XOR n2:
    n3 = x1

IF (NOT n1) AND (NOT n2):
    n3 = 0
因为它的标准规则是以
x1和x2的形式表示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)

x1是二进制值吗?例:10101。你想把它们相乘吗?@CycDemo实际上x1x2,x3都是0或1。是的,乘以它们,你能用IF,THEN,ELSE,And,OR,XOR,NOT来表达你的约束吗。你举的例子是,如果x1和x2以及x3,那么是n1,否则不是n1。不那么严格,你给出,如果x1,x2,和x3都等于1,那么n1等于1,否则n1等于0.x1是二进制值?例:10101。你想把它们相乘吗?@CycDemo实际上x1x2,x3都是0或1。是的,乘以它们,你能用IF,THEN,ELSE,And,OR,XOR,NOT来表达你的约束吗。你举的例子是,如果x1和x2以及x3,那么是n1,否则不是n1。不那么严格,你给出,如果x1,x2,和x3都等于1,那么n1等于1,否则n1等于0。我的意思是在古洛比中用作约束,我的意思是在古洛比中用作约束,但我有一个更复杂的。例如:n3=x2*(n1+n2-n1*n2)+x1*(n1-n2)*(n1-n2),那么如何处理?这里所有变量都是0或1。最简单的方法是像逻辑语句一样写出它,比如如果x2为真,n3为真,并且。。。然后,您可以使用一组规则来构造线性约束。如果你能用那种方式表达你想要的东西,我可以帮你,但是你写的表达现在太让人困惑了。谢谢,但是我有一个更复杂的表达。例如:n3=x2*(n1+n2-n1*n2)+x1*(n1-n2)*(n1-n2),那么如何处理?这里所有变量都是0或1。最简单的方法是像逻辑语句一样写出它,比如如果x2为真,n3为真,并且。。。然后,您可以使用一组规则来构造线性约束。如果你能用那种方式表达你想要的东西,我可以帮你,但是你写的表达现在太让人困惑了。谢谢,但是我有一个更复杂的表达。例如:n3=x2*(n1+n2-n1*n2)+x1*(n1-n2)*(n1-n2),那么如何处理?这里所有的变量都是0或1。谢谢,但我有一个更复杂的。例如:n3=x2*(n1+n2-n1*n2)+x1*(n1-n2)*(n1-n2),那么如何处理?这里所有变量都是0或1。