Shortest Paths To and From SAS (netslg01)
/***************************************************************/
/* */
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: netslg01 */
/* TITLE: Shortest Paths To and From SAS (netslg01) */
/* PRODUCT: OR */
/* SYSTEM: ALL */
/* KEYS: OR */
/* PROCS: OPTMODEL, PRINT, SORT */
/* DATA: */
/* */
/* SUPPORT: UPDATE: */
/* REF: Examples from the Getting Started section of the */
/* network solver documentation. */
/* MISC: */
/* */
/***************************************************************/
/* Road Network Shortest Path */
data LinkSetInRoadNC10am;
input start_inter $1-20 end_inter $20-40 miles miles_per_hour;
datalines;
614CapitalBlvd Capital/WadeAve 0.6 25
614CapitalBlvd Capital/US70W 0.6 25
614CapitalBlvd Capital/US440W 3.0 45
Capital/WadeAve WadeAve/RaleighExpy 3.0 40
Capital/US70W US70W/US440W 3.2 60
US70W/US440W US440W/RaleighExpy 2.7 60
Capital/US440W US440W/RaleighExpy 6.7 60
US440W/RaleighExpy RaleighExpy/US40W 3.0 60
WadeAve/RaleighExpy RaleighExpy/US40W 3.0 60
RaleighExpy/US40W US40W/HarrisonAve 1.3 55
US40W/HarrisonAve SASCampusDrive 0.5 25
;
proc optmodel;
set<str,str> LINKS;
num miles{LINKS};
num miles_per_hour{LINKS};
num time_to_travel{<i,j> in LINKS} = miles[i,j]/ miles_per_hour[i,j] * 60;
read data LinkSetInRoadNC10am into
LINKS=[start_inter end_inter]
miles miles_per_hour
;
/* You can compute paths between many pairs of source and destination,
so these parameters are declared as sets */
set HOME = /"614CapitalBlvd"/;
set WORK = /"SASCampusDrive"/;
/* The path is stored as a set of: Start, End, Sequence, Tail, Head */
set<str,str,num,str,str> PATH;
solve with network /
links = ( weight = time_to_travel )
shortpath = ( source = HOME
sink = WORK )
out = ( sppaths = PATH )
;
create data ShortPath from [s t order start_inter end_inter]=PATH
time_to_travel[start_inter,end_inter];
quit;
proc print data=ShortPath(keep=order start_inter end_inter time_to_travel)
noobs label;
sum time_to_travel;
run;
proc optmodel;
set<str,str> LINKS;
num miles{LINKS};
num miles_per_hour{LINKS};
num time_to_travel{<i,j> in LINKS} = miles[i,j]/ miles_per_hour[i,j] * 60;
read data LinkSetInRoadNC10am into
LINKS=[start_inter end_inter]
miles miles_per_hour
;
/* high traffic */
miles_per_hour['Capital/WadeAve','WadeAve/RaleighExpy'] = 25;
/* You can compute paths between many pairs of source and destination,
so these parameters are declared as sets */
set HOME = /"614CapitalBlvd"/;
set WORK = /"SASCampusDrive"/;
/* The path is stored as a set of: Start, End, Sequence, Tail, Head */
set<str,str,num,str,str> PATH;
solve with network /
links = ( weight = time_to_travel )
shortpath = ( source = WORK
sink = HOME )
out = ( sppaths = PATH )
;
create data ShortPath from [s t order start_inter end_inter]=PATH
time_to_travel[start_inter,end_inter];
quit;
proc print data=ShortPath(keep=order start_inter end_inter time_to_travel)
noobs label;
sum time_to_travel;
run;