The CPM Procedure

RESOURCE Statement

RESOURCE variables / resource options ;

RES variables / resource options ;

The RESOURCE statement identifies the variables in the Activity data set that contain the levels of the various resources required by the different activities. This statement is necessary if the procedure is required to summarize resource utilization for various resources.

This statement is also required when the activities in the network use limited resources and a schedule is to be determined subject to resource constraints in addition to precedence constraints. The levels of the various resources available are obtained from the RESOURCEIN= data set (the Resource data set.) This data set need not contain all of the variables listed in the RESOURCE statement. If any resource variable specified in the RESOURCE statement is not also found in the Resource data set, it is assumed to be available in unlimited quantity and is not used in determining the constrained schedule.

The following options are available with the RESOURCE statement to help control scheduling the activities subject to resource constraints. Some control the scheduling heuristics, some control the amount of information to be output to the RESOURCEOUT= data set (the Usage data set), and so on.

ACTDELAY=variable

specifies the name of a variable in the Activity data set that specifies a value for the maximum amount of delay allowed for each activity. The values of this variable should be greater than or equal to 0. If a value is missing, the value of the DELAY= option is used instead.

ACTIVITYPRTY=variable
ACTPRTY=variable

identifies the variable in the Activity data set that contains the priority of each activity. This option is required if resource-constrained scheduling is to be performed and the scheduling rule specified is ACTPRTY. If the value of the SCHEDRULE= option is specified as the keyword ACTPRTY, then all activities waiting for resources are ordered by increasing values of the ACTPRTY= variable. Missing values of the activity priority variable are treated as $+$INFINITY. See the section Scheduling Method for a description of the various scheduling rules used during resource constrained scheduling.

ADDCAL

requests that a variable, _CAL_, be added to the Resource Schedule data set that identifies the resource calendar for each resource used by each activity. For observations that summarize the activity’s schedule, this variable identifies the activity’s calendar.

ALL

is equivalent to specifying the ESPROFILE and LSPROFILE options when an unconstrained schedule is obtained and is equivalent to specifying all four options, AVPROFILE (AVP), ESPROFILE (ESP), LSPROFILE (LSP), and RCPROFILE (RCP), when a resource-constrained schedule is obtained. If none of these four options are specified and a Usage data set is specified, by default the ALL option is assumed to be in effect.

ALTBEFORESUP

indicates that all alternate resources are to be checked first before using supplementary resources. By default, if supplementary levels of resources are available, the procedure uses supplementary levels first and uses alternate resources only if the supplementary levels are not sufficient.

APPEND
APPENDINTXRATE
APPENDRATEXINT
APPENDUSAGE

indicates that the Usage data set is to contain two sets of observations: the first set indicates the rate of usage for each resource at the beginning of the current time period, and the second set contains the total usage of each resource for the current time period. In other words, the Usage data set appends observations indicating the total usage of each resource to the default set of observations. If the APPEND option is specified, the procedure adds a variable named OBS_TYPE to the Usage data set. This variable contains the value 'RES_RATE' for the observations that indicate rate of usage and the value 'RES_USED' for the observations that indicate the total usage.

AROUTCAL=calname

specifies the name of the calendar to be used for incrementing the _TIME_ variable in the Usage data set.

AVPROFILE
AVP
AVL

creates one variable in the Usage data set corresponding to each variable in the RESOURCE statement. These new variables denote the amount of resources remaining after resource allocation. This option is ignored if resource allocation is not performed.

AWAITDELAY

forces PROC CPM to wait until L_START$+$delay, where delay is the maximum delay allowed for the activity (which is the value of the ACTDELAY= variable or the DELAY= option), before an activity is scheduled using supplementary levels of resources. By default, even if an activity has a nonzero value specified for the ACTDELAY= variable (or the DELAY= option), it may be scheduled using supplementary resources before L_START$+$delay. This happens if the procedure does not see any increase in the resource availability in the future. Thus, if it appears that the activity will require supplementary resources anyway, the procedure may schedule it before L_START$+$delay. The AWAITDELAY option prohibits this behavior; it will not use supplementary resources to schedule an activity before L_START$+$delay. This option can be used to force activities with insufficient resources to start at L_START by setting DELAY=0.

