Consider the software project defined in Example 4.24 but now the project requires a single resource: a programmer. A network diagram displaying the activities and their precedence relationships is shown in Output 4.24.1, as part of the same example.
Some of the activities in this project have a fixed duration, requiring a fixed length of time from a programmer. Other activities specify the amount of work required in terms of man-days; for these activities, the length of the task will depend on the number of programmers (or rate) that is assigned to the task. The activities in the project, their durations (if fixed) or the total work required (if resource-driven) in days, the precedence constraints, and the resource requirements are displayed in Output 4.25.1.
Suppose that you have only one programmer assigned to the project. You can determine a resource-constrained schedule using
PROC CPM by specifying a resource availability data set, resin
(also in Output 4.25.1). The Resource data set indicates that the resource Programmer
is a driving resource whenever the WORK variable has a valid value.
Output 4.25.1: Project Data
Software Development |
Activity Data Set SOFTWARE |
Activity | act | s1 | s2 | dur | mandays | Programmer |
---|---|---|---|---|---|---|
Plans & Reqts | 1 | 2 | 3 | 2 | . | 1 |
Product Design | 2 | 4 | 5 | . | 3 | 1 |
Test Plan | 3 | 6 | 7 | 3 | . | . |
Documentation | 4 | 9 | . | 1 | 2 | 1 |
Code | 5 | 8 | . | 1 | 10 | 1 |
Test Data | 6 | 8 | . | 5 | . | . |
Test Routines | 7 | 8 | . | 5 | . | . |
Test Product | 8 | 9 | . | 6 | . | 1 |
Finish | 9 | . | . | 0 | . | . |
Software Development |
Resource Availability Data Set |
Obs | per | otype | Programmer |
---|---|---|---|
1 | . | resrcdur | 1 |
2 | 12APR04 | reslevel | 1 |
The following statements invoke PROC CPM with a WORK= specification on the RESOURCE statement, which identifies (in number
of man-days, in this case) the amount of work required from the resource Programmer
for each activity. If the WORK variable has a missing value, the activity in that observation is assumed to have a fixed
duration. The project is scheduled to start on April 12, 2004, and the activities are assumed to follow a five-day work week.
The resulting schedule is displayed in Output 4.25.2. For each activity in the project, the value of the variable DUR_TYPE
indicates whether the resource drives the activity’s duration ('RDRIVEN') or not ('FIXED').
proc cpm data=software out=sftout1 resout=rout1 rsched=rsftout1 resin=resin date='12apr04'd interval=weekday; act act; succ s1 s2; dur dur; res Programmer / work=mandays obstype=otype period=per rschedid=Activity; id Activity; run; title 'Software Development'; title2 'Resource Constrained Schedule: Single Programmer'; proc print data=rsftout1 heading=h; id Activity; run;
Output 4.25.2: Resource Schedule
Software Development |
Resource Constrained Schedule: Single Programmer |
Activity | act | RESOURCE | DUR_TYPE | dur | mandays | R_RATE | S_START | S_FINISH | E_START | E_FINISH | L_START | L_FINISH |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Plans & Reqts | 1 | 2 | . | . | 12APR04 | 13APR04 | 12APR04 | 13APR04 | 12APR04 | 13APR04 | ||
Plans & Reqts | 1 | Programmer | FIXED | 2 | . | 1 | 12APR04 | 13APR04 | 12APR04 | 13APR04 | 12APR04 | 13APR04 |
Product Design | 2 | 3 | . | . | 14APR04 | 16APR04 | 14APR04 | 16APR04 | 14APR04 | 16APR04 | ||
Product Design | 2 | Programmer | RDRIVEN | 3 | 3 | 1 | 14APR04 | 16APR04 | 14APR04 | 16APR04 | 14APR04 | 16APR04 |
Test Plan | 3 | 3 | . | . | 14APR04 | 16APR04 | 14APR04 | 16APR04 | 21APR04 | 23APR04 | ||
Documentation | 4 | 1 | . | . | 11MAY04 | 12MAY04 | 19APR04 | 20APR04 | 07MAY04 | 10MAY04 | ||
Documentation | 4 | Programmer | RDRIVEN | 2 | 2 | 1 | 11MAY04 | 12MAY04 | 19APR04 | 20APR04 | 07MAY04 | 10MAY04 |
Code | 5 | 1 | . | . | 19APR04 | 30APR04 | 19APR04 | 30APR04 | 19APR04 | 30APR04 | ||
Code | 5 | Programmer | RDRIVEN | 10 | 10 | 1 | 19APR04 | 30APR04 | 19APR04 | 30APR04 | 19APR04 | 30APR04 |
Test Data | 6 | 5 | . | . | 19APR04 | 23APR04 | 19APR04 | 23APR04 | 26APR04 | 30APR04 | ||
Test Routines | 7 | 5 | . | . | 19APR04 | 23APR04 | 19APR04 | 23APR04 | 26APR04 | 30APR04 | ||
Test Product | 8 | 6 | . | . | 03MAY04 | 10MAY04 | 03MAY04 | 10MAY04 | 03MAY04 | 10MAY04 | ||
Test Product | 8 | Programmer | FIXED | 6 | . | 1 | 03MAY04 | 10MAY04 | 03MAY04 | 10MAY04 | 03MAY04 | 10MAY04 |
Finish | 9 | 0 | . | . | 13MAY04 | 13MAY04 | 11MAY04 | 11MAY04 | 11MAY04 | 11MAY04 |
The following statements invoke PROC GANTT to display a Gantt chart of the schedule in Output 4.25.3. The activity, 'Documentation', is delayed until May 11, 2004, because there is only one programmer available to the project.
title h=2.5 'Software Development'; title2 h=1.5 'Resource Constrained Schedule: Single Programmer'; proc gantt graphics data=sftout1; id Activity Programmer; chart / compress scale=3 increment=4 interval=weekday height=2.8 nojobnum nolegend between=5 act=act succ=(s1 s2) cprec=cyan caxis=black ; run;
Next, suppose that you have two programmers assigned to your project and you can use either one of them for a given task,
depending on their availability. To model this scenario, specify Chris and John as alternate resources that can be substituted
for the resource Programmer
. The Resource data set, resin2
, printed in Output 4.25.4, indicates that Chris
and John
are alternates for Programmer
. Specifying an availability of '0' for the resource Programmer
ensures that the procedure will assign one of the two programmers, Chris or John, to each task.
The second observation in the data set resin2
indicates two different rates of substitution for the alternate resources. A value less than 1 indicates that the alternate
resource is more efficient than the primary resource, while a value greater than 1 indicates that the alternate resource is
less efficient. For fixed-duration activities, the use of the alternate resource changes the rate of utilization of the resource, while for a resource-driven activity, it changes the duration of the resource. The data set resin
specifies that John is twice as efficient as the primary resource Programmer
while Chris takes one and a half times as long as the generic resource to accomplish a task.
Output 4.25.4: Alternate Programmers
Resource Data Set RESIN2 |
Obs | per | otype | resid | Programmer | Chris | John |
---|---|---|---|---|---|---|
1 | . | resrcdur | 1 | 1.0 | 1.0 | |
2 | . | altrate | Programmer | . | 1.5 | 0.5 |
3 | 12APR04 | reslevel | . | 1.0 | 1.0 |
The following statements invoke PROC CPM with the new Resource data set and a modified Activity data set that includes the
newly added resource variables, Chris
and John
. You can see the effects of the alternate resource specifications in the Resource Schedule data set, printed in Output 4.25.5. The activity 'Product Design' that takes 3 days of time from a generic programmer actually takes 4.5 days because the programmer
used is Chris, who is substituted at a rate of 1.5. On the other hand, the programmer John efficiently completes the task,
'Documentation', in only 1 day, instead of the planned 2 days for a generic programmer. Note also that the start and finish
times are specified as SAS datetime values because the substitution of alternate resources results in some of the resource
durations being fractional.
data software2; set software; Chris = .; John = .; run; proc cpm data=software2 out=sftout2 rsched=rsftout2 resin=resin2 date='12apr04'd interval=weekday resout=rout2; act act; succ s1 s2; dur dur; res Programmer Chris John / work=mandays obstype=otype period=per resid=resid rschedid=Activity; id Activity; run;
Output 4.25.5: Resource Schedule with Alternate Programmers
Software Development |
Resource Constrained Schedule |
Alternate Resources at Varying Rates |
Activity | act | RESOURCE | DUR_TYPE | dur | mandays | R_RATE | S_START | S_FINISH | E_START | E_FINISH |
---|---|---|---|---|---|---|---|---|---|---|
Plans & Reqts | 1 | 2.0 | . | . | 12APR04:00:00:00 | 13APR04:23:59:59 | 12APR04:00:00:00 | 13APR04:23:59:59 | ||
Plans & Reqts | 1 | Programmer | FIXED | 2.0 | . | 1.0 | . | . | 12APR04:00:00:00 | 13APR04:23:59:59 |
Plans & Reqts | 1 | John | FIXED | 2.0 | . | 0.5 | 12APR04:00:00:00 | 13APR04:23:59:59 | . | . |
Product Design | 2 | 3.0 | . | . | 14APR04:00:00:00 | 20APR04:11:59:59 | 14APR04:00:00:00 | 16APR04:23:59:59 | ||
Product Design | 2 | Programmer | RDRIVEN | 3.0 | 3.0 | 1.0 | . | . | 14APR04:00:00:00 | 16APR04:23:59:59 |
Product Design | 2 | Chris | RDRIVEN | 4.5 | 4.5 | 1.0 | 14APR04:00:00:00 | 20APR04:11:59:59 | . | . |
Test Plan | 3 | 3.0 | . | . | 14APR04:00:00:00 | 16APR04:23:59:59 | 14APR04:00:00:00 | 16APR04:23:59:59 | ||
Documentation | 4 | 1.0 | . | . | 20APR04:12:00:00 | 21APR04:11:59:59 | 19APR04:00:00:00 | 20APR04:23:59:59 | ||
Documentation | 4 | Programmer | RDRIVEN | 2.0 | 2.0 | 1.0 | . | . | 19APR04:00:00:00 | 20APR04:23:59:59 |
Documentation | 4 | John | RDRIVEN | 1.0 | 1.0 | 1.0 | 20APR04:12:00:00 | 21APR04:11:59:59 | . | . |
Code | 5 | 1.0 | . | . | 20APR04:12:00:00 | 11MAY04:11:59:59 | 19APR04:00:00:00 | 30APR04:23:59:59 | ||
Code | 5 | Programmer | RDRIVEN | 10.0 | 10.0 | 1.0 | . | . | 19APR04:00:00:00 | 30APR04:23:59:59 |
Code | 5 | Chris | RDRIVEN | 15.0 | 15.0 | 1.0 | 20APR04:12:00:00 | 11MAY04:11:59:59 | . | . |
Test Data | 6 | 5.0 | . | . | 19APR04:00:00:00 | 23APR04:23:59:59 | 19APR04:00:00:00 | 23APR04:23:59:59 | ||
Test Routines | 7 | 5.0 | . | . | 19APR04:00:00:00 | 23APR04:23:59:59 | 19APR04:00:00:00 | 23APR04:23:59:59 | ||
Test Product | 8 | 6.0 | . | . | 11MAY04:12:00:00 | 19MAY04:11:59:59 | 03MAY04:00:00:00 | 10MAY04:23:59:59 | ||
Test Product | 8 | Programmer | FIXED | 6.0 | . | 1.0 | . | . | 03MAY04:00:00:00 | 10MAY04:23:59:59 |
Test Product | 8 | John | FIXED | 6.0 | . | 0.5 | 11MAY04:12:00:00 | 19MAY04:11:59:59 | . | . |
Finish | 9 | 0.0 | . | . | 19MAY04:12:00:00 | 19MAY04:12:00:00 | 11MAY04:00:00:00 | 11MAY04:00:00:00 |