Resources

Subdivision Construction Project

 /****************************************************************/
 /*          S A S   S A M P L E   L I B R A R Y                 */
 /*                                                              */
 /*    NAME: PMEX05                                              */
 /*   TITLE: Subdivision Construction Project                    */
 /* PRODUCT: OR                                                  */
 /*  SYSTEM: ALL                                                 */
 /*    KEYS: CPM                                                 */
 /*   PROCS: CPM, PRINT, NETDRAW, GANTT, SORT, GCHART, GPLOT     */
 /*    DATA:                                                     */
 /*                                                              */
 /* SUPPORT:                             UPDATE:                 */
 /*     REF: Example 5 of Project Management Examples Book       */
 /*    MISC: Project Management: Methods and Studies, B.V. Dean, */
 /*          ed., Lee and Olson, pp. 126-134                     */
 /****************************************************************/

goptions border hpos=80 vpos=43
         fby=swiss
         ftitle=swiss
         htitle=2
         ftext=swiss
         htext=1.5;

pattern1 v=solid c=blue;
pattern2 v=e c=blue;
pattern3 v=solid c=red;
pattern4 v=e c=red;
pattern5 v=x2 c=red;
pattern6 v=solid c=green;
pattern7 v=e c=magenta;
pattern8 v=solid c=magenta;
pattern9 v=x1 c=cyan;

title 'Subdivision Construction Project';

data build;
input act $ s1 $ s2 $ s3 $ s4 $ dur id & $20.
      cranes carpntrs laborers;
cards;
A B . . . 4  Excavate & Footers  1 2 2
B C E S . 2  Pour Foundation  1 2 4
C D H J Q 4  Frame & Roof  1 4 .
D W . . . 6  Brickwork  1 . 2
E F G . . 1  Basement Plumbing  . . .
F J . . . 2  Pour Basement  1 . 4
G K . . . 3  Rough Plumbing  . . 2
H L . . . 2  Initial Wiring  . . .
J K . . . 4  Heat & Ventilation  1 . .
K L . . . 10  Plaster  . . .
L M N P . 3  Finish Flooring  . 4 .
M V . . . 1  Kitchen Fixtures  . . .
N . . . . 2  Finish Plumbing  . . .
P U . . . 3  Finish Carpentry  . 4 .
Q R . . . 2  Finish Roof  1 3 .
R W . . . 1  Gutters & Downspouts  1 . .
S X . . . 1  Storm Drains  1 2 2
T . . . . 2  Varnish Floor  . . 3
U T . . . 3  Paint  . . .
V . . . . 1  Finish Electrical  . . .
W X . . . 2  Finish Grading  . . 2
X . . . . 5  Walks & Landscape  1 2 2
;

pattern1 v=e;

title2 'Building a House';

proc netdraw graphics data=build;
actnet/activity=act successor=(s1-s4)
id=(id dur) nodefid nolabel compress separatearcs
font=simplex;
run;

pattern1 v=s;

data breslvl;
     input period cranes carpntrs laborers;
cards;
0 1 5 4
;

proc cpm data=build out=bout
resin=breslvl resout=bres;
activity act;
duration dur;
id id;
successor s1-s4;
resource cranes carpntrs laborers/period=period
noe_start nol_start avp rcp delayanalysis;
run;

proc sort data=bout;
by s_start;
run;

title2 'Initial Schedule';

proc gantt graphics data=bout;
chart/compress nolegend;id id;
run;


symbol1 i=steplj w=2 l=1;
pattern1 v=M3N135;

axis1 label=('Number of Workers');

title2 'Laborer Requirements';

proc gplot data=bres;
plot rlaborers * _time_ /vaxis=axis1 areas=1;
run;
quit;

axis2 order=(0,1) minor=none label=('Number of Cranes');

title2 'Crane Usage';

proc gplot data=bres;
plot rcranes * _time_/vaxis=axis2 areas=1;
run;
quit;


data delay (keep=res r_delay);
     set bout;
     res=delay_r;
     if delay_r=' ' then res='NONE';
     label res='Delaying Resource';
run;

title2 h=1.5 'Distribution of Delaying Resources';
title3 h=1.2 'Percentage of Activities Delayed';

goptions htext=1;

proc gchart data=delay;
     pie res / type=freq
               percent=outside
               value=outside
               slice=outside
               explode='NONE'
               noheading;
run;
quit;

goptions htext=1.5;

title2 'Total (and Average) Workdays of Delay';

proc gchart data=delay;
     vbar res / midpoints= 'cranes' 'carpntrs' 'laborers'
                mean width=15
                type=sum
                sumvar=r_delay;
