Java cplex在优化中的条件约束
我正在与Java一起开发一个cplex模型,我需要一个条件约束,但似乎Java cplex在优化中的条件约束,java,cplex,Java,Cplex,我正在与Java一起开发一个cplex模型,我需要一个条件约束,但似乎cplex.ifthen代码根本没有执行 我想知道,如果数组的一个元素等于一,那么相同列号的一个元素应该等于一 这是我的密码。基本上,我创建了两个维度相同的矩阵。首先,我从第一个矩阵中选择了最小值,即4。现在我想从该列中选择最小元素。为此,我使用了cplex。如果但它不起作用 package sch; import ilog.concert.*; import ilog.cplex.*; import ilog.conce
cplex.ifthen
代码根本没有执行
我想知道,如果数组的一个元素等于一,那么相同列号的一个元素应该等于一
这是我的密码。基本上,我创建了两个维度相同的矩阵。首先,我从第一个矩阵中选择了最小值,即4。现在我想从该列中选择最小元素。为此,我使用了cplex。如果
但它不起作用
package sch;
import ilog.concert.*;
import ilog.cplex.*;
import ilog.concert.IloException;
import ilog.concert.IloLinearNumExpr;
import ilog.concert.IloNumVar;
import ilog.cplex.IloCplex;
public class Firsttry {
public static void main(String[] args) {
schedule();
}
public static void schedule() {
int exp = 3;
int imp = 5;
double[] volI = { 10.5, 5.0, 15.5, 16, 2.0 };
double shipv = 0.25;
double[][] days = { { 115, 7, 9, 8, 7 }, { 555, 14, 8, 7, 12 }, { 112, 6, 8, 10, 4 } };
try {
IloCplex cplex = new IloCplex();
// variable
IloNumVar[][] x = new IloNumVar[exp][imp];
IloNumVar[][] y = new IloNumVar[exp][imp];
for (int e = 0; e < exp; ++e) {
for (int i = 0; i < imp; ++i) {
x[e][i] = cplex.boolVar();
y[e][i] = cplex.boolVar();
}
}
IloLinearNumExpr objective = cplex.linearNumExpr();
for (int e = 0; e < exp; ++e) {
for (int i = 0; i < imp; ++i) {
objective.addTerm(days[e][i], x[e][i]);
objective.addTerm(days[e][i], y[e][i]);
}
}
cplex.addMinimize(objective);
// CONSTRAINTS
// constraint .....1
IloLinearNumExpr expr1 = cplex.linearNumExpr();
// IloLinearNumExpr expr2 = cplex.linearNumExpr();
for (int e = 0; e < exp; ++e) {
for (int i = 0; i < imp; ++i) {
expr1.addTerm(1, x[e][i]);
}
}
cplex.addEq(expr1, 1);
// constraint .....2
// if
IloLinearNumExpr[][] rowexp = new IloLinearNumExpr[exp][imp];
IloLinearNumExpr[] colexp = new IloLinearNumExpr[imp];
IloConstraint[][] rowconst = new IloConstraint[exp][imp];
IloConstraint[] colconst = new IloConstraint[imp];
// if
for (int e = 0; e < exp; ++e) {
// rowexp[e] = cplex.linearNumExpr();
for (int i = 0; i < imp; ++i) {
rowexp[e][i] = cplex.linearNumExpr();
rowexp[e][i].addTerm(1, x[e][i]);
rowconst[e][i] = cplex.eq(1, rowexp[e][i]);
}
// rowconst[e] = cplex.eq(1, rowexp[e]);
}
for (int i = 0; i < imp; ++i) {
colexp[i] = cplex.linearNumExpr();
for (int e = 0; e < exp; ++e) {
// colexp[i] = cplex.linearNumExpr();
colexp[i].addTerm(1, y[e][i]);
}
colconst[i] = cplex.eq(1, colexp[i]);
}
for (int e = 0; e < exp; ++e) {
for (int i = 0; i < imp; ++i) {
cplex.ifThen(rowconst[e][i], colconst[i]);
}
}
if (cplex.solve()) {
System.out.println("obje =" + cplex.getObjValue());
for (int e = 0; e < exp; ++e) {
for (int i = 0; i < imp; ++i) {
// System.out.println(" =" + cplex.getValue(y[e][i]));
System.out.print(cplex.getValue(y[e][i]) + " ");
}
System.out.println();
}
System.out.printf("%n%n%n");
for (int e = 0; e < exp; ++e) {
for (int i = 0; i < imp; ++i) {
// System.out.println(" =" + cplex.getValue(y[e][i]));
System.out.print(cplex.getValue(x[e][i]) + " ");
}
System.out.println();
}
System.out.println("obje =" + cplex.getObjValue());
}
} catch (IloException exc) {
exc.printStackTrace();
}
}
}
sch包;
导入ilog.concert.*;
导入ilog.cplex。*;
导入ilog.concert.IloException;
导入ilog.concert.IloLinearNumExpr;
导入ilog.concert.IloNumVar;
导入ilog.cplex.IloCplex;
公开课初试{
公共静态void main(字符串[]args){
附表();
}
公共静态无效时间表(){
int-exp=3;
int-imp=5;
双[]卷={10.5,5.0,15.5,16,2.0};
双shipv=0.25;
双[]天={115,7,9,8,7},{555,14,8,7,12},{112,6,8,10,4};
试一试{
IloCplex cplex=新的IloCplex();
//变数
IloNumVar[][]x=新的IloNumVar[exp][imp];
IloNumVar[][]y=新的IloNumVar[exp][imp];
对于(int e=0;e
我没有测试您的代码或研究您的公式,但您的问题似乎来自以下几行:
cplex.ifThen(rowconst[e][i], colconst[i]);
正如的文档所述,它返回一个约束。它不会将其添加到模型中。要解决此问题,您可以执行以下操作:
cplex.add(cplex.ifThen(rowconst[e][i], colconst[i]));
另外,作为如何使用ifThen
的示例,您可能想看看CPLEX附带的FoodManufact.java
程序