CUMUSAGE

specifies that the Usage data set should indicate the cumulative usage of consumable resources. Note that by default, for consumable resources, each observation in the Usage data set contains the rate of usage for each resource at the start of the given time interval. See the section RESOURCEOUT= Usage Data Set for a definition of the variables in the resource usage output data set. In some applications, it may be useful to obtain the cumulative usage of these resources. The CUMUSAGE option can be used to obtain the cumulative usage of consumable resources up to the time specified in the _TIME_ variable.

DELAY=delay

specifies the maximum amount by which an activity can be delayed due to lack of resources. If E_START of an activity is 1JUN04 and L_START is 5JUN04 and delay is specified as 2, PROC CPM first tries to schedule the activity to start on June 1, 2004. If there are not enough resources to schedule the activity, the CPM procedure postpones the activity’s start time. However, it does not postpone the activity beyond June 7, 2004 (because delay=2 and L_START=5JUN04).

If the activity cannot be scheduled even on 7JUN04, then PROC CPM tries to schedule it by using supplementary levels of resources, if available, or by using alternate resources, if possible. If resources are still not sufficient, the procedure stops with an error message. The default value of the DELAY= option is assumed to be $+$INFINITY.

DELAYANALYSIS
SLIPINF

causes the addition of three new variables to the Schedule data set. The variables are R_DELAY, DELAY_R and SUPPL_R. The R_DELAY variable indicates the number of units (in interval units) by which the activity’s schedule has slipped due to resource unavailability, and the DELAY_R variable contains the name of the resource, the delaying resource, that has caused the slippage.

The R_DELAY variable is calculated as follows: it is the difference between S_START and the time when an activity first enters the list of activities that are available to be scheduled. (See the section Scheduling Method for a definition of this waiting list of activities.) R_DELAY is not necessarily the same as S_START $-$ E_START.

If several resources are insufficient, causing a delay in the activity, DELAY_R is the name of the resource that first causes an activity to be postponed.

The variable SUPPL_R contains the name of the first resource that is used above the primary level in order for an activity to be scheduled at S_START.

ESPROFILE
ESP
ESS

creates one variable in the Usage data set corresponding to each variable in the RESOURCE statement. Each new variable denotes the resource usage based on the early start schedule for the corresponding resource variable.

E_START

requests that the E_START and E_FINISH variables, namely the variables specifying the early start schedule, be included in the Schedule data set in addition to the S_START and S_FINISH variables. This option is the default and can be turned off using the NOE_START option.

EXCLUNSCHED

excludes the resource consumption corresponding to unscheduled activities from the daily resource usage reported for each time period in the Usage data set. The Usage data set contains a variable named Rresname for each resource variable resname. For each observation in this data set, each such variable contains the total amount of resource (rate of usage for a consumable resource) used by all the activities that are active at the time period corresponding to that observation. By default, this calculation includes even activities that are still unscheduled when resource constrained scheduling is stopped either by the STOPDATE= option or due to resource infeasibilities. The EXCLUNSCHED option enables the exclusion of activities that are still unscheduled. The unscheduled activities are assumed to start as per the early start schedule (unless the UPDTUNSCHED option is specified).

FILLUNSCHED
FILLMISSING

fills in S_START and S_FINISH values for activities that are still unscheduled when resource constrained scheduling is stopped either by the STOPDATE= option or due to resource infeasibilities. By default, the Schedule data set contains missing values for S_START and S_FINISH corresponding to unscheduled activities. If the FILLUNSCHED option is on, the procedure uses the original E_START and E_FINISH times for these activities. If the UPDTUNSCHED option is also specified, the procedure uses updated values.

