The OPTMILP Procedure

Example 13.2 MIPLIB Benchmark Instance

The following example illustrates the conversion of a standard MPS-format file into an MPS-format SAS data set. The problem is re-solved several times, each time by using a different control option. For such a small example, it is necessary to disable cuts and heuristics in order to see the computational savings gained by using other options. For larger or more complex examples, the benefits of using the various control options are more pronounced.

The standard set of MILP benchmark cases is called MIPLIB (Bixby et al. 1998, Achterberg, Koch, and Martin 2003) and can be found at http://miplib.zib.de/. The following statement uses the %MPS2SASD macro to convert an example from MIPLIB to a SAS data set:


%mps2sasd(mpsfile="bell3a.mps", outdata=mpsdata);

The problem can then be solved using PROC OPTMILP on the data set created by the conversion:


proc optmilp data=mpsdata allcuts=none heuristics=none logfreq=10000;
run;

The resulting log is shown in Output 13.2.1.

Output 13.2.1: MIPLIB PROC OPTMILP Log

NOTE: The problem BELL3A has 133 variables (39 binary, 32 integer, 0 free, 0    
      fixed).                                                                   
NOTE: The problem has 123 constraints (123 LE, 0 EQ, 0 GE, 0 range).            
NOTE: The problem has 347 constraint coefficients.                              
NOTE: The MILP presolver value AUTOMATIC is applied.                            
NOTE: The MILP presolver removed 44 variables and 58 constraints.               
NOTE: The MILP presolver removed 142 constraint coefficients.                   
NOTE: The MILP presolver modified 25 constraint coefficients.                   
NOTE: The presolved problem has 89 variables, 65 constraints, and 205           
      constraint coefficients.                                                  
NOTE: The MILP solver is called.                                                
NOTE: The parallel Branch and Cut algorithm is used.                            
NOTE: The Branch and Cut algorithm is using up to 4 threads.                    
          Node  Active    Sols    BestInteger      BestBound      Gap    Time   
             0       1       0              .         869515        .       0   
           891     136       1         907340         873167    3.91%       0   
          1814     128       3         898595         874502    2.76%       0   
          1874     126       4         878651         874502    0.47%       0   
          5124    1341       5         878430         875369    0.35%       0   
         10000    1517       5         878430         876097    0.27%       0   
         14778       0       5         878430         878430    0.00%       0   
NOTE: Optimal.                                                                  
NOTE: Objective = 878430.316.                                                   



Suppose you do not have a bound for the solution. If there is an objective value that, even if it is not optimal, satisfies your requirements, then you can save time by using the TARGET= option. The following PROC OPTMILP call solves the problem with a target value of 880,000:


proc optmilp data=mpsdata allcuts=none heuristics=none logfreq=5000
             target=880000;
run;

The relevant results from this run are displayed in Output 13.2.2. In this case, there is a decrease in CPU time, but the objective value has increased.

Output 13.2.2: MIPLIB PROC OPTMILP Log with TARGET= Option

NOTE: The problem BELL3A has 133 variables (39 binary, 32 integer, 0 free, 0    
      fixed).                                                                   
NOTE: The problem has 123 constraints (123 LE, 0 EQ, 0 GE, 0 range).            
NOTE: The problem has 347 constraint coefficients.                              
NOTE: The MILP presolver value AUTOMATIC is applied.                            
NOTE: The MILP presolver removed 44 variables and 58 constraints.               
NOTE: The MILP presolver removed 142 constraint coefficients.                   
NOTE: The MILP presolver modified 25 constraint coefficients.                   
NOTE: The presolved problem has 89 variables, 65 constraints, and 205           
      constraint coefficients.                                                  
NOTE: The MILP solver is called.                                                
NOTE: The parallel Branch and Cut algorithm is used.                            
NOTE: The Branch and Cut algorithm is using up to 4 threads.                    
          Node  Active    Sols    BestInteger      BestBound      Gap    Time   
             0       1       0              .         869515        .       0   
           891     136       1         907340         873167    3.91%       0   
          1814     128       3         898595         874502    2.76%       0   
          1874     126       4         878651         874502    0.47%       0   
NOTE: Target reached.                                                           
NOTE: Objective of the best integer solution found = 878651.068.                



When the objective value of a solution is within a certain relative gap of the optimal objective value, the procedure stops. The acceptable relative gap can be changed using the RELOBJGAP= option, as demonstrated in the following example:


proc optmilp data=mpsdata allcuts=none heuristics=none relobjgap=0.01;
run;

The relevant results from this run are displayed in Output 13.2.3. In this case, since the specified RELOBJGAP= value is larger than the default value, the number of nodes and the CPU time have decreased from their values in the original run. Note that these savings are exchanged for an increase in the objective value of the solution.

Output 13.2.3: MIPLIB PROC OPTMILP Log with RELOBJGAP= Option

NOTE: The problem BELL3A has 133 variables (39 binary, 32 integer, 0 free, 0    
      fixed).                                                                   
NOTE: The problem has 123 constraints (123 LE, 0 EQ, 0 GE, 0 range).            
NOTE: The problem has 347 constraint coefficients.                              
NOTE: The MILP presolver value AUTOMATIC is applied.                            
NOTE: The MILP presolver removed 44 variables and 58 constraints.               
NOTE: The MILP presolver removed 142 constraint coefficients.                   
NOTE: The MILP presolver modified 25 constraint coefficients.                   
NOTE: The presolved problem has 89 variables, 65 constraints, and 205           
      constraint coefficients.                                                  
