Я разрабатываю модель cplex совместно с Java, и мне нужно условное ограничение, но кажется, что код cplex.ifthen
вообще не выполняется.
Я хочу, чтобы, если элемент массива был равен единице, то один элемент с таким же номером столбца должен быть равен единице.
Вот мой код. По сути, я создал две матрицы с одинаковыми размерами. Во-первых, я выбрал минимум из первой матрицы, то есть 4. Теперь я хочу выбрать минимальный элемент из этого столбца. Для этого я использую cplex.ifthen
, но он не работает.
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();
}
}
}