The Dantzig-Wolfe Decomposition Algorithm
Solving a MILP with DECOMP and PROC OPTMILP
Alternatively, to solve the MILP with the OPTMILP procedure, create a corresponding data table that uses the mathematical programming system (MPS) format as follows:
data mpsdata;
input field1 $ field2 $ field3 $ field4 field5 $ field6;
datalines;
NAME . mpsdata . . .
ROWS . . . . .
MAX f . . . .
G m . . . .
L s1 . . . .
L s2 . . . .
COLUMNS . . . . .
. .MRK0000 'MARKER' . 'INTORG' .
. x[1,1] f 1 m 1
. x[1,1] s1 5 . .
. x[2,1] f 2 s1 7
. x[3,1] f 1 s1 4
. x[1,2] m 1 s2 1
. x[2,2] f 1 s2 2
. x[3,2] f 1 s2 1
. .MRK0001 'MARKER' . 'INTEND' .
RHS . . . . .
. .RHS. m 1 . .
. .RHS. s1 11 . .
. .RHS. s2 2 . .
BOUNDS . . . . .
UP .BOUNDS. x[1,1] 1 . .
UP .BOUNDS. x[2,1] 1 . .
UP .BOUNDS. x[3,1] 1 . .
UP .BOUNDS. x[1,2] 1 . .
UP .BOUNDS. x[2,2] 1 . .
UP .BOUNDS. x[3,2] 1 . .
ENDATA . . . . .
;
data mylib.mpsdata;
set mpsdata;
_id_ = _n_;
;
Next, use the following data table to define the subproblem blocks:
data mylib.blocks;
input _row_ $ _block_;
datalines;
s1 0
s2 1
;
Now, you can use the following PROC OPTMILP statements to solve this MILP:
proc optmilp
data = mylib.mpsdata
presolver = none;
decomp
logfreq = 1
blocks = mylib.blocks;
run;
Last updated: September 09, 2026