Learn
Lesson · Duality and Sensitivity Analysis · The two theorems

Strong Duality from the Final Tableau

At the optimum, the objective-row entries under the columns that started as the identity are exactly c_BᵀB⁻¹. That vector is dual feasible and its dual objective equals the primal optimum, so the simplex method has been solving both programmes all along and the final tableau is a proof of strong duality on this instance rather than evidence for it. The prices are not in the right-hand column, and on a floor or a quota the identity columns are not the slack columns.

y = c_B ᵀ B⁻¹ the z-row entries under the INITIAL identity columns workshop final z-row 0 0 0 3/2 1 | 36 x1 x2 s1 s2 s3 z* so y = (0, 3/2, 1) and the right-hand column holds the PLAN, not y dual check yᵀaⱼ − cⱼ ≥ 0 for every column: 0, 0, 0, 3/2, 1 bᵀy = 4(0) + 12(3/2) + 18(1) = 36 = z* exactly, in fractions
Where the prices are, and the two checks that confirm them

Core ideas

What this lesson establishes

One hard idea: the second programme was never solved separately. Everything else here is knowing which columns to look under.

1

The prices are in the objective row, under the initial identity columns

Column i of B⁻¹ is the tableau column standing over whatever column of the original data was eᵢ. The objective-row entry there is c_BᵀB⁻¹eᵢ, which is yᵢ. So the whole price vector is m numbers already printed in the tableau you finished with, in a row most readers walk past.

2

Those columns are not always the slack columns

On a ≤ row the identity column is the slack. On a ≥ row the slack is a surplus, whose original column is −eᵢ, so the identity column is the artificial beside it. An = row has no slack column at all, and its identity column is the artificial. The lab prints the kind of every column it used for exactly this reason.

3

Two checks turn the reading into a proof

Check yᵀaⱼ ≥ cⱼ column by column and you have dual feasibility. Check bᵀy = z* and weak duality does the rest: equal values at a feasible pair prove both points optimal. Together those are a proof of strong duality on this instance, done in exact fractions, with no appeal to a general theorem.

The material

Reading the second programme out of the first one's final tableau

Which columns hold the inverse, why the objective row over them is the price vector, and the two checks that close the argument.

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 columns

In 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 tableau

Let 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 it

The 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 column

The 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 all

Replace 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.

Interactive

The prices were in the tableau all along

y = c_B·B⁻¹, read off the columns that started as the identity

Reading the prices off the tableauthey are in the objective row, under the columns that started as the identity
a column that started as the identitythe objective row the prices come froma column that only looks like one

Method

Getting the prices out of a tableau you have finished

Identify the columns before reading any numbers. Everything that goes wrong here goes wrong at that step.

1

Write down which column of the ORIGINAL data was each unit vector

One per row. A ≤ row gives its slack, a ≥ row gives its artificial, an = row gives its artificial. Do this from the original standard form, not from the final tableau, because the final tableau is what those columns have become.

2

Read the objective row over those columns, in order

That is y, row by row, and the order is the constraint order. Do not read the right-hand column: that holds the plan, and the single number at the end of the objective row is z*.

3

Check dual feasibility one column at a time

For each primal column j, compute yᵀaⱼ − cⱼ and confirm it is non-negative for a maximisation. Every basic column gives exactly zero; a nonbasic column's gap is its reduced cost, which the ranging lessons use directly.

4

Check bᵀy = z* exactly

In fractions, not in decimals. If the two agree you have proved both points optimal by weak duality, with no further argument; if they do not, the identity columns were misidentified, which is the failure this check is here to catch.

Where the prices are

Score 0 / 0

y read off the workshop tableau, then proved

The tableau below is what the simplex method left behind. Nothing is recomputed: the prices are copied out of it, and then the two checks turn the copy into a proof.