run;
quit;

pattern1 v=s;

 /* Adding a Second House */
title2 'Building Two Houses';

data build1;
set build;
act='H1'||act;
if s1 ne '' then s1='H1'||s1;
if s2 ne '' then s2='H1'||s2;
if s3 ne '' then s3='H1'||s3;
if s4 ne '' then s4='H1'||s4;
house=1;
run;

data build1a;
set build;
act='H2'||act;
if s1 ne '' then s1='H2'||s1;
if s2 ne '' then s2='H2'||s2;
if s3 ne '' then s3='H2'||s3;
if s4 ne '' then s4='H2'||s4;
house=2;
run;

data build2;
set build1 build1a;
run;

proc print data=build2 noobs;run;


proc cpm data=build2 out=bout2
resin=breslvl resout=bres2;
activity act;
duration dur;
id id house;
successor s1-s4;
resource cranes carpntrs laborers/period=period
noe_start nol_start avp rcp delayanalysis;
run;

proc sort data=bout2;
by house s_start;
run;

title2 'Combined Schedule';

proc gantt graphics data=bout2;
chart/compress nolegend hconnect lhcon=2;id id house;
run;

data delay1 (keep=res r_delay house);
     set bout2;
     res=delay_r;
     if delay_r=' ' then res='NONE';
     label res='Delaying Resource';
run;

title2 h=1.5 'Distribution of Delaying Resources';

goptions htext=1;

proc gchart data=delay1;
     pie res / type=freq
               percent=outside
               value=outside
               slice=outside
               explode='NONE'
               group=house
               across=2
               noheading;
run;
quit;

title2 h=1.5 'Total (and Average) Workdays of Delay';

proc gchart data=delay1;
     vbar res / midpoints= 'cranes' 'carpntrs' 'laborers'
                group=house
                mean width=12
                type=sum
                sumvar=r_delay;
run;
quit;

goptions htext=1.5;

proc cpm data=build2 out=bout3
resin=breslvl resout=bres3;
activity act;
duration dur;
id id house;
successor s1-s4;
resource cranes carpntrs laborers/period=period
noe_start nol_start avp rcp rule=actprty actprty=house;
run;

proc sort data=bout3;
by s_start;
run;

title2 'Prioritizing House 1';

proc print data=bout3 noobs;
var id house cranes carpntrs laborers s_start s_finish;
run;


proc cpm data=build1 out=house1
resin=breslvl resout=resout1;
activity act;
duration dur;
id id house;
successor s1-s4;
resource cranes carpntrs laborers/period=period
noe_start nol_start avp rcp;
run;

title2 'House 1 Resource Usage Data';

proc print data=resout1 noobs;run;

data remres;
set resout1
   (rename=(acranes=cranes
            acarpntrs=carpntrs
            alaborers=laborers
            _time_=period));
keep period cranes carpntrs laborers;
run;


proc cpm data=build1a out=house2
resin=remres resout=resout2;
activity act;
duration dur;
id id house;
successor s1-s4;
resource cranes carpntrs laborers/period=period
noe_start nol_start avp rcp;
run;

data houses;
set house1 house2;
run;

proc sort data=houses;
by s_start;
run;

title2 'Sequential Scheduling of Houses';

proc gantt graphics data=houses;
chart/compress nolegend hconnect lhcon=2;
id id house;
run;

data resout;
merge resout1 resout2;
by _time_;
run;


title2 'Crane Usage - Sequential Scheduling';

symbol1 i=steplj w=2 l=1;
pattern1 v=M3N135;

proc gplot data=resout;
     plot rcranes * _time_/vaxis=axis2 areas=1;
run;
quit;

pattern1 v=s;

data resprty;
input obstype $ period cranes carpntrs laborers;
cards;
resprty . 1 2 2
;

data resin;
set breslvl resprty;
if period=0 then obstype='reslevel';
run;

proc cpm data=build2 out=bout4
resin=resin resout=bres4;
activity act;
duration dur;
id id house;
successor s1-s4;
resource cranes carpntrs laborers/period=period
noe_start nol_start avp rcp obstype=obstype rule=resprty;
run;

proc sort data=bout4;
by s_start;
run;

title2 'Crane Priority Schedule';

proc print data=bout4 noobs;
var id house cranes carpntrs laborers s_start s_finish;
run;

title2 'Crane Priority Resource Usage';

proc print data=bres4 noobs;
run;

title2 'Crane Schedule';

proc gantt graphics data=bout4;
     chart/compress nolegend;
     id id house;
     where cranes ^= .;
run;