F_FLOAT

requests that the Schedule data set include the F_FLOAT variable computed using the unconstrained early and late start schedules. If resource allocation is not performed, this variable is always included in the output data set.

INCLUNSCHED

enables the inclusion of activities that are still unscheduled in the computation of daily (or cumulative) resource usage in the Usage data set when resource-constrained scheduling is stopped either by the STOPDATE= option or due to resource infeasibilities. This option is the default and can be turned off by the EXCLUNSCHED option.

INDEPENDENTALLOC
INDEPALLOC

enables each resource to be scheduled independently for each activity during resource-constrained scheduling. Consider the basic resource scheduling algorithm described in the section Scheduling Method. When all the precedence requirements of an activity are satisfied, the activity is inserted into the list of activities that are waiting for resources using the appropriate scheduling rule. An activity in this list is scheduled to start at a particular time only if all the resources required by it are available in sufficient quantity. Even if the resources are required by the activity for different lengths of time, or if the resources have different calendars, all resources must be available to start at that particular time (or at the beginning of the next work period for the resource’s calendar).

If you specify the INDEPENDENTALLOC option, however, each resource is scheduled independently of the others. This may cause an activity’s schedule to be extended if its resources cannot all start at the same time.

INFEASDIAGNOSTIC
INFEASDIAG

requests PROC CPM to continue scheduling even when resources are insufficient. When PROC CPM schedules the project subject to resource constraints, the scheduling process is stopped when the procedure cannot find sufficient resources for an activity before the activity’s latest possible start time (accounting for the DELAY= or ACTDELAY= options and using supplementary or alternate resources if necessary and if allowed). The INFEASDIAGNOSTIC option can be used to override this default action. (Sometimes, you may want to know the level of resources needed to schedule a project to completion even if resources are insufficient.) This option is equivalent to specifying infinite supplementary levels for all the resources under consideration; the DELAY= value is assumed to equal the default value of $+$INFINITY, unless otherwise specified.

LSPROFILE
LSP
LSS

creates one variable in the Usage data set corresponding to each variable in the RESOURCE statement. Each new variable denotes the resource usage based on the late start schedule for the corresponding resource variable.

L_START

requests that the L_START and L_FINISH variables, namely the variables specifying the late start schedule, be included in the Schedule data set in addition to the S_START and S_FINISH variables. This option is the default and can be turned off using the NOL_START option.

MAXDATE=maxdate

specifies the maximum value of the _TIME_ variable in the Usage data set. The default value of maxdate is the maximum finish time for all of the schedules for which a usage profile was requested.

MAXNSEGMT=variable
MAXNSEG=variable

specifies a variable in the Activity data set that indicates the maximum number of segments that the current activity can be split into. A missing value for this variable is set to a default value that depends on the duration of the activity and the value of the MINSEGMTDUR variable. A value of 1 indicates that the activity cannot be split. By default, PROC CPM assumes that any activity, once started, cannot be stopped until it is completed (except for breaks due to holidays or weekends). Thus, even during resource-constrained scheduling, an activity is scheduled only if enough resources can be found for it throughout its entire duration. Sometimes, you may want to allow preemption of activities already in progress; thus, a more critical activity could cause another activity to be split into two or more segments.

However, you may not want a particular activity to be split into too many segments, or to be split too many times. The MAXNSEGMT= and MINSEGMTDUR= options enable you to control the number of splits and the length of each segment.

MAXOBS=max

specifies an upper limit on the number of observations that the Usage data set can contain. If the values specified for the ROUTINTERVAL= and ROUTINTPER= options are such that the data set will contain more than max observations, then PROC CPM does not create the output data set and stops with an error message.

The MAXOBS= option is useful as a check to ensure that a very large data set (with several thousands of observations) is not created due to a wrong specification of the ROUTINTERVAL= option. For example, if interval is DTYEAR and routinterval is DTHOUR and the project extends over 2 years, the number of observations would exceed 15,000. The default value of the MAXOBS= option is 1000.

