## 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    .
;

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

```