Creating the Optimizer

Once the data has been read, the IloCplex modeler/optimizer is created.

        IloCplex     cplex = new IloCplex();
        IloNumVar[]  Buy   = new IloNumVar[nFoods];
  
        if ( byColumn ) buildModelByColumn(cplex, data, Buy, varType);
        else            buildModelByRow   (cplex, data, Buy, varType);
  

Array IloNumVar[] Buy is also created where the modeling variables will be stored by buildModelByRow() or buildModelByColumn().

We have already discussed a method very similar to buildModelByRow(). This function is called when byColumn is false, which is the case when the example is executed without the -c command line option, otherwise, buildModelByColumn() is called. Note that unlike buildModelByRow(), this method requires IloMPModeler rather than IloModeler as parameter since modeling by column is not available with IloModeler.

First, the function creates an empty minimization objective and empty ranged constraints, and adds them to the active model.

      IloObjective cost       = model.addMinimize();
      IloRange[]   constraint = new IloRange[nNutrs];
    
      for (int i = 0; i < nNutrs; i++) {
         constraint[i] = model.addRange(data.nutrMin[i], data.nutrMax[i]);
      }
  

Empty means that they use a 0 expression. After that the variables are created one by one, and installed in the objective and constraints modeling by column. For each variable a column object is created. We start by creating a column object for the objective by calling:

        IloColumn col = model.column(cost, data.foodCost[j]);
  

The column is then expanded to include the coefficients for all the constraints using col.and() with the column objects that are created for each constraint. This is done in the following loop:

        for (int i = 0; i < nNutrs; i++) {
          col = col.and(model.column(constraint[i], data.nutrPerFood[i][j]));
        }
  

When the full column object has been constructed it is finally used to create and install the new variable using:

    Buy[j] = model.numVar(col, data.foodMin[j], data.foodMax[j], type);

Once the model is created, solving it and querying the solution is straightforward. What remains to be pointed out is the exception handling. In case of an error, ILOG CPLEX will throw an exception of type IloException or one of its subclasses. Thus the entire ILOG CPLEX program is enclosed in try/catch statements. The InputDataReader can throw exceptions of type java.io.IOException or InputDataReader.InputDataReaderException.

Since none of these three possible exceptions is handled elsewhere, the main() function ends by catching them and issuing appropriate error messages.


Previous Page: Solving the Diet Model with the Java API  Return to Top Next Page: Example: Diet.java Source Code