MILESTONERESOURCE

specifies that milestone activities consume resources. If a nonzero requirement is specified for a milestone, the corresponding consumable resources are used at the scheduled time of that milestone.

MILESTONENORESOURCE

specifies that milestone activities do not consume resources. This implies that all resource requirements are ignored for milestone activities. This is the default behavior.

MINDATE=mindate

specifies the minimum value of the _TIME_ variable in the Usage data set. The default value of mindate is the minimum start time for all of the schedules for which a usage profile is requested. Thus, the Usage data set has observations containing the resource usage and availability information from mindate through maxdate .

MINSEGMTDUR=variable
MINSEGD=variable

specifies a variable in the Activity data set that indicates the minimum duration of any segment of the current activity. A missing value for this variable is set to a value equal to one fifth of the activity’s duration.

MULTIPLEALTERNATES
MULTALT

indicates that multiple alternate resources can be used to substitute for a single resource. In other words, if one of the alternate resources is not sufficient to substitute for the primary resource, the procedure will use other alternates, as needed, to fulfill the resource requirement. For example, if an activity needs 1.5 programmers and the allowed alternates are JOHN and MARY, the procedure will use JOHN (at rate 1) and MARY (at rate 0.5) to allocate a total of 1.5 programmers. See the section Specifying Multiple Alternates for details.

NOE_START

requests that the E_START and E_FINISH variables, namely the variables specifying the early start schedule, be dropped from the Schedule data set. Note that the default is E_START. Also, if resource allocation is not performed, the NOE_START option is ignored.

NOF_FLOAT

requests that the F_FLOAT variable be dropped from the Schedule data set when resource-constrained scheduling is requested. This is the default behavior. To include the F_FLOAT variable in addition to the resource-constrained schedule, use the F_FLOAT option. If resource allocation is not performed, F_FLOAT is always included in the Schedule data set.

NOL_START

requests that the Schedule data set does not include the late start schedule, namely, the L_START and L_FINISH variables. Note that the default is L_START. Also, if resource allocation is not performed, the NOL_START option is ignored.

NORESOURCEVARS
NORESVARSOUT
NORESVARS

requests that the variables specified in the RESOURCE statement be dropped from the Schedule data set. By default, all of the resource variables specified on the RESOURCE statement are also included in the Schedule data set.

NOT_FLOAT

requests that the T_FLOAT variable be dropped from the Schedule data set when resource-constrained scheduling is requested. This is the default behavior. To include the T_FLOAT variable in addition to the resource-constrained schedule, use the T_FLOAT option. If resource allocation is not performed, T_FLOAT is always included in the Schedule data set.

NROUTCAL=calnum

specifies the number of the calendar to be used for incrementing the _TIME_ variable in the Usage data set.

OBSTYPE=variable

specifies a character variable in the Resource data set that contains the type identifier for each observation. Valid values for this variable are RESLEVEL, RESTYPE, RESUSAGE, RESPRTY, SUPLEVEL, ALTRATE, ALTPRTY, RESRCDUR, CALENDAR, MULTALT, MINARATE, and AUXRES. If OBSTYPE= is not specified, then all observations in the data set are assumed to denote the levels of the resources, and all resources are assumed to be replenishable and constraining.

PERIOD=variable
PER=variable

identifies the variable in the RESOURCEIN= data set that specifies the date from which a specified level of the resource is available for each observation with the OBSTYPE variable equal to 'RESLEVEL'. It is an error if the PERIOD= variable has a missing value for any observation specifying the levels of the resources or if the Resource data set is not sorted in increasing order of the PERIOD= variable.

RCPROFILE
RCP
RCS

creates one variable in the Usage data set corresponding to each variable in the RESOURCE statement. Each new variable denotes the resource usage based on the resource-constrained schedule for the corresponding resource variable. This option is ignored if resource allocation is not performed.

