CIV-450 · Lesson 6 of 12 · 19 min
Resource leveling, time-cost trade-offs and schedule risk
A critical path schedule assumes that resources are unlimited and durations are certain. Neither is true. A contractor has a fixed number of excavators, operators and trucks, and every duration in the network is an estimate with a range. This lesson takes the Ridgeway schedule from lesson 5 and asks three practical questions. Can the work be arranged so that the excavator fleet is used evenly? What would it cost to finish earlier, if the city needs it? And how likely is the 133-day plan to be met at all?
Resource loading and leveling
Resource loading assigns to each activity the crews and equipment it needs, then sums them day by day to give a resource profile. An early-start schedule, with every activity starting as soon as its logic allows, usually produces a jagged profile with peaks and troughs. Peaks mean renting extra equipment or hiring extra crews for a few days; troughs mean paying for idle resources. Resource leveling smooths the profile by shifting non-critical activities within their float. Resource-constrained scheduling goes further: if the available resources are capped, activities are delayed until resources free up, which can extend the project.
Leveling uses float, so it is a trade. An activity moved later to smooth the profile loses its float and may become critical. Contractors level their own resources constantly; the contract administrator's interest is in seeing that the updated schedule still shows the logic honestly and that float has not been consumed in a way that makes a later owner delay look worse than it is.
Leveling the excavators
Six activities on the Ridgeway package need excavators: culvert excavation, both road segments, the storm sewer, the wall and the roundabout. In the early-start schedule, with the culvert held to the in-water window, the profile peaks at five machines between days 35 and 40, when the west segment, the east segment and the storm sewer overlap. Sofia's script tries every shift of each non-critical activity within its float and keeps the one that gives the lowest peak and then the smoothest profile, measured by the sum of the squares of the daily counts.
# Levelling excavators, crashing to meet the paving deadline, and a Monte Carlo schedule risk run
import random
UNITS = "US"
SI = UNITS == "SI"
CUR = "CAD" if SI else "USD"
# early-start windows (from the CPM in lesson 5, culvert held to the in-water window) and the excavators each activity needs
use = {"D": (20, 30, 2), "G": (35, 55, 2), "H": (35, 57, 2), "I": (10, 40, 1), "J": (57, 82, 1), "K": (57, 87, 1)}
flt = {"D": 17, "G": 27, "H": 0, "I": 42, "J": 0, "K": 13}
def profile(shift):
day = [0] * 140
for a, (s, f, n) in use.items():
for t in range(s + shift.get(a, 0), f + shift.get(a, 0)): day[t] += n
return day
def stats(day):
used = [x for x in day if x]
return max(day), sum(x * x for x in day)
print("Early-start profile: peak %d excavators, sum of squares %d" % stats(profile({})))
# simple levelling: try every shift of each non-critical activity within its float, keep the best
best = {}
for a in ["G", "K", "D", "I"]:
trial = min(range(flt[a] + 1), key=lambda k: (stats(profile({**best, a: k}))[0], stats(profile({**best, a: k}))[1], k))
best[a] = trial
print("Levelled shifts (days):", best, " peak %d excavators, sum of squares %d" % stats(profile(best)))
# crashing: the city wants base asphalt done before the seasonal cutoff, 8 working days earlier
# critical activities that can be shortened: (normal days, crash days, extra cost per day)
crash = {"H": (22, 18, 6500 if SI else 5200), "J": (25, 21, 9800 if SI else 7900),
"L": (18, 15, 4200 if SI else 3400), "N": (15, 13, 7200 if SI else 5800)}
need, cost, plan = 8, 0, []
avail = {a: n - c for a, (n, c, _) in crash.items()}
while need > 0: # buy the cheapest day on the (single) critical path
a = min((x for x in avail if avail[x] > 0), key=lambda x: crash[x][2])
avail[a] -= 1; need -= 1; cost += crash[a][2]; plan.append(a)
print("Days bought:", {a: plan.count(a) for a in dict.fromkeys(plan)}, f" extra cost {cost:,} {CUR}")
# check the culvert chain: the roundabout K must now finish by the new start of the base asphalt
m_start = 100 - plan.count("H") - plan.count("J") - plan.count("L")
f_late = m_start - 30 # latest finish of F so that K (30 days) is not late
f_early = 12 + 8 + 10 + 15 + 8 # C held to the in-water window on day 12
print(f"Culvert chain after crashing: F can finish by day {f_late}, finishes day {f_early}: float {f_late - f_early} days")
# schedule risk: triangular durations on the critical chain, 4,000 runs
chain = {"A": (9, 10, 12), "B": (20, 25, 45), "H": (20, 22, 28), "J": (23, 25, 32), "L": (16, 18, 22),
"M": (9, 10, 13), "N": (13, 15, 18), "O": (7, 8, 11)}
random.seed(450)
T = sorted(sum(random.triangular(lo, hi, ml) for lo, ml, hi in chain.values()) for _ in range(4000))
print(f"\nCritical chain only: deterministic 133 days; P50 {T[1999]:.0f}, P80 {T[3199]:.0f}, P90 {T[3599]:.0f}")
print(f"Chance of finishing in 133 days or less: {sum(t <= 133 for t in T) / len(T):.0%}")Early-start profile: peak 5 excavators, sum of squares 583
Leveled shifts (days): {'G': 5, 'K': 13, 'D': 0, 'I': 0} peak 4 excavators, sum of squares 525
Days bought: {'L': 3, 'H': 4, 'N': 1} extra cost 36,800 USD
Culvert chain after crashing: F can finish by day 63, finishes day 53: float 10 days
Critical chain only: deterministic 133 days; P50 144, P80 150, P90 153
Chance of finishing in 133 days or less: 3%Shifting the west segment 5 days later and the roundabout 13 days later, both within their float, cuts the peak from five excavators to four and reduces the sum of squares from 583 to 525. Northline can now plan around four machines, renting no fifth one. The roundabout has used all of its 13 days of float, so it has become critical in the leveled schedule. That is acceptable, but it must be watched: from now on any delay to the roundabout delays the project.
The time-cost trade-off
Most activities can be done faster by spending more: overtime, a second shift, an extra crew, faster-curing materials. The extra direct cost per day saved is the activity's crash cost slope. At the same time, finishing earlier saves time-related costs: site overhead, traffic control, equipment rental and the owner's own costs. Plotting total cost against duration gives a curve whose minimum is the most economical duration. In practice the question is usually narrower: the owner has a target date, and the planner needs the cheapest way to meet it.
The procedure is greedy and simple, as long as there is a single critical path: buy one day at a time from the critical activity with the lowest cost slope, and after each purchase check whether another path has become critical. When two paths are critical together, a day must be bought on both, and the cheapest combination may include activities that are not the cheapest individually.
After award, the city asked whether the surface asphalt could be finished 8 days earlier, by September 29 instead of October 8, because the city's paving inspectors were committed elsewhere in October. Northline offered crash costs for four critical activities: the east segment, USD 5,200 a day for up to 4 days with a second excavator crew; the wall, USD 7,900 a day for up to 4 days with a second forming crew; curb and gutter, USD 3,400 a day for up to 3 days with Saturday overtime; and lighting and bioretention, USD 5,800 a day for up to 2 days. Buying the cheapest days first, 3 from curb and gutter, 4 from the east segment and 1 from lighting, gives the 8 days for USD 36,800.
The check on the culvert chain matters. Shortening the east segment and the curb work moves the start of the base asphalt forward by 7 days, so the roundabout, and therefore the culvert backfill before it, must also finish earlier. With the cofferdam held to the in-water window, the culvert chain finishes on day 53 and may finish as late as day 63, so it keeps 10 days of float and does not become critical. Had it become critical, the next day bought would have had to come from both paths.
The city must then decide whether the earlier finish is worth the price. Against the crash cost it can set its own savings: eight days less of inspection, traffic disruption and lost business on the corridor, plus the reduced risk of paving in cold October weather. The city accepted, and the change was issued as a change order adjusting both the contract price and the completion date, a pattern lesson 8 describes.
Worked problem
Choosing the cheapest days
Two critical activities can be shortened: P by up to 2 days at USD 2,500 a day and Q by up to 3 days at USD 4,000 a day. A parallel path has 3 days of float and runs through Q but not P. What is the cheapest way to save 4 days?
Show solution
- Buy P first, 2 days at 2,500: the parallel path's float falls from 3 to 1 day.
- Then buy Q, 2 days at 4,000; Q lies on both paths, so both shorten together.
- \[\text{cost} = 2(2500) + 2(4000) = 13{,}000\]
Answer: Four days cost USD 13,000.
Schedule risk analysis
The 133-day duration is the sum of single-point estimates along the critical path. Like the cost estimate in lesson 4, it hides uncertainty, and the uncertainty is skewed: activities can run much longer than planned but rarely much shorter. The utility relocations are the clearest case. The utilities estimated 25 days, but they depend on their own crews and materials, and on past projects in the city they have taken anywhere from 20 to 45 days.
Sofia's script gives each critical activity a triangular range and simulates the critical chain 4,000 times. The result is sobering: the median finish is day 144, the P80 day 150, and the chance of finishing in 133 days or less is only about 3 %. Two caveats apply. Simulating only the critical chain understates the risk, because a near-critical path, such as the culvert chain, can become critical in some runs; a full network simulation, which commercial tools perform, would push the numbers a little higher. And the ranges are judgments; changing the utility range changes the answer more than any other input.
What should the team do with this? It does not mean the contract time is wrong: the contractor carries the risk of its own durations, and the city's contract includes a weather allowance. It does mean that the city should manage the drivers of the risk actively. Priya set up fortnightly coordination meetings with the utilities from the day of award, and the city negotiated a commitment from the gas utility to complete its relocation within 25 working days of access. The best use of a risk analysis is to show where management effort pays.
A related problem is acceleration. If the owner refuses a time extension that the contractor is entitled to, and insists on the original completion date, the contractor may have to add crews to finish on time. If the extension was due, the contractor can claim the cost of that constructive acceleration. The cleaner course, which the city followed when it asked for the 8 days, is to agree the acceleration and its price in advance as a change.
Practical points
- Load resources on the schedule and level them within float before mobilizing.
- Remember that leveling consumes float and can create new critical activities.
- Crash the cheapest critical activities first, checking parallel paths after each day bought.
- Weigh crash costs against the owner's and contractor's time-related savings.
- Use schedule risk analysis to find the drivers of delay, then manage them.
Common mistakes
MistakeLeveling resources by pushing activities beyond their float without saying so.
InsteadShow the extended dates and the effect on completion.
MistakeCrashing activities that are not on the critical path.
InsteadOnly critical activities shorten the project.
MistakeForgetting to recheck parallel paths during crashing.
InsteadA parallel path can become critical and absorb further crashing.
MistakeTreating the deterministic duration as the expected duration.
InsteadWith skewed ranges, the expected finish is later than the sum of most likely durations.
Summary and key terms
- Resource leveling shifts non-critical activities within float to smooth resource demand.
- Leveling the Ridgeway excavators cut the peak from five to four but made the roundabout critical.
- The crash cost slope is the extra cost per day saved; buy the cheapest critical days first.
- Saving 8 days cost USD 36,800, and the culvert chain kept 10 days of float.
- Schedule risk simulation gave a P80 finish of day 150 against the planned 133.
- The utility relocations drive the schedule risk and need active management.
- Resource loading
- Assigning resources to activities and summing them over time.
- Resource leveling
- Shifting non-critical activities within float to smooth resource demand.
- Resource-constrained scheduling
- Scheduling so that resource use never exceeds a fixed limit, extending the project if necessary.
- Crashing
- Shortening activities by adding resources at extra cost.
- Crash cost slope
- The extra direct cost per day of duration saved.
- Time-related costs
- Costs that grow with project duration, such as site overhead and traffic control.
- Schedule risk analysis
- Simulation of uncertain durations to estimate the probability of meeting dates.
- Near-critical path
- A path with little float that may become critical if durations vary.
Practice problems
Work each problem on paper first, then reveal the answer to check.
An activity takes 10 days at USD 40,000 or 7 days at USD 49,600. What is its crash cost slope?
Show answer
(49,600 − 40,000) / 3 = USD 3,200 per day.
Why did leveling make the roundabout critical?
Show answer
It was shifted by its full 13 days of total float.
If time-related site costs are 7,150 a day, is crashing curb and gutter at 4,200 a day worthwhile for the contractor alone?
Show answer
Yes, if the day saved really ends site costs a day earlier; it saves 2,950 a day net.
Why does simulating only the critical chain understate schedule risk?
Show answer
Near-critical paths can become critical in some runs, pushing the finish later.
Lesson quiz · 5 questions
Score 60% or more to complete this lesson.
Create a free account to save your progress, take quizzes and earn a certificate.