Article · Wikipedia archive · Last revised Aug 3, 2026

Dantzig–Wolfe decomposition

Dantzig–Wolfe decomposition is an algorithm for solving linear programming problems by exploiting their structure. It was originally developed by George Dantzig and Philip Wolfe and initially published in 1960. Many texts on linear programming have sections dedicated to discussing this decomposition algorithm. Dantzig–Wolfe decomposition can be used to improve the tractability of large-scale linear programs or create a tighter linear relaxation of mixed integer linear programs.

Last revised
Aug 3, 2026
Read time
≈ 6 min
Length
1,303 w
Citations
10
Source

Dantzig–Wolfe decomposition is an algorithm for solving (mixed integer) linear programming problems by exploiting their structure. It was originally developed by George Dantzig and Philip Wolfe and initially published in 1960.1 Many texts on linear programming have sections dedicated to discussing this decomposition algorithm.234567 Dantzig–Wolfe decomposition can be used to improve the tractability of large-scale linear programs or create a tighter linear relaxation of mixed integer linear programs.

Explanation using column generation

The Dantzig-Wolfe decomposition considers the following initial linear program.

min     c T x subject to     A x a B x b x R {\displaystyle {\begin{aligned}\min ~~&c^{T}x\\{\text{subject to}}~~&Ax\leq a\\&Bx\leq b\\&x\in \mathbb {R} \end{aligned}}}

The decomposition starts by reformulating the problem. the constraint B x b {\displaystyle Bx\leq b} is equivalently reformulating by writing x {\displaystyle x} as a convex combination of points satisfying B x b {\displaystyle Bx\leq b} . This leads to the following linear program.

min     c T x subject to     A x a x = i λ i x i i λ i = 1 x R ,   λ i R + {\displaystyle {\begin{aligned}\min ~~&c^{T}x\\{\text{subject to}}~~&Ax\leq a\\&x=\sum _{i}\lambda _{i}x_{i}\\&\sum _{i}\lambda _{i}=1\\&x\in \mathbb {R} ,~\lambda _{i}\in \mathbb {R} ^{+}\end{aligned}}} or equivalently min     c T i λ i x i subject to     A i λ i x i a i λ i = 1 λ i R + {\displaystyle {\begin{aligned}\min ~~&c^{T}\sum _{i}\lambda _{i}x_{i}\\{\text{subject to}}~~&A\sum _{i}\lambda _{i}x_{i}\leq a\\&\sum _{i}\lambda _{i}=1\\&\lambda _{i}\in \mathbb {R} ^{+}\end{aligned}}}

Here the new variables λ i {\displaystyle \lambda _{i}} represent the coefficient in the convex combination, and the coefficients x i {\displaystyle x_{i}} represent the points satisfying B x b {\displaystyle Bx\leq b} . In order to be exact, the formulation needs to contain one variable λ i {\displaystyle \lambda _{i}} for each extreme point of the polyhedron induced by B x b {\displaystyle Bx\leq b} . This is because every point of a non-empty, bounded convex polyhedron can be represented as a convex combination of its extreme points. This leads to an intractable number of variables.

In order to be able to solve this new formulation containing an intractable number of variables, one use the column generation algorithm. This leads to an iterative algorithm where a couple ( λ i , x i ) {\displaystyle (\lambda _{i},x_{i})} is generated at every iteration.

Remarque: if the initial problem contains several constraints A x a {\displaystyle Ax\leq a} , B x b {\displaystyle Bx\leq b} , C x c {\displaystyle Cx\leq c} ... each of these constraints can be independently reformulated with the Dantzig-Wolfe method. This leads to independent sub-problems in the column generation algorithm. This fact is especially useful when the matrix constraint of the initial problem has a form of block diagonal structure.

The whole algorithm can be summarized as follows.

  1. Initialize the reformulated problem (P) with a small subset of the points x i {\displaystyle x_{i}} and their corresponding variables λ i {\displaystyle \lambda _{i}} ;
  2. Find an optimal solution x {\displaystyle x^{*}} of (P);
  3. Search for a point x i {\displaystyle x_{i}} satisfying B x b {\displaystyle Bx\leq b} whose addition to (P) may improve the value of the optimal solution x {\displaystyle x^{*}} ;
  4. If such a point exists, add it to (P) and go to Step 2;
  5. Otherwise x {\displaystyle x^{*}} is optimal : stop.

It can be visualized as follows.