RESCALINTERSECT
RESCALINT
RCI

specifies that an activity can be scheduled only during periods that are common working times for all resource calendars (corresponding to the resources used by that activity) and the activity’s calendar. This option is valid only if multiple calendars are in use and if calendars are associated with individual resources. Use this option with caution; if an activity uses resources that have mutually disjoint calendars, that activity can never be scheduled. For example, if one resource works a night shift while another resource works a day shift, the two calendars do not have any common working time.

Only primary resources are included in the intersection; any alternate or auxiliary resources are not included when determining the common working calendar for the activity.

If you do not specify the RESCALINTERSECT option, and resources have independent calendars, then the procedure schedules each resource using its own calendar. Thus, an activity can have one resource working on a five-day calendar, while another resource is working on a seven-day calendar.

RESID=variable

specifies a variable in the RESOURCEIN= data set that indicates the name of the resource variable for which alternate resource information or auxiliary resource information is being specified in that observation.

Observations that indicate alternate resources are identified by the values 'ALTRATE' and 'ALTPRTY' for the OBSTYPE variable. These values indicate whether the observation specifies a rate of substitution or a priority for substitution; the value of the RESID variable in such an observation indicates the particular resource for which alternate resource information is specified in that observation. The specification of the RESID= option triggers the use of alternate resources. See the section Specifying Alternate Resources for further information.

Observations indicating auxiliary resources are identified by the value 'AUXRES' for the OBSTYPE variable. Such observations specify the name of the primary resource as the value of the RESID variable and the rate of auxiliary resources needed for every unit of the primary resource as values of the other resource variables. See the section Auxiliary Resources for further information.

RESOURCEVARS
RESVARSOUT

requests that the variables specified in the RESOURCE statement be included in the Schedule data set. These include the RESOURCE variables identifying the resource requirements, the activity priority variable, the activity delay variable, and any variables specifying activity splitting information. This option is the default and can be turned off by the NORESVARSOUT option.

ROUTINTERVAL=routinterval
STEPINT=routinterval

specifies the units to be used to determine the time interval between two successive values of the _TIME_ variable in the Usage data set. It can be used in conjunction with the ROUTINTPER= option to control the amount of information to be included in the data set. Valid values for routinterval are DAY, WORKDAY, WEEK, MONTH, WEEKDAY, QTR, YEAR, DTDAY, DTWRKDAY, DTWEEK, DTMONTH, DTQTR, DTYEAR, DTSECOND, DTMINUTE, DTHOUR, SECOND, MINUTE, or HOUR. The value of this parameter must be chosen carefully; a massive amount of data could be generated by a bad choice. If this parameter is not specified, a default value is chosen depending on the format of the schedule variables.

ROUTINTPER=routintper
STEPSIZE=routintper
STEP=routintper

specifies the number of routinterval units between successive observations in the Usage data set where routinterval is the value of the ROUTINTERVAL= option. For example, if routinterval is MONTH and routintper is 2, the time interval between each pair of observations in the Usage data set is two months. The default value of routintper is 1. If routinterval is blank (' '), then routintper can be used to specify the exact numeric interval between two successive values of the _TIME_ variable in the Usage data set. routintper is only allowed to have integer values when routinterval is specified as one of the following: WEEK, MONTH, QTR, YEAR, DTWEEK, DTMONTH, DTQTR, or DTYEAR.

ROUTNOBREAK
ROUTCONT

specifies that the _TIME_ variable is to be incremented using a calendar with no breaks or holidays. Thus, the Usage data set contains one observation per unit routinterval from mindate to maxdate, without any breaks for holidays or weekends. By default, the _TIME_ variable is incremented using the default calendar; thus, if the default calendar follows a five-day work week, the Usage data set skips weekends.

RSCHEDID=(variables)
RSID=(variables)

