[I’ve slightly edited this old article – mostly figures. After “upgrading” to Microsoft Project 2016, I can confirm that MSP 2016’s resource leveler appears similar to MSP 2013’s leveler in the simple case examined; both are substantially different from MSP 2010’s.]
Over the last few years, some tests of resource leveling algorithms in various software packages have been reported informally over at Planning Planet.
When using “default” conditions (i.e. without implementing any user-defined priority schemes), the general picture was that leveled schedules from MSP 2010 were significantly longer than those from MSP 2007. There have also been reports that MSP 2013 (and MSP 2016, which seems to use the same leveling rules) produces even longer leveled schedules than MSP 2010. Other software (Spider Project in particular) tend to produce shorter schedules under resource constraints. I haven’t paid too much attention to these reports because a) I don’t use resource leveling often, and b) when I do use leveling, I always define some specific leveling priorities, so the “default” results are not so relevant.
Last week, a French planner (“Alexandre”) on PP noted some significant changes in default leveling results when migrating a simple schedule from MSP 2010 to MSP 2013, wondering what might be the reason for the changes. I’m still on 2010, so I haven’t noticed the change in 2013. While it’s clear that Microsoft has modified the leveling rules from version to version, they don’t publish the details, so addressing the “reason for the change” is just speculation. My own speculation is that minor changes to the leveling algorithm were made to limit apparent changes to the pre-leveling “Critical Path,” even at the expense of extending the schedule. For Alexandre’s specific example:
The project has a total duration of 7.5 days, and the pre-leveling (i.e. CPM) critical path runs through task 5. Task 5 has 0 days of total slack, while task 8 has 2 days of slack.
In resolving the resource conflict between task 5 and task 8, MSP 2010’s default rule gives greater scheduling priority to task 5 because:
The CPM schedule has it starting earlier;
It has lower total slack in the CPM schedule;
It has a longer duration;
It comes first on the task list;
It is marked as “Critical” (?);
Some other factors…(?).
(I have no idea what the relative contributions of these factors are in the scoring. Some might be zero.)
As a consequence of leveling, task 5 (the “critical” one) is scheduled first, while task 8 is delayed, and the project is extended 1 day for a total duration of 8.5 days. Total slack is re-computed after incorporating the leveling delays, and a new “Critical Path” is displayed.
Perversely, Task 5 – which was clearly “critical” before leveling and is also clearly a resource driver for the project completion – now has 1 day of Total Slack.
Task 7 is now shown as “Critical,” even though there is neither a logical nor a resource-driving reason justifying it.
So in short, the MSP 2010 leveling algorithm can substantially change the “Critical Path,” and the resulting slack values can be completely misleading. (I wrote about this here: Logic Analysis of Resource-Leveled Schedules (MS Project).)
The next figures (from BPC Logic Filter) illustrate the actual resource-constrained Longest Path (Fig. 2) and Multiple Float Paths (2a) through the 2010 schedule.
In contrast, MSP 2013 task gives greater scheduling priority to task 8, delaying task 5. I suspect this is driven by some complex tuning of the leveling rules around Total Slack.
Alexandre provided the MSP 2013 leveled schedule here (which also includes a minor date shift).
I’ve repeated it below in my [MSP 2016 model using Standard leveling order.] The resulting “Critical Path” appears essentially the same as the pre-leveling version, but with an added 3-day leveling delay before task 5. This may give project managers confidence that the leveling exercise has not “screwed up” their critical path.
Unfortunately, the project finish has been extended by an additional 2 days compared to the MSP 2010 leveler. It is now 10.5 days.
The project manager’s confidence in the critical path is still misplaced. Task 7 and task 8 are now shown as far from critical, with 5 days of total slack. As shown in the next two figures from BPC Logic Filter, however, they are obviously on the resource-constrained longest path through the schedule.
Comparing the 0-Float Paths of the two schedules (Figures 2a and 5a), we see that unlike MSP 2010, MSP 2013 and MSP 2016’s leveling engine has preserved the logic drivers from the pre-leveling CPM schedule while implicitly inserting task 7 and task 8 into the driving path to project completion. Although the project is extended as a result, the appearance of a stable critical path is preserved. Fortunately, BPC Logic Filter depicts the resulting resource-constrained critical path clearly in both cases.
My speculation on the reason for the changed algorithm is based on the Project development team’s demonstrated preference for the appearance of stability (for mid-level users) over behavior that might be more technically correct from an advanced user’s point of view. (See the handling of inactive tasks in MSP 2013 for another example.)
In logic-driven project schedules, the scheduled start and finish of each activity is determined by a “driving path” of predecessor activities and relationships. Driving logic is said to “flow” along this path from the earliest predecessor to the activity’s completion. In simply-modeled projects, this driving logic flow is one-directional and continuous, such that any delay (or acceleration) of a predecessor task is directly translated to a corresponding delay (or acceleration) of its ultimately driven successors. Thus, delaying a task on the “Critical Path” (the driving path to project completion) ultimately delays the project. More complex schedule models – i.e. those using other than finish-to-start relationship links – allow the driving logic flow to be checked or even reversed, so delay or acceleration of a given task may not have the anticipated result on other tasks or on the project as a whole. Such effects can be transient, appearing and disappearing in the course of a single progress update.
Some Cases
Last year I read a series of articles by Miklos Hajdu (Research Fellow at Budapest University of Technology and Economics) on the sometimes-unexpected consequences of certain relationships in logic-driven project schedules. I encountered them again a few months ago during an extended Linked-In discussion that Hajdu started relating to Drag calculation. (BPC Logic Filter is one of the few scheduling tools that actually sets out to compute drag, and we identified some areas needing standardization of definitions.)
Hajdu’s Articles laid out five basic cases where incrementally delaying or accelerating a particular Critical Path activity might not lead to the expected delay or acceleration of the overall project:
Normal Critical Activities (Expected Behavior – i.e. Lengthening task extends project; Shortening task shortens project.)
Neutral Critical Activities (Neither lengthening nor shortening the task has any impact on project completion.)
Bi-Critical Activities (Either lengthening or shortening the task always extends the project.)
Reverse Critical Activities (Lengthening the task shortens the project; Shortening the task extends the project.)
Increasing Neutral Decreasing Reverse Critical Activities (Lengthening the task has no impact on project completion; Shortening the task extends the project.)
Increasing Normal Decreasing Neutral Critical Activities ( Lengthening the task extends the project; Shortening the task has no impact.)
A more recent blog by consultant Pat Weaver, Critical confusion – when activities on the critical path don’t compute…… reviewed these cases and illustrated the consequences using time-scaled-logic diagrams rather than the simple fragnet blocks first used by Hajdu. With graphical images especially, Weaver has done a great job of clarifying the underlying logic flow and emphasizing the consequences of careless planning. His article is a good read. Unfortunately, his suggestion that competent planners should avoid creating any such constructs in their project schedules seems impractical for planners using P6 or Microsoft Project to schedule complex projects.
I had encountered all of these issues previously in various project schedules and and had focused on them quite a bit while developing the drag-associated parts of BPC Logic Filter – that’s where the “Negative, Positive, and Absolute” terminology below came from.
Driving Logic Flow of the Cases
At the start of a project (i.e. ignoring progress updates and Data Date), every activity is scheduled to be completed according to a path of driving logic (comprising predecessor activities AND relationships) extending from the project start milestone or some valid external constraint forward to the activity’s Finish. (For the particular case of the Project Completion activity, its driving path is synonymous with the “Critical Path” of the project.)
Identifying the “Driving Logic Flow” through any arbitrary activity along that path starts with the Relationship Free Float values of its predecessor and successor links. A Relationship Free Float value of 0 indicates a driving relationship, while a value greater than zero indicates a non-driving relationship.
The activity’s duration “participates” in the driving logic flow if (and only if) there are “Driven” and “Driving” relationships at opposite ends of the activity. Various combinations of relationship float have the implications in the table below.
Keeping in mind that any changes to activity duration can immediately change the driving logic flow through the schedule and the associated relationship floats – such that an activity described by the first line of the table above may jump to the third line simply by adding a day to its duration – we can interpret the table as follows:
An activity with a Driven Start and a Driving Finish has a Positive duration participation, as the logic flows forward through the duration from Start to Finish. This is “Normal” in Hajdu’s articles; lengthening the task extends the project, while shortening the task shortens the project. This case seems to represent the vast majority of activities in typical schedules. BPC Logic Filter computes a drag value corresponding to the activity duration, any applicable constraints, and parallel (i.e. near-critical) paths.
An activity with a Driven Finish and a Driving Start, on the other hand, has a Negative duration participation, as the logic flows backward through the duration from Finish to Start. This corresponds to Hajdu’s “Reverse-Critical” case; lengthening the task and thereby allowing it to start sooner ends up shortening the project, while shortening the task and thereby forcing it to start later ends up extending the project. BPC Logic Filter computes a negative drag value for these cases, partly to indicate the apparently perverse logic at work. While such tasks seem to be rare in baseline schedules, I have seen them arise during updating on fairly high-level integrated masters (i.e. not in construction).
For an activity with only a Driven Finish and Driving Finish (or Driven Start and Driving Start), then the duration is bypassed and has no participation in the driving logic flow. This corresponds to Hajdu’s “Neutral Critical” case; neither lengthening nor shortening the task has any impact on project completion, and BPC Logic Filter computes a duration drag of zero for task B. It should be noted that although “dangling starts” and “dangling finishes” are evident in the examples depicted below, they are unrelated to the zero-participation observed. Adding non-driving start predecessors and/or finish successors to Activity B would not change the conclusions.
An activity with both driving and driven relationships at both ends (i.e. minimum Relationship Float = 0 in all four columns of the table) represents four parallel driving logic paths: 1) through the Start only; 2) through the Finish only; 3) forward through the Start, the Duration, and the Finish; and 4) backward through the Finish, the Duration, and the Start. In this case, the Duration Participation is “Absolute,” since any change to the activity duration (either positive or negative) results in positive (lengthening) of the overall path. There is no chance to accelerate the project here, so BPC Logic Filter computes a duration drag of 0. This case corresponds to Hajdu’s “Bi-Critical” case. I’ve added an additional predecessor and successor to the illustration fragnets below – mainly to indicate that its occurrence is not limited to ladder-logic structures. The combined “Positive” and “Negative” behaviors are obvious.
Finally, the four variations of “Limited” Duration Participation arise from the cases where three of the four “Relationship Float” columns are zero. They essentially represent various combinations of “Positive,” “Negative,” and “None” cases above, and they correspond to Hajdu’s “Increasing Normal Decreasing Neutral” and “Increasing Neutral Decreasing Reverse” cases. With any of these cases, it is only possible to Lengthen, never to Shorten, the overall length of the project by modifying the duration of Task B, so BPC Logic Filter computes a drag of zero.
Logic Flow Conclusions
Ultimately, these types of odd logic structures seem to arise from two contributory causes:
The legitimate need for project planners to include in the project schedule no more detail than is necessary to plan and control the work (at the level reflected in the schedule). In Primavera P6 and Microsoft Project scheduling software – based on the precedence diagramming version of the critical path method (i.e. PDM/CPM) – this need is partly satisfied by consolidating many single activities representing simple tasks (with only Finish-to-Start relationships) into longer activities representing more complex work, connected with relationships other than Finish-to-Start. Common examples are Finish-to-Finish and Start-to-Start, often with time or volume lags. As a consequence, driving (controlling) predecessor logic can either “push” an activity (through its “Driven Start”) OR “pull” the activity (by its “Driven Finish”) – or both. Similarly, the activity may drive its logical successors through its “Driving Start” or its “Driving Finish.”
The continuous-activity assumption in the prevailing PDM software packages like P6 and MSP. That is, while the activity may be pushed and/or pulled by predecessor logic, the activity’s duration remains as a rigid connection from Start to Finish, neither stretching nor compressing (nor splitting into parts) in response to logical pressures alone. Consequently, the activity’s duration will be scheduled at the earliest continuous interval that satisfies the most stringent of its start/finish predecessor relationships. All other predecessor relationships will possess “relationship free float.”
Within P6 and MSP schedule models, using Ladder Logic to approximate progressive feeding of work volumes between largely parallel activities is a technique that effectively models the actual work interfaces. Yet it seems virtually guaranteed for such paired-activity ladder structures to encounter at least “neutral-critical” and sometimes “bi-critical” driving logic flow during updating. In my opinion this should be acceptable as long as the paired activities are effectively managed together.
Negative (“Reverse-Critical”) driving logic flow, however, reflects a case where the work being depicted is too complex to be represented by a single activity, and further breakdown is needed. Since it also provides an opportunity for the scheduler to sequester or otherwise manipulate float, the underlying logic structure may be indirectly prohibited by scheduling specifications. BPC Logic Filter presently flags reverse flows of driving logic (using negative drag) during the drag analysis.
The multiple cases where the driving logic flow effectively bypasses an activity’s duration (“Neutral-Critical”) appear to be a natural outcome of the scheduler’s intent. In addition, they seem consistent with the actual work interfaces in some construction projects, particularly where there are substantial variations in the production rates of parallel activities. While BPC Logic Filter doesn’t currently identify such cases, it seems reasonable to modify the Gantt-bar coloring routines in a future release.