The previous lesson ended with prices that closed the gap exactly and no account of where they came from. They were not guessed. They were sitting in the final tableau of the primal solve, in the objective row, and this lesson is the whole of that fact.
Definition · The initial identity columnsIn standard form the constraint matrix A contains, for each row i, some column equal to the unit vector eᵢ. Call those the initial identity columns. A ≤ row contributes its slack; a ≥ row contributes its artificial, because its surplus column is −eᵢ; an = row contributes its artificial, having no slack at all.
The tableau is B⁻¹[A | b], so the tableau column standing over the initial identity column for row i is B⁻¹eᵢ, which is column i of B⁻¹. That is the sentence the rest of the lesson rests on.
workshop, final tableau basis x1, s1, x2
x1 x2 s1 s2 s3 | rhs
---------------------------------------------
1 0 0 −1/3 1/3 | 2 x1
0 0 1 1/3 −1/3 | 2 s1
0 1 0 1/2 0 | 6 x2
---------------------------------------------
z 0 0 0 3/2 1 | 36
^^^^^^^^^^^^^^^^^
the three initial identity columns
y = (0, 3/2, 1) z* = 36
the right-hand column, (2, 2, 6), is the PLAN: x1 = 2, s1 = 2, x2 = 6
Theorem · Strong duality, from the tableauLet the simplex method finish on a maximisation with basis B, and set y = c_BᵀB⁻¹, read off the objective row under the initial identity columns. Then y is dual feasible and bᵀy = z*. Consequently y is optimal for the dual and the primal optimum equals the dual optimum.
Dual feasibility is the optimality test itself: the objective-row entry over column j is c_BᵀB⁻¹aⱼ − cⱼ = yᵀaⱼ − cⱼ, and the method stopped precisely because every one of those is non-negative. And bᵀy = c_BᵀB⁻¹b = c_Bᵀx_B = z*, because B⁻¹b is the basic part of the plan. Weak duality then gives optimality of both points.
This is an argument about the instance in front of you, and it is the version this course takes, because it is the one a reader can execute. The separating-hyperplane route through the theorems of the alternative proves more and shows less.
Example · Reading the workshop, then checking itThe three initial identity columns are the slacks s1, s2, s3, and the objective row over them reads 0, 3/2, 1. So the cutting row is worth nothing, an hour of glazing is worth 3/2, and an hour of assembly is worth 1.
The dual check, column by column: x1 gives (0)(1) + (3/2)(0) + (1)(3) = 3 ≥ 3, a gap of 0; x2 gives (0)(0) + (3/2)(2) + (1)(2) = 5 ≥ 5, a gap of 0; the three slack columns give 0, 3/2 and 1 against a cost of 0, gaps of 0, 3/2 and 1. Every gap is non-negative, so y is dual feasible. And bᵀy = 4(0) + 12(3/2) + 18(1) = 36, which is z*.
Notice which gaps came out zero. The two decision columns are in the basis or were brought into it, and a basic column's gap is exactly zero; the slack columns' gaps are the prices themselves. That pattern is not a coincidence either, and it is the next lesson.
When the identity column is not the slack column
Every worked example above has only ≤ rows, which is the case where the two lists coincide and the distinction is invisible. The moment a row is a floor or a quota the lists part company, and reading the price out of the slack column gives a number that is not a price.
Example · A floor, whose price hides in an artificial columnThe bakery maximises 5x + 4y subject to 6x + 4y ≤ 24 (flour), x + 2y ≤ 6 (sugar) and x + y ≥ 2 (contract). Its standard form has columns x, y, s1, s2, e3, a3: two slacks, then a surplus and an artificial for the floor.
The lab reports the columns it read as slack, slack, artificial. The prices are y = (3/4, 1/2, 0), and bᵀy = 24(3/4) + 6(1/2) + 2(0) = 21, which is z* at the plan (3, 3/2). Read the third price out of the surplus column e3 instead and you get the negative of it, because that column of the original data is −e₃.
Example · A quota, which has no slack column at allReplace the bakery's floor with x + y = 3. Now the standard form is x, y, s1, s2, a3 — there is no third slack to read anything out of. The identity column for that row is the artificial, the prices are y = (0, 0, 5), and bᵀy = 24(0) + 6(0) + 3(5) = 15 = z* at the plan (3, 0).
Both of the ≤ rows have slack here and are priced at nothing, and the entire value of the programme is attributed to the quota. The y column's dual gap is 5 − 4 = 1, which says the second product is worth 1 less than the quota room it would consume.
The tableau rebuilt from the original data
The claim that the tableau is B⁻¹[A | b] can be checked rather than believed. Gather the basis columns out of the original matrix, invert that, multiply by the original A, and compare entry for entry with the tableau on the screen. On the workshop the basis is x1, s1, x2, B⁻¹ has rows (0, −1/3, 1/3), (1, 1/3, −1/3) and (0, 1/2, 0), and B⁻¹b = (2, 2, 6) — the right-hand column. The lab's second view does this for every preset, and the engine's own checks do it on 178 programmes.
So the reading is not a rule of thumb about where numbers sit. It is a consequence of what the tableau is, and once that is seen, the sensitivity questions in the second half of this course are all ratio tests on the same object.