public static void worker(int jobId) { try { IloCplex cplex = new IloCplex(); IloNumVar var = cplex.numVar(0, 2 * jobId + 1); cplex.addMaximize(var); cplex.solve(); BufferedWriter writer = new BufferedWriter(new FileWriter("job" + jobId + ".txt")); writer.write(Double.toString(cplex.getObjValue())); writer.close(); } catch (IloException e) { System.err.println("Job " + jobId + " crashed!"); throw new RuntimeException(e); } catch (IOException e) { System.err.println("Job " + jobId + " crashed!"); throw new RuntimeException(e); } }
public static void main(String[] args) throws Exception { int status = 127; try { IloOplFactory.setDebugMode(true); IloOplFactory oplF = new IloOplFactory(); // make master model IloOplErrorHandler errHandler = oplF.createOplErrorHandler(); IloOplSettings settings = oplF.createOplSettings(errHandler); IloOplRunConfiguration masterRC = oplF.createOplRunConfiguration( DATADIR + "/cutstock_change.mod", DATADIR + "/cutstock_change.dat"); masterRC.setErrorHandler(errHandler); IloCplex masterCplex = oplF.createCplex(); masterCplex.setOut(null); masterRC.setCplex(masterCplex); IloOplModel masterOpl = masterRC.getOplModel(); masterOpl.generate(); IloOplDataElements masterDataElements = masterOpl.makeDataElements(); int nWdth = masterDataElements.getElement("Amount").asIntMap().getSize(); ArrayList<IloNumVar> masterVars = new ArrayList<IloNumVar>(); IloNumVarMap cuts = masterOpl.getElement("Cut").asNumVarMap(); for (int i = 1; i <= nWdth; i++) { masterVars.add(cuts.get(i)); } // prepare sub model source, definition and engine IloOplModelSource subSource = oplF.createOplModelSource(DATADIR + "/cutstock-sub.mod"); IloOplModelDefinition subDef = oplF.createOplModelDefinition(subSource, settings); IloCplex subCplex = oplF.createCplex(); subCplex.setOut(null); double best; double curr = Double.MAX_VALUE; do { best = curr; // Make master model System.out.println("Solve master."); if (masterCplex.solve()) { curr = masterCplex.getObjValue(); System.out.println("OBJECTIVE: " + curr); status = 0; } else { System.out.println("No solution!"); status = 1; } // prepare data for sub model IloOplDataElements subDataElements = oplF.createOplDataElements(); subDataElements.addElement(masterDataElements.getElement("RollWidth")); subDataElements.addElement(masterDataElements.getElement("Size")); subDataElements.addElement(masterDataElements.getElement("Duals")); // get reduced costs and set them in sub problem IloNumMap duals = subDataElements.getElement("Duals").asNumMap(); for (int i = 1; i < nWdth + 1; i++) { IloForAllRange forAll = (IloForAllRange) masterOpl.getElement("ctFill").asConstraintMap().get(i); duals.set(i, masterCplex.getDual(forAll)); } // make sub model IloOplModel subOpl = oplF.createOplModel(subDef, subCplex); subOpl.addDataSource(subDataElements); subOpl.generate(); System.out.println("Solve sub."); if (subCplex.solve()) { System.out.println("OBJECTIVE: " + subCplex.getObjValue()); status = 0; } else { System.out.println("No solution!"); status = 1; } if (subCplex.getObjValue() > -RC_EPS) break; // Add variable in master model IloNumVar newVar = masterCplex.numVar(0, Double.MAX_VALUE); IloObjective masterObj = masterOpl.getObjective(); masterCplex.setLinearCoef(masterObj, newVar, 1); for (int i = 1; i < nWdth + 1; i++) { double coef = subCplex.getValue(subOpl.getElement("Use").asIntVarMap().get(i)); IloForAllRange forAll = (IloForAllRange) masterOpl.getElement("ctFill").asConstraintMap().get(i); masterCplex.setLinearCoef(forAll, newVar, coef); } masterVars.add(newVar); subOpl.end(); } while (best != curr && status == 0); IloNumVar[] masterVarsA = new IloNumVar[masterVars.size()]; masterVars.toArray(masterVarsA); masterCplex.add(masterCplex.conversion(masterVarsA, IloNumVarType.Int)); if (masterCplex.solve()) { System.out.println("OBJECTIVE: " + masterCplex.getObjValue()); } oplF.end(); } catch (IloOplException ex) { System.err.println("### OPL exception: " + ex.getMessage()); ex.printStackTrace(); status = 2; } catch (IloException ex) { System.err.println("### CONCERT exception: " + ex.getMessage()); ex.printStackTrace(); status = 3; } catch (Exception ex) { System.err.println("### UNEXPECTED UNKNOWN ERROR ..."); ex.printStackTrace(); status = 4; } System.exit(status); }
/* * (non-Javadoc) * * @see net.sf.javailp.Solver#solve(net.sf.javailp.Problem) */ public Result solve(Problem problem) { Map<IloNumVar, Object> numToVar = new HashMap<IloNumVar, Object>(); Map<Object, IloNumVar> varToNum = new HashMap<Object, IloNumVar>(); try { IloCplex cplex = new IloCplex(); initWithParameters(cplex); for (Object variable : problem.getVariables()) { VarType varType = problem.getVarType(variable); Number lowerBound = problem.getVarLowerBound(variable); Number upperBound = problem.getVarUpperBound(variable); double lb = (lowerBound != null ? lowerBound.doubleValue() : Double.NEGATIVE_INFINITY); double ub = (upperBound != null ? upperBound.doubleValue() : Double.POSITIVE_INFINITY); final IloNumVarType type; switch (varType) { case BOOL: type = IloNumVarType.Bool; break; case INT: type = IloNumVarType.Int; break; default: // REAL type = IloNumVarType.Float; break; } IloNumVar num = cplex.numVar(lb, ub, type); numToVar.put(num, variable); varToNum.put(variable, num); } for (Constraint constraint : problem.getConstraints()) { IloLinearNumExpr lin = cplex.linearNumExpr(); Linear linear = constraint.getLhs(); convert(linear, lin, varToNum); double rhs = constraint.getRhs().doubleValue(); switch (constraint.getOperator()) { case LE: cplex.addLe(lin, rhs); break; case GE: cplex.addGe(lin, rhs); break; default: // EQ cplex.addEq(lin, rhs); } } if (problem.getObjective() != null) { IloLinearNumExpr lin = cplex.linearNumExpr(); Linear objective = problem.getObjective(); convert(objective, lin, varToNum); if (problem.getOptType() == OptType.MIN) { cplex.addMinimize(lin); } else { cplex.addMaximize(lin); } } for (Hook hook : hooks) { hook.call(cplex, varToNum); } if (!cplex.solve()) { cplex.end(); return null; } final Result result; if (problem.getObjective() != null) { Linear objective = problem.getObjective(); result = new ResultImpl(objective); } else { result = new ResultImpl(); } for (Entry<Object, IloNumVar> entry : varToNum.entrySet()) { Object variable = entry.getKey(); IloNumVar num = entry.getValue(); VarType varType = problem.getVarType(variable); double value = cplex.getValue(num); if (varType.isInt()) { int v = (int) Math.round(value); result.putPrimalValue(variable, v); } else { result.putPrimalValue(variable, value); } } cplex.end(); return result; } catch (IloException e) { e.printStackTrace(); } return null; }