Java 古罗比:如何添加约束x1*x2*x3
我希望在Gurobi中添加一个约束,其中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
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。