identifies variables not specified in the TAILNODE, HEADNODE, or ACTIVITY statements that are to be included in the Resource Schedule data set. This option is useful for carrying any relevant information about each activity from the Activity data set to the Resource Schedule data set.

SCHEDRULE=schedrule
RULE=schedrule

specifies the rule to be used to order the list of activities whose predecessor activities have been completed while scheduling activities subject to resource constraints. Valid values for schedrule are LST, LFT, SHORTDUR, ACTPRTY, RESPRTY, and DELAYLST. (See the section Scheduling Rules for more information.) The default value of SCHEDRULE is LST. If an invalid specification is given for the SCHEDRULE= option, the default value is used, and a warning message is displayed in the log.

SCHEDRULE2=schedrule2
RULE2=schedrule2

specifies the rule to be used to break ties caused by the SCHEDRULE= option. Valid values for schedrule2 are LST, LFT, SHORTDUR, ACTPRTY, RESPRTY, and DELAYLST. ACTPRTY and RESPRTY cannot be specified at the same time for the two scheduling rules; in other words, if schedrule is ACTPRTY, schedrule2 cannot be RESPRTY and vice versa.

SETFINISH=MAX $\mid $ EARLY

controls the computation of resource-constrained finish times for activities that are in progress. A value of EARLY sets the resource-constrained finish time to the early finish time as derived from the progress updating variables A_START, A_FINISH, REMDUR, and PCTCOMP. Specifying the default value of MAX sets the resource-constrained finish time to the maximum of the early finish time and the finish times for all resources for the given activity. Use of the EARLY value for this option could leave work unfulfilled because of the priority given to the progress updating information.

SPLITFLAG

indicates that activities are allowed to be split into segments during resource allocation. This option can be used instead of specifying either the MAXNSEGMT= or the MINSEGMTDUR= variable; PROC CPM assumes that the activity can be split into no more than five segments.

STOPDATE=stdate

specifies the cutoff date for resource-constrained scheduling. When such a date is specified, S_START and S_FINISH are set to missing beyond the cutoff date. Options are available to set these missing values to the original E_START and E_FINISH times (FILLUNSCHED) or to updated values based on the scheduled activities (UPDTUNSCHED).

T_FLOAT

requests that the Schedule data set include the T_FLOAT variable computed using the unconstrained early and late start schedules. Note that if resource allocation is not performed, this variable is always included in the Schedule data set.

TOTUSAGE
INTXRATE
INTUSAGE
RATEXINT

specifies that the Usage data set is to indicate the total usage of the resource for the current time period. The current time period is the time interval from the time specified in the _TIME_ variable for the current observation to the time specified in the _TIME_ variable for the next observation. The total usage is computed taking into account the relevant activity and resource calendars. Note that, by default, the observations in the Usage data set specify the rate of usage for each resource at the beginning of the current time period. The TOTUSAGE option specifies the product of the rate and the time interval between two successive observations. To get both the rate and the product, use the APPEND option.

UNSCHEDMISS

sets the S_START and S_FINISH values to missing for activities that are still unscheduled when resource constrained scheduling is stopped either by the STOPDATE= option or due to resource infeasibilities. This is the default and can be turned off by specifying the FILLUNSCHED option.

UPDTUNSCHED

causes the procedure to use the S_START and S_FINISH times of scheduled activities to update the projected start and finish times for the activities that are still unscheduled when resource constrained scheduling is stopped either by the STOPDATE= option or due to resource infeasibilities. These updated dates are used as the S_START and S_FINISH times.

WORK=variable

identifies a variable in the Activity data set that specifies the total amount of work required by one unit of a resource. This work is represented in units of the INTERVAL parameter. The procedure uses the rate specified for the resource variable to compute the duration of the activity for that resource. Thus, if the value of the WORK variable is 10, and the value of the resource variable R1 is 2, then the activity requires 5 interval units for the resource R1. For details, see the section Resource-Driven Durations and Resource Calendars.