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

The OPTMILP Procedure

Solution Summary
SolverMILP
AlgorithmBranch and Cut
Objective FunctionTotal_Profit
Solution StatusTime Limit Reached
Objective Value6151.1464478
  
Relative Gap0.1271425642
Absolute Gap895.99114358
Primal Infeasibility0
Bound Infeasibility0
Integer Infeasibility0
  
Best Bound7047.1375914
Nodes1
Solutions Found4
Iterations137399
  
Presolve Time0.33
Solution Time119.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

The OPTMILP Procedure

Solution Summary
SolverMILP
AlgorithmDecomposition
Objective FunctionTotal_Profit
Solution StatusOptimal within Relative Gap
Objective Value6972.3309347
  
Relative Gap9.1750082E-9
Absolute Gap0.0000639712
Primal Infeasibility5.07927E-14
Bound Infeasibility5.884182E-15
Integer Infeasibility8.881784E-15
  
Best Bound6972.3309986
Nodes1
Solutions Found10
Iterations7
  
Presolve Time0.27
Solution Time43.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.

Last updated: June 22, 2026