Initialization of (P) with a small subset of the points x i {\displaystyle x_{i}} (red polyhedron). Black arrow : objective function c; gray poly : A x a {\displaystyle Ax\leq a} ; dashed blue poly : B x b {\displaystyle Bx\leq b} . source ↗
Iteration 1. A direction (red arrow) in which to search a new point x i {\displaystyle x_{i}} is created with the dual variables of (P). The farthest point in this direction satisfying B x b {\displaystyle Bx\leq b} is found and added to (P). source ↗
Iteration 2. Re-optimization over (P). Then, the farthest point in the dual direction satisfying B x b {\displaystyle Bx\leq b} is found and added to (P). source ↗
The algorithm keeps going until no more improving points can be found. source ↗

Exploiting special structure

The main use case for the Dantzig–Wolfe decomposition is when the constraint matrix of the linear program has the following 'almost diagonal' structure visualized below.

Here, the set of constraints D is usually be identified as "connecting", "coupling", or "complicating" constraints. Meanwhile each constraint block F i {\displaystyle F_{i}} is going to be reformulated using the Dantig-Wolfe method. This leads to one sub-problem for each block F i {\displaystyle F_{i}} .

The two main reasons why the Dantzig-Wolfe method works especially well in this case are the following. First, each block F i {\displaystyle F_{i}} only applies to a subset of the variables. This means the corresponding sub-problem will be a lot smaller than the original problem (less constraints and less variables) which means it can be solved faster. Second, although the sub-problem can always be solved independently, in the case of a diagonal structure the sub-problems are usually less linked. Indeed, suppose that F 1 {\displaystyle F_{1}} and F 2 {\displaystyle F_{2}} share a variable x 1 {\displaystyle x_{1}} , then they have to 'agree' on the value of x 1 {\displaystyle x_{1}} . This means every time the F 1 {\displaystyle F_{1}} sub-problem proposes a new point with a different value for x 1 {\displaystyle x_{1}} , the F 2 {\displaystyle F_{2}} sub-problem also has to generate a new point with an agreeing value for x 1 {\displaystyle x_{1}} . This slows down the overall process.

Implementation

There are examples of the implementation of Dantzig–Wolfe decomposition available in the closed source AMPL8 and GAMS9 mathematical modeling software. There are general, parallel, and fast implementations available as open-source software, including some provided by JuMP and the GNU Linear Programming Kit.10

The algorithm can be implemented such that the subproblems are solved in parallel, since their solutions are completely independent. When this is the case, there are options for the master program as to how the columns should be integrated into the master. The master may wait until each subproblem has completed and then incorporate all columns that improve the objective or it may choose a smaller subset of those columns. Another option is that the master may take only the first available column and then stop and restart all of the subproblems with new objectives based upon the incorporation of the newest column.

Another design choice for implementation involves columns that exit the basis at each iteration of the algorithm. Those columns may be retained, immediately discarded, or discarded via some policy after future iterations (for example, remove all non-basic columns every 10 iterations).

See also

See also

References

References

  1. George B. Dantzig; Philip Wolfe (1960). "Decomposition Principle for Linear Programs". Operations Research. 8: 101–111. doi:10.1287/opre.8.1.101.
  2. Dimitris Bertsimas; John N. Tsitsiklis (1997). Linear Optimization. Athena Scientific.
  3. George B. Dantzig; Mukund N. Thapa (1997). Linear Programming 2: Theory and Extensions. Springer.
  4. Vašek Chvátal (1983). Linear Programming. Macmillan.
  5. Maros, István; Mitra, Gautam (1996). "Simplex algorithms". In J. E. Beasley (ed.). Advances in linear and integer programming. Oxford Science. pp. 1–46. MR 1438309.
  6. Maros, István (2003). Computational techniques of the simplex method. International Series in Operations Research & Management Science. Vol. 61. Boston, MA: Kluwer Academic Publishers. pp. xx+325. ISBN 1-4020-7332-1. MR 1960274.
  7. Lasdon, Leon S. (2002). Optimization theory for large systems (reprint of the 1970 Macmillan ed.). Mineola, New York: Dover Publications, Inc. pp. xiii+523. MR 1888251.
  8. "AMPL code repository with Dantzig–Wolfe example". Retrieved December 26, 2008.
  9. Kalvelagen, Erwin (May 2003), Dantzig-Wolfe Decomposition with GAMS (PDF), retrieved 2014-03-31.
  10. "Open source Dantzig-Wolfe implementation". Retrieved October 15, 2010.