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_;

```