Definition · A crashable activityAn activity has a normal duration and a normal cost, and a crash duration and a crash cost. Its crash room is normal − crash days and its rate is (crash cost − normal cost) / (normal − crash), the cost of one day, assumed constant across the range.
The decision variable y_i is the number of days bought on activity i, with 0 ≤ y_i ≤ crash room. The duration becomes normal − y_i and the bill is sum rate × y.
Two refusals are worth naming because both are modelling errors rather than typing errors, and the lab rejects them by name. An activity that crashes to a longer duration is not a crashable activity; and one that is cheaper crashed than normal makes the normal plan the wrong baseline, so the whole curve is measured from the wrong place.
Definition · The crashing programmeMinimise sum rate_i y_i subject to: 0 ≤ y_i ≤ crash room_i for every activity; a timing row for every precedence, saying that an activity starts no earlier than its predecessors finish with their crashed durations; and one deadline row saying the project finish is at most d.
The deadline appears in exactly one row, as its right-hand side. That is what makes the exact time-cost curve a right-hand-side ranging problem rather than a family of separate solves.
Four activities, two parallel paths
activity normal crash normal cost crash cost room rate after
A 6 4 100 140 2 20 —
B 4 2 80 120 2 20 A
C 5 3 60 90 2 15 A
D 3 2 50 80 1 30 B and C
normal cost 100 + 80 + 60 + 50 = 290, paid whatever the deadline
two paths: A B D = 6 + 4 + 3 = 13 A C D = 6 + 5 + 3 = 14
at normal durations the project takes 14, critical A C D, B has 1 day of slack
with everything crashed it takes 9
The rates are the data to read first. C is the cheapest activity to shorten at 15 a day, A and B cost 20, and D costs 30. But cheapness is not the whole story: A and D lie on both paths, so a day bought on either shortens the project by a day whatever else is happening, while B and C each lie on one path and a day bought there only helps while that path is the long one.
The exact curve, and where the first day is bought
deadline crash bill total bought
14 0 290 nothing
13 15 305 C by 1
12 35 325 A by 1, C by 1
11 55 345 A by 2, C by 1
10 85 375 A by 2, C by 1, D by 1
9 120 410 A by 2, B by 1, C by 2, D by 1
the curve as four pieces, from the tightest deadline outwards
9 to 10 35 a day 10 to 11 30 a day
11 to 13 20 a day 13 to 14 15 a day
every piece re-solved from scratch at its own endpoint and confirmed
Example · The first day is bought on C, not on AA is the obvious candidate: it is critical, it lies on both paths, and shortening it always shortens the project. It is also 20 a day, and it is not what the programme buys first. The first day costs 15 and is bought on C.
The reason is the day of slack on B. At normal durations A C D is 14 and A B D is 13, so one day can be taken off the longer path alone, and C is the cheapest way to do it. After that day both paths are 13 and both are critical, and from then on a day off the finish needs a day off both — which is when A, at 20 a day on both paths at once, becomes the cheapest thing to buy. Nothing is bought on A until the two middle paths are critical together.
That ordering is read off the programme rather than reasoned towards: the lab re-solves at every integer deadline, and A first appears at d = 12. An argument starting from “shorten the critical activity on both paths” buys A first and pays 20 for a day that was on sale at 15.
Reading the curve, and one trap in it
The slopes go 15, 20, 30, 35 as the deadline tightens, and each increase has a cause. 15 buys the slack on B. 20 buys A, which shortens both paths at once, for two days until A runs out of room. 30 buys D, the other shared activity, at its higher rate. 35 is the last day and it is bought on two activities at once — B at 20 and a second day of C at 15 — because by then every path must be shortened separately.
The trap is counting pieces as rates. The lab's straight-chain preset reports three pieces with slopes 15, 20 and 20: a piece is an interval on which one basis stays optimal, and the basis can change without the price per day changing.
Two checks, because the programme cannot check itself
The first is critical-path method run on the crashed durations. At d = 11 the plan buys A by two and C by one, giving durations A 4, B 4, C 4, D 3; a forward and a backward pass over those finish the project on day 11 with all four activities critical. That is a different calculation from the simplex, done on the answer the simplex produced, and the lab runs it on every plan it prints.
The second is a fresh solve at each breakpoint. Ranging one right-hand side through a sequence of bases is exactly the sort of machinery that can drift, so every piece is re-solved from scratch at its own left endpoint and the two values compared. The panel reports the count, and on all three presets it is every piece.
What the model leaves out is the usual gap between a project plan and a project. The rates are constant and real overtime is not; the activities are independent, so two crashed at once never compete for the same people; and the durations are point estimates with no uncertainty on them. The programme prices the plan it was given exactly, which is a different thing from pricing the project.