Min-cost Network Flow Problem Using Network Simplex (lpsole05)
/*************************************************************************/
/* */
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: lpsole05 */
/* TITLE: Min-cost Network Flow Problem Using Network Simplex (lpsole05) */
/* PRODUCT: OR */
/* SYSTEM: ALL */
/* KEYS: OR */
/* PROCS: OPTMODEL */
/* DATA: */
/* */
/* SUPPORT: UPDATE: */
/* REF: */
/* MISC: Example 5 from the Linear Programming Solver */
/* chapter of Mathematical Programming. */
/* */
/*************************************************************************/
data nodedata;
input _node_ $ _sd_;
datalines;
1 10
2 20
3 0
4 -5
5 0
6 0
7 -15
8 -10
;
data arcdata;
input _tail_ $ _head_ $ _lo_ _capac_ _cost_;
datalines;
1 4 0 15 2
2 1 0 10 1
2 3 0 10 0
2 6 0 10 6
3 4 0 5 1
3 5 0 10 4
4 7 0 10 5
5 6 0 20 2
5 7 0 15 7
6 8 0 10 8
7 8 0 15 9
;
proc optmodel;
set <str> NODES;
num supply_demand {NODES};
set <str,str> ARCS;
num arcLower {ARCS};
num arcUpper {ARCS};
num arcCost {ARCS};
read data arcdata into ARCS=[_tail_ _head_]
arcLower=_lo_ arcUpper=_capac_ arcCost=_cost_;
read data nodedata into NODES=[_node_] supply_demand=_sd_;
var flow {<i,j> in ARCS} >= arcLower[i,j] <= arcUpper[i,j];
min obj = sum {<i,j> in ARCS} arcCost[i,j] * flow[i,j];
con balance {i in NODES}:
sum {<(i),j> in ARCS} flow[i,j] - sum {<j,(i)> in ARCS} flow[j,i]
= supply_demand[i];
solve with lp / algorithm=ns scale=none logfreq=1;
print flow;
quit;
%put &_OROPTMODEL_;
proc optmodel;
set <str> NODES;
num supply_demand {NODES};
set <str,str> ARCS;
num arcLower {ARCS};
num arcUpper {ARCS};
num arcCost {ARCS};
read data arcdata into ARCS=[_tail_ _head_]
arcLower=_lo_ arcUpper=_capac_ arcCost=_cost_;
read data nodedata into NODES=[_node_] supply_demand=_sd_;
var flow {<i,j> in ARCS} >= arcLower[i,j] <= arcUpper[i,j];
min obj = sum {<i,j> in ARCS} arcCost[i,j] * flow[i,j];
con balance {i in NODES}:
sum {<(i),j> in ARCS} flow[i,j] - sum {<j,(i)> in ARCS} flow[j,i]
= supply_demand[i];
con budgetOn2:
sum {<i,j> in ARCS: i='2'} arcCost[i,j] * flow[i,j] <= 50;
solve with lp / algorithm=ns scale=none logfreq=1;
print flow;
quit;
%put &_OROPTMODEL_;