Linear Assignment Problem, Sparse vs. Dense Input (netsle04)
/*************************************************************************/
/* */
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: netsle04 */
/* TITLE: Linear Assignment Problem, Sparse vs. Dense Input (netsle04) */
/* PRODUCT: OR */
/* SYSTEM: ALL */
/* KEYS: OR */
/* PROCS: OPTMODEL, CONTENTS, SQL, PRINT */
/* DATA: */
/* */
/* SUPPORT: UPDATE: */
/* REF: */
/* MISC: Example 4 from the network solver documentation. */
/* */
/*************************************************************************/
data RelayTimesMatrix;
input name $ sex $ back breast fly free;
datalines;
Sue F . 36.7 28.3 36.1
Karen F 34.6 . . 26.2
Jan F 31.3 . 27.1 .
Andrea F 28.6 . 29.1 .
Carol F 32.9 . 26.6 .
;
data RelayTimesLinks;
input name $ attr $ cost;
datalines;
Sue breast 36.7
Sue fly 28.3
Sue free 36.1
Karen back 34.6
Karen free 26.2
Jan back 31.3
Jan fly 27.1
Andrea back 28.6
Andrea fly 29.1
Carol back 32.9
Carol fly 26.6
;
proc contents data=RelayTimesMatrix
out=stroke_data(rename=(name=stroke) where=(type=1));
run;
proc optmodel;
set <str> STROKES;
read data stroke_data into STROKES=[stroke];
set <str> SWIMMERS;
str sex {SWIMMERS};
num time {SWIMMERS, STROKES};
read data RelayTimesMatrix into SWIMMERS=[name]
sex
{stroke in STROKES} <time[name,stroke]=col(stroke)>;
set SWIMMERS_STROKES =
{name in SWIMMERS, stroke in STROKES: time[name,stroke] ne .};
set <str,str> PAIRS;
solve with NETWORK /
graph_direction = directed
links = (weight=time)
subgraph = (links=SWIMMERS_STROKES)
lap
out = (assignments=PAIRS)
;
put PAIRS;
create data LinearAssignMatrix from [name assign]=PAIRS
sex[name] cost=time;
quit;
proc sql;
create table stroke_data as
select distinct attr as stroke
from RelayTimesLinks;
quit;
proc optmodel;
set <str> STROKES;
read data stroke_data into STROKES=[stroke];
set <str> SWIMMERS;
str sex {SWIMMERS};
set <str,str> SWIMMERS_STROKES;
num time {SWIMMERS_STROKES};
read data RelayTimesLinks into SWIMMERS_STROKES=[name attr] time=cost;
set <str,str> PAIRS;
solve with NETWORK /
graph_direction = directed
links = (weight=time)
lap
out = (assignments=PAIRS)
;
put PAIRS;
create data LinearAssignLinks from [name attr]=PAIRS cost=time;
quit;
proc print data=LinearAssignMatrix noobs label;
sum cost;
run;
proc print data=LinearAssignLinks noobs label;
sum cost;
run;