02 · Advanced Scheduling¶
Level 1 covered building a task list, sequencing it, and drawing a Gantt chart. That gets you a schedule. It does not tell you which tasks actually control the end date, how much slack the others really have, or what it costs to finish sooner. This module covers the Critical Path Method (CPM), the two kinds of float, PERT three-point estimation, schedule compression by crashing and fast-tracking, and resource levelling. Every number below is computed, so you can check the arithmetic yourself.
The network diagram¶
CPM works on a network of activities linked by dependencies, not on a bar chart. Here is the schedule used throughout this module — an office systems rollout.
| ID | Activity | Duration (days) | Predecessors |
|---|---|---|---|
| A | Requirements sign-off | 5 | — |
| B | Solution design | 8 | A |
| C | Procure hardware | 12 | A |
| D | Build backend | 10 | B |
| E | Build frontend | 7 | B |
| F | Install hardware | 4 | C |
| G | Integration | 6 | D, E, F |
| H | User acceptance testing | 5 | G |
| I | Write training material | 3 | H |
| J | Data migration | 4 | H |
| K | Go-live | 2 | I, J |
Four dependency types exist; finish-to-start is the default and by far the most common.
| Type | Meaning | Example |
|---|---|---|
| Finish-to-Start (FS) | B can't start until A finishes | Design after requirements |
| Start-to-Start (SS) | B can't start until A starts | Testing starts 3 days after coding starts |
| Finish-to-Finish (FF) | B can't finish until A finishes | Documentation finishes when the build finishes |
| Start-to-Finish (SF) | B can't finish until A starts | Old system retires once the new one runs |
Lead is negative lag — overlapping activities, such as starting testing 3 days before coding ends. Lag is enforced waiting time — concrete cures for 7 days between pour and load. Both are properties of the relationship, not of the activity.
Forward pass, backward pass, float¶
The forward pass computes the earliest each activity can happen, moving left to right:
ES(early start) = the latestEFamong all predecessors, or 0 if noneEF(early finish) =ES + duration
The backward pass computes the latest each can happen without delaying the project, moving right to left from the project duration:
LF(late finish) = the earliestLSamong all successors, or the project duration if noneLS(late start) =LF − duration
Float then falls out of the difference:
- Total float
TF = LS − ES— how long the activity can slip before the project end date moves. - Free float
FF = (earliest ES of successors) − EF— how long it can slip before the next activity's early start moves.
Running both passes over the table above gives:
| ID | Dur | ES | EF | LS | LF | Total float | Free float | Critical? |
|---|---|---|---|---|---|---|---|---|
| A | 5 | 0 | 5 | 0 | 5 | 0 | 0 | Yes |
| B | 8 | 5 | 13 | 5 | 13 | 0 | 0 | Yes |
| C | 12 | 5 | 17 | 7 | 19 | 2 | 0 | No |
| D | 10 | 13 | 23 | 13 | 23 | 0 | 0 | Yes |
| E | 7 | 13 | 20 | 16 | 23 | 3 | 3 | No |
| F | 4 | 17 | 21 | 19 | 23 | 2 | 2 | No |
| G | 6 | 23 | 29 | 23 | 29 | 0 | 0 | Yes |
| H | 5 | 29 | 34 | 29 | 34 | 0 | 0 | Yes |
| I | 3 | 34 | 37 | 35 | 38 | 1 | 1 | No |
| J | 4 | 34 | 38 | 34 | 38 | 0 | 0 | Yes |
| K | 2 | 38 | 40 | 38 | 40 | 0 | 0 | Yes |
Critical path: A → B → D → G → H → J → K, and 5 + 8 + 10 + 6 + 5 + 4 + 2 = 40 days. The critical path is simply the chain of zero-float activities — the longest path through the network. Delay any one of them by a day and the project finishes a day later.
Activity C is the reason both float types matter. It has 2 days of total float but zero free float. C can slip 2 days without moving go-live, but it cannot slip even one day without pushing F's start. If you tell the procurement manager "you have 2 days of slack" and they take it, the installation crew's start date moves — and they may already have been booked. Report free float to the person doing the work; report total float to the sponsor.
Float belongs to the project, not to the activity owner
Total float is a shared buffer along a path. If C consumes all 2 days, F has none left. Three activity owners each "using their slack" on the same path will overrun the project even though none of them individually exceeded the float they were told about. Track float consumption on the path, not per activity.
PERT: three-point estimation¶
Single-point durations hide uncertainty. PERT asks for three estimates per activity and computes a beta-weighted expected duration:
where O is optimistic, M most likely, and P pessimistic. Applying this
to the critical path activities:
| Act | O | M | P | te |
σ | Variance |
|---|---|---|---|---|---|---|
| A | 3 | 5 | 13 | 6.00 | 1.667 | 2.778 |
| B | 5 | 8 | 11 | 8.00 | 1.000 | 1.000 |
| D | 7 | 9 | 17 | 10.00 | 1.667 | 2.778 |
| G | 4 | 6 | 8 | 6.00 | 0.667 | 0.444 |
| H | 4 | 5 | 6 | 5.00 | 0.333 | 0.111 |
| J | 3 | 4 | 5 | 4.00 | 0.333 | 0.111 |
| K | 1 | 2 | 3 | 2.00 | 0.333 | 0.111 |
| Path | 41.00 | 2.708 | 7.333 |
Check A: (3 + 4×5 + 13) ÷ 6 = 36 ÷ 6 = 6.00. Its most likely duration is 5 days, but the pessimistic tail runs to 13, so the expected duration is 6. That one skewed activity is why the PERT path is 41 days while the deterministic CPM path was 40. Single-point estimates silently assume the most likely case is the expected case, which is false whenever risk is one-sided — and on real projects it nearly always is.
Path standard deviation is the square root of the sum of the variances, not the sum of the standard deviations: √7.333 = 2.708 days. That gives a confidence range:
| Confidence | Calculation | Duration |
|---|---|---|
| 50% | 41.00 | 41.0 days |
| 84% (+1σ) | 41.00 + 2.708 | 43.7 days |
| 95% (+1.645σ) | 41.00 + 1.645 × 2.708 | 45.5 days |
| 97.7% (+2σ) | 41.00 + 2 × 2.708 | 46.4 days |
It also answers the sponsor's real question: what is the chance of hitting the original 40-day date? z = (40 − 41.00) ÷ 2.708 = −0.369, which on the normal curve is about 36%. Committing to 40 days is committing to a date you will miss roughly two times in three. Committing to 46 days is a promise you keep 97 times in 100. Choosing between those is a business decision — but it has to be made with the number visible.
Compressing the schedule¶
When 40 days is too long, there are exactly two legitimate techniques.
| Technique | Method | Adds | Does not add |
|---|---|---|---|
| Crashing | Add resources to critical activities | Cost | Rework risk (usually) |
| Fast-tracking | Overlap activities normally done in sequence | Rework risk | Direct cost |
Crashing decisions are driven by the cost slope — the cost per day saved:
| Act | Normal dur | Crash dur | Max days | Normal cost | Crash cost | Cost slope |
|---|---|---|---|---|---|---|
| B | 8 | 6 | 2 | $40,000 | $44,000 | $2,000/day |
| D | 10 | 7 | 3 | $90,000 | $103,500 | $4,500/day |
| G | 6 | 5 | 1 | $30,000 | $36,000 | $6,000/day |
| H | 5 | 4 | 1 | $25,000 | $26,200 | $1,200/day |
| J | 4 | 3 | 1 | $20,000 | $28,000 | $8,000/day |
Check H: ($26,200 − $25,000) ÷ (5 − 4) = $1,200 ÷ 1 = $1,200 per day.
Worked example — compress 40 days to 37 days at least cost. Always crash the cheapest activity that is on the critical path, one day at a time, and re-run the network after each step.
| Step | Crash | Cost | New duration | Critical path after the step |
|---|---|---|---|---|
| 1 | H by 1 day | $1,200 | 39 days | A-B-D-G-H-J-K (unchanged) |
| 2 | B by 1 day | $2,000 | 38 days | A-B-D-G-H-J-K (unchanged) |
| 3 | B by 1 day | $2,000 | 37 days | A-B-D-G-H-J-K and A-C-F-G-H-J-K |
| Total | $5,200 | 37 days | two parallel critical paths |
Three days bought for $5,200, an average of $1,733 per day. Note what happened at step 3: crashing B twice consumed all of C's 2 days of total float, so the procurement path became critical as well. Any further compression now requires shortening both paths at once — either an activity they share (G, H, J or K) or one activity on each. Crashing B a third time would buy nothing at all, because the C-F path would hold the project at 37 days regardless.
That is the single most common crashing mistake: someone buys another day of the activity that worked last time, pays for it, and the end date does not move. Recompute the network after every compression decision.
Fast-tracking the same schedule might start integration (G) when the backend (D) is 80% complete rather than 100%. That saves days at no direct cost, but if the backend interface changes in its final 20%, the integration work is redone — and rework late in a schedule costs far more than the crash would have. Fast-track only where the predecessor's remaining work is unlikely to invalidate the successor's.
Resource levelling and smoothing¶
CPM assumes infinite resources. Reality does not. Suppose activities D (backend) and E (frontend) both need the same senior developer, and they overlap from day 13 to day 20.
| Approach | What it does | Effect on the end date |
|---|---|---|
| Resource smoothing | Shifts activities within their float only | Never extends the project |
| Resource levelling | Delays activities to respect a hard resource limit | May extend the project |
E has 3 days of total float, so smoothing is available: delay E to start on day 16 instead of 13, finishing on day 23 — exactly its late finish, still not delaying G. But that only staggers the overlap; the developer would still be on both D and E from day 16 to 23. If one person genuinely cannot do both, levelling is required: run E after D, from day 23 to day 30, which pushes G, H, J and K and extends the project to 47 days.
That number is the whole point of this section. The 40-day critical path was never real if one person had to do both D and E. Always level against actual named resources before publishing a date — a resource-infeasible critical path is not a plan, it is a wish.
How It Actually Works¶
Everything above was computed by hand, but scheduling software runs the
identical algorithm as graph traversal over an adjacency-list
representation of the network: each activity is a node storing its own
duration and a list of predecessor/successor node IDs, the forward pass is a
single breadth-first or topologically-ordered traversal computing ES/EF
node by node, and the backward pass is the same traversal run in reverse
topological order computing LS/LF. This is an O(V + E) algorithm —
linear in the number of activities plus dependencies — which is why
enterprise scheduling tools can re-solve a 50,000-activity network in
milliseconds every time a single duration changes: they aren't "recomputing
the whole plan," they're re-running one linear pass and only the downstream
nodes reachable from the changed node actually get new numbers (nodes on
unrelated branches of the graph are untouched). PERT's beta distribution
choice (rather than, say, a normal distribution) isn't arbitrary either: a
beta distribution can be skewed and bounded — task duration has a hard
floor (can't finish in negative time) and a long right tail (things run
over far more often than they run under) — which a symmetric normal
distribution cannot represent, and the (O + 4M + P) / 6 formula is a
specific parameterization of the beta distribution's mean that weights the
mode 4× to approximate that skew cheaply without fitting actual beta
parameters.
Exercise¶
Build and analyse a schedule of your own with at least 10 activities and at least two parallel paths that merge.
- Write the activity table with durations and predecessors, then draw the network.
- Run the forward and backward pass by hand. Produce the full ES/EF/LS/LF table, compute total float and free float for every activity, and identify the critical path. Confirm the critical path durations sum to your project duration.
- Find one activity where total float and free float differ, and explain in one sentence what that difference means to the person doing the work.
- Add optimistic and pessimistic estimates for your critical path
activities. Compute
teand variance for each, then the pathte, path variance and path σ. State the 50%, 84% and 95% confidence durations, and compute the probability of hitting your original deterministic date. - Assign a cost slope to at least four activities, then compress your schedule by 3 days at minimum cost. Show the step-by-step table and re-identify the critical path after each step, stating explicitly if and when a second path becomes critical.
- Finally, assume two of your parallel activities need the same person. Decide whether smoothing is sufficient or levelling is required, and give the resulting end date.