NOTE: The MILP solver is called.                                                
NOTE: The parallel Branch and Cut algorithm is used.                            
NOTE: The Branch and Cut algorithm is using up to 4 threads.                    
          Node  Active    Sols    BestInteger      BestBound      Gap    Time   
             0       1       0              .         869515        .       0   
           100      82       0              .         872669        .       0   
           200     159       0              .         872669        .       0   
           300     235       0              .         872908        .       0   
           400     314       0              .         872908        .       0   
           500     392       0              .         872935        .       0   
           600     463       0              .         873094        .       0   
           700     534       0              .         873094        .       0   
           800      46       0              .         873167        .       0   
           891     136       1         907340         873167    3.91%       0   
           900     144       1         907340         873167    3.91%       0   
          1000      56       2         907340         873441    3.88%       0   
          1100     132       2         907340         874032    3.81%       0   
          1200     210       2         907340         874058    3.81%       0   
          1300     289       2         907340         874165    3.80%       0   
          1400     368       2         907340         874218    3.79%       0   
          1500     443       2         907340         874314    3.78%       0   
          1600     517       2         907340         874435    3.76%       0   
          1700      17       2         907340         874502    3.76%       0   
          1800     117       2         907340         874502    3.76%       0   
          1814     128       3         898595         874502    2.76%       0   
          1874     126       4         878651         874502    0.47%       0   
NOTE: Optimal within relative gap.                                              
NOTE: Objective = 878651.068.                                                   



The MAXTIME= option enables you to accept the best solution produced by PROC OPTMILP in a specified amount of time. The following example illustrates the use of the MAXTIME= option:


proc optmilp data=mpsdata allcuts=none heuristics=none maxtime=0.1;
run;

The relevant results from this run are displayed in Output 13.2.4. Once again, a reduction in solution time is traded for an increase in objective value.

Output 13.2.4: MIPLIB PROC OPTMILP Log with MAXTIME= Option

NOTE: The problem BELL3A has 133 variables (39 binary, 32 integer, 0 free, 0    
      fixed).                                                                   
NOTE: The problem has 123 constraints (123 LE, 0 EQ, 0 GE, 0 range).            
NOTE: The problem has 347 constraint coefficients.                              
NOTE: The MILP presolver value AUTOMATIC is applied.                            
NOTE: The MILP presolver removed 44 variables and 58 constraints.               
NOTE: The MILP presolver removed 142 constraint coefficients.                   
NOTE: The MILP presolver modified 25 constraint coefficients.                   
NOTE: The presolved problem has 89 variables, 65 constraints, and 205           
      constraint coefficients.                                                  
NOTE: The MILP solver is called.                                                
NOTE: The parallel Branch and Cut algorithm is used.                            
NOTE: The Branch and Cut algorithm is using up to 4 threads.                    
          Node  Active    Sols    BestInteger      BestBound      Gap    Time   
             0       1       0              .         869515        .       0   
           100      82       0              .         872669        .       0   
           200     159       0              .         872669        .       0   
           300     235       0              .         872908        .       0   
           400     314       0              .         872908        .       0   
           500     392       0              .         872935        .       0   
           600     463       0              .         873094        .       0   
           700     534       0              .         873094        .       0   
           800      46       0              .         873167        .       0   
           891     136       1         907340         873167    3.91%       0   
           900     144       1         907340         873167    3.91%       0   
          1000      56       2         907340         873441    3.88%       0   
          1100     132       2         907340         874032    3.81%       0   
          1200     210       2         907340         874058    3.81%       0   
NOTE: Real time limit reached.                                                  
NOTE: Objective of the best integer solution found = 907340.09.                 



The MAXNODES= option enables you to limit the number of nodes generated by PROC OPTMILP. The following example illustrates the use of the MAXNODES= option:


proc optmilp data=mpsdata allcuts=none heuristics=none maxnodes=1000;
run;

The relevant results from this run are displayed in Output 13.2.5. PROC OPTMILP displays the best objective value of all the solutions produced.

Output 13.2.5: MIPLIB PROC OPTMILP Log with MAXNODES= Option

NOTE: The problem BELL3A has 133 variables (39 binary, 32 integer, 0 free, 0    
      fixed).                                                                   
NOTE: The problem has 123 constraints (123 LE, 0 EQ, 0 GE, 0 range).            
NOTE: The problem has 347 constraint coefficients.                              
NOTE: The MILP presolver value AUTOMATIC is applied.                            
NOTE: The MILP presolver removed 44 variables and 58 constraints.               
NOTE: The MILP presolver removed 142 constraint coefficients.                   
NOTE: The MILP presolver modified 25 constraint coefficients.                   
NOTE: The presolved problem has 89 variables, 65 constraints, and 205           
      constraint coefficients.                                                  
NOTE: The MILP solver is called.                                                
NOTE: The parallel Branch and Cut algorithm is used.                            
NOTE: The Branch and Cut algorithm is using up to 4 threads.                    
          Node  Active    Sols    BestInteger      BestBound      Gap    Time   
             0       1       0              .         869515        .       0   
           100      82       0              .         872669        .       0   
           200     159       0              .         872669        .       0   
           300     235       0              .         872908        .       0   
           400     314       0              .         872908        .       0   
           500     392       0              .         872935        .       0   
           600     463       0              .         873094        .       0   
           700     534       0              .         873094        .       0   
           800      46       0              .         873167        .       0   
           891     136       1         907340         873167    3.91%       0   
           900     144       1         907340         873167    3.91%       0   
           999      55       2         907340         873441    3.88%       0   
NOTE: Node limit reached.                                                       
NOTE: Objective of the best integer solution found = 907340.09.