original standard form columns x1 x2 s1 s2 s3 cutting x1 + s1 = 4 s1 is e1 glazing 2x2 + s2 = 12 s2 is e2 assembly 3x1 + 2x2 + s3 = 18 s3 is e3 so the initial identity columns are s1, s2, s3 final tableau basis x1, s1, x2 x1 x2 s1 s2 s3 | rhs 1 0 0 −1/3 1/3 | 2 0 0 1 1/3 −1/3 | 2 0 1 0 1/2 0 | 6 z 0 0 0 3/2 1 | 36 read y1 = 0 y2 = 3/2 y3 = 1 check 1 dual feasibility, column by column x1: (0)(1) + (3/2)(0) + (1)(3) = 3 ≥ 3 gap 0 x2: (0)(0) + (3/2)(2) + (1)(2) = 5 ≥ 5 gap 0 s1: (0)(1) + (3/2)(0) + (1)(0) = 0 ≥ 0 gap 0 s2: (0)(0) + (3/2)(1) + (1)(0) = 3/2 ≥ 0 gap 3/2 s3: (0)(0) + (3/2)(0) + (1)(1) = 1 ≥ 0 gap 1 every gap ≥ 0, so y is dual feasible check 2 b'y against z* b'y = 4(0) + 12(3/2) + 18(1) = 0 + 18 + 18 = 36 z* = 36 equal conclude a feasible pair with equal values: (2, 6) is optimal for the workshop and (0, 3/2, 1) is optimal for its dual.

The two checks are doing different work. Dual feasibility is what makes y a certificate at all; the equality is what makes it a sharp one. Neither needed the dual programme to be solved, and the second is the whole of strong duality on this instance.

For a faded rehearsal, do the same on the bakery, where the third row is a floor. The supplied move is the one that matters: its initial identity column is the artificial a3, not the surplus e3. Read all three prices, check the two dual constraints, and confirm bᵀy = 21. Then predict what you would have got from e3 instead, and check that prediction in the lab.

A reader who wants the third case should then do the quota preset, where there is no third slack column at all and the entire value of the programme is attributed to one equality row.

Common mistakes

1
Reading the prices out of the right-hand columnThat column is B⁻¹b, the plan. It has one entry per row and so does y, which is what makes the mistake survive a sanity check: on the workshop it gives (2, 2, 6) instead of (0, 3/2, 1), three plausible-looking numbers that fail bᵀy = z* immediately. Running that check is how you find out.
2
Assuming the identity columns are the slack columnsTrue only when every row is a ≤. A ≥ row's surplus column is −eᵢ, so reading the price there returns its negative; an = row has no slack column at all. This is the warning The Simplex Method gives about which columns hold B⁻¹, and it applies here for the same reason, on the same tableau.
3
Treating dual feasibility as something to assume rather than checkThe objective-row entries being non-negative is the optimality test, so on a tableau the method actually finished with it holds — but on a tableau you have modified, cut, re-costed or rebuilt by hand it may not, and every later lesson modifies tableaux. Check the columns; it is one dot product each.

Check your understanding

✓
Finish when you can get the prices out of any final tableau, including one whose rows are not all caps.

You should be able to name the initial identity column of a ≤, a ≥ and an = row, read y out of the objective row over them, check yᵀaⱼ ≥ cⱼ for every column, and confirm bᵀy = z* in exact fractions — and say what it proves when it does.

Note: Everything in the second half of this course is a ratio test on this tableau. The price of a row and the range that price survives, the range of an objective coefficient, the value of a product not yet in the model, the cost of a rule not yet in the model: four different questions, one object, no re-solving. What comes first is the pattern of zero gaps noticed above, which “Complementary Slackness” turns into a way of certifying an answer somebody else has handed you.

Kept in this browser only, for you. Nothing is sent anywhere and nothing checks it. Carry it to another device.

Feedback and recommendations

Something to change about this lesson? Write it down, tick it off when it is handled, and export the list when you want to act on it. Kept in this browser only: nothing is sent anywhere, and nobody is notified.

No recommendations yet for this lesson.