Definition · Shadow priceThe shadow price of constraint i is the rate of change of the optimal objective value with respect to bᵢ, holding everything else fixed, over the interval in which the current optimal basis remains feasible. It is the i-th entry of y = c_BᵀB⁻¹.
The interval is part of the answer. This course never prints a price without it, because a price quoted outside its interval is not approximately right — it is a different number.
Why the price is the slope at all is one line, now that the tableau has been read. With basis B fixed, the plan is B⁻¹b and the value is c_BᵀB⁻¹b = yᵀb. Add Δ to bᵢ and the value becomes yᵀb + yᵢΔ. So the value is linear in bᵢ with slope yᵢ, for exactly as long as B is still the optimal basis — and the only thing that can go wrong is feasibility, because the objective row does not involve b at all.
Theorem · The range a shadow price holds overLet d = B⁻¹eᵢ be column i of the basis inverse and x_B = B⁻¹b the current basic plan. The current basis stays optimal for bᵢ + Δ exactly while x_B + Δd ≥ 0, which gives
Δ ≥ max over rows with dᵣ > 0 of (−x_Bᵣ / dᵣ) and Δ ≤ min over rows with dᵣ < 0 of (−x_Bᵣ / dᵣ),
with an infinite bound on either side when no row constrains it. Inside that interval z* changes by yᵢ per unit; at each end some basic variable reaches exactly zero, and past it a different basis is optimal.
Example · The workshop's three prices, each with its rangeCutting is worth 0 over 2 ≤ b1, with no upper limit. Glazing is worth 3/2 over 6 ≤ b2 ≤ 18. Assembly is worth 1 over 12 ≤ b3 ≤ 24.
Read the first one carefully: the cutting row is worth nothing, and its range still has an end. Below b1 = 2 the row starts to bite and the price stops being zero, which is a thing a reader who has been told that slack rows are worth nothing does not expect.
z* as a function of the assembly capacity b3, exactly
b3 from 0 to 12 slope 5/2 basis s1, s2, x2
b3 from 12 to 24 slope 1 basis s1, x1, x2
b3 from 24 up slope 0 basis s3, x1, x2
b3 = 10 12 15 18 20 24 26
z* = 25 30 33 36 38 42 42
at b3 = 18 the price is 1, and the range is 12 ≤ b3 ≤ 24
inside: z*(20) = 36 + 1(20 − 18) = 38 correct
outside: 36 + 1(26 − 18) = 44, and the truth is 42
The three slopes are the whole lesson in one row of numbers. Assembly capacity is worth 5/2 an hour while it is the only thing in short supply, worth 1 an hour once cutting has begun to bind as well, and worth nothing at all past 24, where the plan has run out of cutting capacity and more assembly hours cannot be used. Three prices, one row, and each true on its own interval.
Outside the range the number is simply different
At b3 = 26 the naive extension predicts 44 and the answer is 42. That is not a small error in a linear approximation: the function is exactly linear and the slope used was the wrong one, because the basis that slope belonged to stopped being feasible at 24. The lab checks this the hard way, by solving again at every endpoint and at a point a hundredth outside it, and requiring the prediction to break there.
Two different ways a row can be worth nothing
Example · Slack, and tight-but-worthlessThe workshop's cutting row has 2 units spare at the optimum, so complementary slackness forces its price to zero: more of a resource you are not using cannot help. That is the easy case and it is the one most readers expect.
The other case is max x + y subject to x ≤ 2, y ≤ 2, x + y ≤ 4. At (2, 2) all three rows are tight, and the firing row is priced at 0 over 4 ≤ b3 — tight, fully used, and worth nothing. Its range is also one-sided at the current value, which is the second way degeneracy shows up here: the kiln and wheel rows are priced at 1 over 0 ≤ b ≤ 2, and 2 is where they already are, so there is no room above at all.
That last observation is worth stating plainly. A range whose end is the current right-hand side means the price is valid for decreases and for nothing else. Quoting it as the value of one more unit is then simply wrong, and a degenerate optimum is where it happens.
This is also the lesson that replaces calculus on this path, and it is worth saying why the replacement is an improvement rather than a workaround. At a breakpoint z* has a corner: the slope arriving from the left and the slope leaving to the right are both correct and they are different — 5/2 and 1 at b3 = 12, 1 and 0 at b3 = 24. A derivative would have to choose one of them or fail to exist. A rate with a stated interval reports both, and it is the honest object.