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 printfreq=10000; run;
The resulting log is shown in Output 11.2.1.
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 OPTMILP presolver value AUTOMATIC is applied. |
NOTE: The OPTMILP presolver removed 32 variables and 36 constraints. |
NOTE: The OPTMILP presolver removed 91 constraint coefficients. |
NOTE: The OPTMILP presolver modified 3 constraint coefficients. |
NOTE: The presolved problem has 101 variables, 87 constraints, and 256 |
constraint coefficients. |
NOTE: The MIXED INTEGER LINEAR solver is called. |
Node Active Sols BestInteger BestBound Gap Time |
0 1 0 . 866240 . 0 |
222 106 1 1528730 869515 75.81% 0 |
235 40 2 881651 870032 1.34% 0 |
291 36 3 878651 873364 0.61% 0 |
3798 1287 4 878430 875484 0.34% 0 |
10000 2296 8 878430 876278 0.25% 1 |
20000 927 8 878430 877716 0.08% 2 |
20961 12 8 878430 878359 0.01% 2 |
NOTE: Optimal within relative gap. |
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 target=880000; run;
The relevant results from this run are displayed in Output 11.2.2. In this case, there is a decrease in CPU time, but the objective value has increased.
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 OPTMILP presolver value AUTOMATIC is applied. |
NOTE: The OPTMILP presolver removed 32 variables and 36 constraints. |
NOTE: The OPTMILP presolver removed 91 constraint coefficients. |
NOTE: The OPTMILP presolver modified 3 constraint coefficients. |
NOTE: The presolved problem has 101 variables, 87 constraints, and 256 |
constraint coefficients. |
NOTE: The MIXED INTEGER LINEAR solver is called. |
Node Active Sols BestInteger BestBound Gap Time |
0 1 0 . 866240 . 0 |
100 65 0 . 869515 . 0 |
200 100 0 . 869515 . 0 |
222 106 1 1528730 869515 75.81% 0 |
235 40 2 881651 870032 1.34% 0 |
291 69 3 878651 873364 0.61% 0 |
NOTE: Target reached. |
NOTE: Objective of the best integer solution found = 878651.07. |
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 11.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.
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 OPTMILP presolver value AUTOMATIC is applied. |
NOTE: The OPTMILP presolver removed 32 variables and 36 constraints. |
NOTE: The OPTMILP presolver removed 91 constraint coefficients. |
NOTE: The OPTMILP presolver modified 3 constraint coefficients. |
NOTE: The presolved problem has 101 variables, 87 constraints, and 256 |
constraint coefficients. |
NOTE: The MIXED INTEGER LINEAR solver is called. |
Node Active Sols BestInteger BestBound Gap Time |
0 1 0 . 866240 . 0 |
100 65 0 . 869515 . 0 |
200 100 0 . 869515 . 0 |
222 106 1 1528730 869515 75.81% 0 |
235 40 2 881651 870032 1.34% 0 |
269 59 2 881651 873180 0.97% 0 |
NOTE: Optimal within relative gap. |
NOTE: Objective = 881650.93. |
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 11.2.4. Once again, a reduction in solution time is traded for an increase in objective value.
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 OPTMILP presolver value AUTOMATIC is applied. |
NOTE: The OPTMILP presolver removed 32 variables and 36 constraints. |
NOTE: The OPTMILP presolver removed 91 constraint coefficients. |
NOTE: The OPTMILP presolver modified 3 constraint coefficients. |
NOTE: The presolved problem has 101 variables, 87 constraints, and 256 |
constraint coefficients. |
NOTE: The MIXED INTEGER LINEAR solver is called. |
Node Active Sols BestInteger BestBound Gap Time |
0 1 0 . 866240 . 0 |
100 65 0 . 869515 . 0 |
200 100 0 . 869515 . 0 |
222 106 1 1528730 869515 75.81% 0 |
235 40 2 881651 870032 1.34% 0 |
291 36 3 878651 873364 0.61% 0 |
300 42 3 878651 873369 0.60% 0 |
400 88 3 878651 873792 0.56% 0 |
500 126 3 878651 874032 0.53% 0 |
600 159 3 878651 874165 0.51% 0 |
700 202 3 878651 874303 0.50% 0 |
800 240 3 878651 874325 0.49% 0 |
900 288 3 878651 874435 0.48% 0 |
915 295 3 878651 874458 0.48% 0 |
NOTE: CPU time limit reached. |
NOTE: Objective of the best integer solution found = 878651.07. |
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=500; run;
The relevant results from this run are displayed in Output 11.2.5. PROC OPTMILP displays the best objective value of all the solutions produced.
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 OPTMILP presolver value AUTOMATIC is applied. |
NOTE: The OPTMILP presolver removed 32 variables and 36 constraints. |
NOTE: The OPTMILP presolver removed 91 constraint coefficients. |
NOTE: The OPTMILP presolver modified 3 constraint coefficients. |
NOTE: The presolved problem has 101 variables, 87 constraints, and 256 |
constraint coefficients. |
NOTE: The MIXED INTEGER LINEAR solver is called. |
Node Active Sols BestInteger BestBound Gap Time |
0 1 0 . 866240 . 0 |
100 65 0 . 869515 . 0 |
200 100 0 . 869515 . 0 |
222 106 1 1528730 869515 75.81% 0 |
235 40 2 881651 870032 1.34% 0 |
291 36 3 878651 873364 0.61% 0 |
300 42 3 878651 873369 0.60% 0 |
400 88 3 878651 873792 0.56% 0 |
500 126 3 878651 874032 0.53% 0 |
NOTE: Node limit reached. |
NOTE: Objective of the best integer solution found = 878651.07. |