## Migration: Maximum Flow (lpsol7)

```/**********************************************************************/
/*                                                                    */
/*                   S A S   S A M P L E   L I B R A R Y              */
/*                                                                    */
/*    NAME: lpsol7                                                    */
/*   TITLE: Migration: Maximum Flow (lpsol7)                          */
/* PRODUCT: OR                                                        */
/*  SYSTEM: ALL                                                       */
/*    KEYS: OR                                                        */
/*   PROCS: OPTMODEL                                                  */
/*    DATA:                                                           */
/*                                                                    */
/* SUPPORT:                             UPDATE:                       */
/*     REF:                                                           */
/*    MISC: Example 7 from the Linear Programming Solver              */
/*          chapter of Mathematical Programming.                      */
/*                                                                    */
/**********************************************************************/

title 'Maximum Flow Problem';

data arcs;
input _from_ \$ _to_ \$ _cost_ _capac_;
datalines;
S a . .
S b . .
a c 1 7
b c 2 9
a d 3 5
b d 4 8
c e 5 15
d f 6 20
e g 7 11
f g 8 6
e h 9 12
f h 10 4
g T . .
h T . .
;

proc optmodel;
str source = 'S';
str sink = 'T';

set <str> NODES;
num _supdem_ {i in NODES} = (if i in {source, sink} then . else 0);

set <str,str> ARCS;
num _lo_ {ARCS} init 0;
num _capac_ {ARCS} init .;
num _cost_ {ARCS} init 0;
read data arcs nomiss into ARCS=[_from_ _to_] _cost_ _capac_;
NODES = (union {<i,j> in ARCS} {i,j});

var Flow {<i,j> in ARCS} >= _lo_[i,j];
for {<i,j> in ARCS: _capac_[i,j] ne .} Flow[i,j].ub = _capac_[i,j];
max obj = sum {<i,j> in ARCS: j = sink} Flow[i,j];
con balance {i in NODES diff {source, sink}}:
sum {<(i),j> in ARCS} Flow[i,j]
- sum {<j,(i)> in ARCS} Flow[j,i] = _supdem_[i];

solve;

num _supply_ {<i,j> in ARCS} =
(if _supdem_[i] ne 0 then _supdem_[i] else .);
num _demand_ {<i,j> in ARCS} =
(if _supdem_[j] ne 0 then -_supdem_[j] else .);
num _fcost_ {<i,j> in ARCS} = _cost_[i,j] * Flow[i,j].sol;

create data gout3 from [_from_ _to_]
_cost_ _capac_ _lo_ _supply_ _demand_ _flow_=Flow _fcost_;
quit;

proc print data=gout3;
run;

```