The Dantzig-Wolfe Decomposition Algorithm
Example 18.4 Block-Angular Structure in Single-Machine Mode
This example demonstrates how you can use the default automated method to run the Dantzig-Wolfe decomposition algorithm in single-machine mode.
As in Example 18.3, consider a mixed integer linear program that is defined by the MPS data table mylib.mpsdata. In this case, the structure of the model is unknown and only the MPS data table is provided to you.
The following PROC OPTMILP statements attempt to solve the problem by using standard methods and a 120-second time limit.
proc optmilp
nthreads = 4
maxtime = 120
data = mylib.mpsdata;
run;
The solution summary is shown in Output 18.4.1.
Output 18.4.1: Solution Summary
| Solution Summary | |
|---|---|
| Solver | MILP |
| Algorithm | Branch and Cut |
| Objective Function | Total_Profit |
| Solution Status | Time Limit Reached |
| Objective Value | 6151.1464478 |
| Relative Gap | 0.1271425642 |
| Absolute Gap | 895.99114358 |
| Primal Infeasibility | 0 |
| Bound Infeasibility | 0 |
| Integer Infeasibility | 0 |
| Best Bound | 7047.1375914 |
| Nodes | 1 |
| Solutions Found | 4 |
| Iterations | 137399 |
| Presolve Time | 0.33 |
| Solution Time | 119.96 |
The iteration log, which contains the problem statistics and the progress of the solution, is shown in Output 18.4.2.
Output 18.4.2: Log
| NOTE: The problem MPSDATA has 52638 variables (16038 binary, 0 integer, 0 free, 0 fixed). |
| NOTE: The problem has 3949 constraints (3339 LE, 0 EQ, 610 GE, 0 range). |
| NOTE: The problem has 148866 constraint coefficients. |
| NOTE: The initial MILP heuristics are applied. |
| NOTE: The MILP presolver value AUTOMATIC is applied. |
| NOTE: The MILP presolver removed 0 variables and 734 constraints. |
| NOTE: The MILP presolver removed 17616 constraint coefficients. |
| NOTE: The MILP presolver modified 0 constraint coefficients. |
| NOTE: The presolved problem has 52638 variables, 3215 constraints, and 131250 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 4 6151.1464478 8590.4503506 28.40% 0 |
| 0 1 4 6151.1464478 7342.1209241 16.22% 0 |
| NOTE: The MILP solver's symmetry detection found 51226 orbits. The largest orbit contains 2 |
| variables. |
| 0 1 4 6151.1464478 7325.2309546 16.03% 2 |
| 0 1 4 6151.1464478 7285.8616770 15.57% 5 |
| 0 1 4 6151.1464478 7250.5022098 15.16% 10 |
| 0 1 4 6151.1464478 7211.5058102 14.70% 16 |
| 0 1 4 6151.1464478 7163.6470348 14.13% 23 |
| 0 1 4 6151.1464478 7129.9738056 13.73% 31 |
| 0 1 4 6151.1464478 7094.9905278 13.30% 39 |
| 0 1 4 6151.1464478 7076.1120371 13.07% 49 |
| 0 1 4 6151.1464478 7067.2773162 12.96% 58 |
| 0 1 4 6151.1464478 7061.4293169 12.89% 66 |
| 0 1 4 6151.1464478 7057.1903251 12.84% 75 |
| 0 1 4 6151.1464478 7054.1466684 12.80% 83 |
| 0 1 4 6151.1464478 7051.7940655 12.77% 92 |
| 0 1 4 6151.1464478 7049.8306437 12.75% 100 |
| 0 1 4 6151.1464478 7048.3704215 12.73% 108 |
| 0 1 4 6151.1464478 7047.1375914 12.71% 117 |
| 0 1 4 6151.1464478 7047.1375914 12.71% 119 |
| NOTE: The MILP solver added 14186 cuts with 380378 cut coefficients at the root. |
| NOTE: Real time limit reached. |
| NOTE: Objective of the best integer solution found = 6151.1464478. |
| NOTE: The Cloud Analytic Services server processed the request in 120.220546 seconds. |
Standard MILP techniques struggle to solve the problem within the specified time limit. The default decomposition method attempts to find a block-angular structure by using the matrix-stretching techniques that are described in Grcar (1990) and Aykanat, Pinar, and Çatalyürek (2004) and techniques that are based on community detection and described in Khaniyev, Elhedhli, and Erenay (2018).
proc optmilp
nthreads = 4
data = mylib.mpsdata;
decomp
hybrid = false;
run;
The solution summary is displayed in Output 18.4.3.
Output 18.4.3: Solution Summary
| Solution Summary | |
|---|---|
| Solver | MILP |
| Algorithm | Decomposition |
| Objective Function | Total_Profit |
| Solution Status | Optimal within Relative Gap |
| Objective Value | 6972.3309347 |
| Relative Gap | 9.1750082E-9 |
| Absolute Gap | 0.0000639712 |
| Primal Infeasibility | 5.07927E-14 |
| Bound Infeasibility | 5.884182E-15 |
| Integer Infeasibility | 8.881784E-15 |
| Best Bound | 6972.3309986 |
| Nodes | 1 |
| Solutions Found | 10 |
| Iterations | 7 |
| Presolve Time | 0.27 |
| Solution Time | 43.68 |
The iteration log, which contains the problem statistics and the progress of the solution, is shown in Output 18.4.4.
Output 18.4.4: Log
| NOTE: The problem MPSDATA has 52638 variables (16038 binary, 0 integer, 0 free, 0 fixed). |
| NOTE: The problem has 3949 constraints (3339 LE, 0 EQ, 610 GE, 0 range). |
| NOTE: The problem has 148866 constraint coefficients. |
| NOTE: The initial MILP heuristics are applied. |
| NOTE: The MILP presolver value AUTOMATIC is applied. |
| NOTE: The MILP presolver removed 0 variables and 734 constraints. |
| NOTE: The MILP presolver removed 17616 constraint coefficients. |
| NOTE: The MILP presolver modified 0 constraint coefficients. |
| NOTE: The presolved problem has 52638 variables, 3215 constraints, and 131250 constraint |
| coefficients. |
| NOTE: The MILP solver is called. |
| NOTE: The Decomposition algorithm is used. |
| NOTE: The Decomposition algorithm is executing in the distributed computing environment in |
| single-machine mode. |
| NOTE: The DECOMP method value DEFAULT is applied. |
| NOTE: The decomposition identification used 0.16 (cpu: 0.20) seconds. |
| NOTE: The problem has a decomposable structure with 610 blocks. The largest block covers |
| 0.2488% of the constraints in the problem. |
| NOTE: The decomposition subproblems cover 52638 (100%) variables and 3207 (99.75%) constraints. |
| NOTE: The deterministic parallel mode is enabled. |
| NOTE: The Decomposition algorithm is using up to 4 threads. |
| Iter Best Master Best LP IP CPU Real |
| Bound Objective Integer Gap Gap Time Time |
| . 7963.9920 6475.3533 6472.9990 18.69% 18.72% 12 8 |
| 2 7273.6083 6475.3533 6472.9990 10.97% 11.01% 24 14 |
| 3 7149.3907 6863.5987 6472.9990 4.00% 9.46% 41 23 |
| 5 6985.8461 6960.5561 6960.5561 0.36% 0.36% 63 33 |
| 6 6985.8461 6967.2510 6967.2510 0.27% 0.27% 77 39 |
| 7 6972.3310 6972.3309 6972.3309 0.00% 0.00% 86 43 |
| Node Active Sols Best Best Gap CPU Real |
| Integer Bound Time Time |
| 0 1 10 6972.3309 6972.3310 0.00% 86 43 |
| NOTE: The Decomposition algorithm used 4 threads. |
| NOTE: The Decomposition algorithm time is 43.67 seconds. |
| NOTE: Optimal within relative gap. |
| NOTE: Objective = 6972.3309347. |
| NOTE: The Cloud Analytic Services server processed the request in 44.098506 seconds. |
As stated in the log, the algorithm successfully finds a decomposition that contains 610 blocks and has more than 99% subproblem coverage.