Module 5 of 6 · Lesson 4 of 4

The Revised Simplex Method

The same algorithm organised around the basis inverse, and what that changes about cost and about what a solver can do.

What you will be able to do

Given a standard-form minimisation and a basis, the learner can compute the basis inverse and basic values, form the multipliers, price nonbasic columns to find an entering variable, compute the direction and step, report the updated basis, and account for which quantities the method stores against those a full tableau would carry.

Orientation

A tableau on a program with 8 constraints and 500 variables updates roughly 4,500 entries per pivot. Most of those columns are never priced, and their updated values are discarded.

The revised method keeps the 8 × 8 inverse instead, and computes a reduced cost only for a column it actually examines. The algorithm is unchanged, same entering rule, same ratio test, same sequence of bases, but almost none of the arithmetic is the same arithmetic.

What this unit adds is the accounting: which quantities are worth storing, which are cheap to recompute, and what is lost when the state no longer fits on a page.

Procedure

One iteration, in the order the quantities are needed

The order matters: each step uses the previous one's result, and stopping early is possible at two points.

StepComputeSizeCost
1 x B = A B − 1 b m one matrix-vector product
2 p T = c B T A B − 1 m one vector-matrix product, once per iteration
3 c ¯ j = c j − p T A j scalar, per columnone dot product per column priced
4 u = A B − 1 A j m one matrix-vector product, entering column only
5 θ = min { x B ( i ) / u i : u i > 0 } scalarone scan
6update basis and A B − 1 m × m O ( m 2 )

Step 2 is the one that makes the method work. Forming p once converts pricing from a matrix operation into one dot product per column. Recomputing c B T A B − 1 inside the pricing loop gives the same numbers and throws away the entire saving. The most common way to write the method and get no benefit from it.

Two places the iteration stops.

At step 3, if every nonbasic column prices nonnegative, the basis is optimal. Under a first-negative rule pricing halts at the first negative column and the remaining columns are never examined; under a most-negative rule every column is priced before choosing. The first is cheaper per iteration and may take more iterations.

At step 5, if no component of u is positive, no basic variable falls as the entering variable rises: the program is unbounded.

Updating the inverse. The new basis differs in one column, so

A B ′ − 1 = E A B − 1 ,

where E is the identity with its l th column replaced by ( − u 1 / u l , … , 1 / u l , … , − u m / u l ) T and l is the leaving row. Applying E is O ( m 2 ) ; inverting from scratch is O ( m 3 ) .

On carrying an explicit inverse. Real implementations do not. They keep an LU factorisation of A B and solve A B T p = c B and A B u = A j instead, because repeated updates to an explicit inverse accumulate rounding error. The explicit form is used here because it makes the quantities visible; the algorithm is identical either way.

Worked example

Two iterations, with every quantity named

min − 5 x 1 − 4 x 2 subject to 6 x 1 + 4 x 2 + x 3 = 24 , x 1 + 2 x 2 + x 4 = 6 , x ≥ 0 .

Start from B = { 3 , 4 } , so c B = ( 0 , 0 ) T and A B = I .

---

Iteration 1.

Basic values. A B − 1 = I , so x B = b = ( 24 , 6 ) T ; the point is ( 0 , 0 , 24 , 6 ) with objective 0 .

Multipliers. p T = c B T A B − 1 = ( 0 , 0 ) .

Pricing. c ¯ 1 = − 5 − ( 0 , 0 ) ⋅ ( 6 , 1 ) T = − 5 . Negative, so x 1 is eligible. Under a most-negative rule also price c ¯ 2 = − 4 − 0 = − 4 . Take x 1 .

Direction. u = A B − 1 A 1 = ( 6 , 1 ) T .

Ratio test. Both components positive: 24 / 6 = 4 and 6 / 1 = 6 . Minimum 4 at row 1, so x 3 leaves and θ = 4 .

New basis. B = { 1 , 4 } .

---

Iteration 2.

Inverse. A B = ( 6 0 1 1 ) , so

A B − 1 = ( 1 / 6 0 − 1 / 6 1 ) ,

checked by A B A B − 1 = I .

Basic values. x B = A B − 1 b = ( 24 / 6 , − 24 / 6 + 6 ) T = ( 4 , 2 ) T , so x 1 = 4 , x 4 = 2 , and the point is ( 4 , 0 , 0 , 2 ) with objective − 5 ( 4 ) = − 20 .

Multipliers. c B = ( − 5 , 0 ) T , so

p T = ( − 5 , 0 ) ( 1 / 6 0 − 1 / 6 1 ) = ( − 5 / 6 , 0 ) .

Pricing. c ¯ 2 = − 4 − ( − 5 / 6 , 0 ) ⋅ ( 4 , 2 ) T = − 4 + 20 / 6 = − 2 / 3 . Negative, so x 2 enters. (For completeness c ¯ 3 = 0 − ( − 5 / 6 , 0 ) ⋅ ( 1 , 0 ) T = 5 / 6 , positive.)

Direction. u = A B − 1 A 2 = ( 1 / 6 0 − 1 / 6 1 ) ( 4 2 ) = ( 2 / 3 , 4 / 3 ) T .

Ratio test. 4 / ( 2 / 3 ) = 6 and 2 / ( 4 / 3 ) = 3 / 2 . Minimum 3 / 2 at row 2, so x 4 leaves and θ = 3 / 2 .

New basis. B = { 1 , 2 } .

---

Iteration 3: the optimality check.

A B = ( 6 4 1 2 ) with determinant 8 , so

A B − 1 = ( 1 / 4 − 1 / 2 − 1 / 8 3 / 4 ) .

x B = A B − 1 b = ( 24 / 4 − 3 , − 3 + 4.5 ) T = ( 3 , 3 / 2 ) T .

c B = ( − 5 , − 4 ) T , so p T = ( − 5 , − 4 ) A B − 1 = ( − 5 / 4 + 1 / 2 , 5 / 2 − 3 ) = ( − 3 / 4 , − 1 / 2 ) .

Pricing the two nonbasic columns:

c ¯ 3 = 0 − ( − 3 / 4 , − 1 / 2 ) ⋅ ( 1 , 0 ) T = 3 / 4 , c ¯ 4 = 0 − ( − 3 / 4 , − 1 / 2 ) ⋅ ( 0 , 1 ) T = 1 / 2 .

Both nonnegative, so the basis is optimal:

x ∗ = ( 3 , 3 / 2 , 0 , 0 ) , z ∗ = − 5 ( 3 ) − 4 ( 3 / 2 ) = − 21 .

Verification against the original program. 6 ( 3 ) + 4 ( 3 / 2 ) = 18 + 6 = 24 and 3 + 2 ( 3 / 2 ) = 6 , both components nonnegative.

What was never computed. At no point was a full tableau formed. Column 2's direction was computed once, in the iteration that used it; column 3 and column 4 were priced as scalars and never had a direction formed at all. On this four-column problem that saves little; on a program with five hundred columns it is the difference between the method being usable and not.

A note on the fractions. The intermediate quantities are fractional while the data is integral. That is ordinary: nothing about a linear program's data makes its basic solutions integral, which is exactly the property the transportation model has and general programs do not.

Derivation

Why the inverse update is one elementary matrix

The claim is that the new basis inverse is A B ′ − 1 = E A B − 1 for an elementary matrix E costing O ( m 2 ) to apply. Here is where E comes from.

Setup. The entering column is A j with direction u = A B − 1 A j , and the leaving variable occupies row l of the basis, so u l > 0 by the ratio test.

What changes. The new basis matrix A B ′ equals A B with its l th column replaced by A j . Multiplying on the left by A B − 1 :

A B − 1 A B ′ = ( e 1 ⋯ u ⋯ e m ) ,

the identity with its l th column replaced by u , since A B − 1 A B = I and A B − 1 A j = u . Call this matrix F .

Inverting F . F differs from the identity in one column, and its inverse is the identity with its l th column replaced by

( − u 1 u l , … , 1 u l , … , − u m u l ) T ,

the 1 / u l sitting in position l . This is the matrix E . Verifying F E = I is a direct multiplication: column l gives u ⋅ ( 1 / u l ) plus the corrections − u i / u l from the other columns, which cancel to e l ; every other column is unchanged because E agrees with the identity outside column l .

The update. From A B − 1 A B ′ = F ,

A B ′ = A B F ⟹ A B ′ − 1 = F − 1 A B − 1 = E A B − 1 .

The cost. E differs from the identity in one column, so forming E A B − 1 means scaling row l of A B − 1 by 1 / u l and adding a multiple of it to each other row: O ( m 2 ) arithmetic, against O ( m 3 ) to invert A B ′ directly.

Why this is exactly a tableau pivot. The operations just described, scale the pivot row, subtract multiples from the others, are the row operations a tableau performs. The difference is scope: the tableau applies them to all n + 1 columns, the revised method to the m columns of the inverse. Same operations, different object.

Why implementations stop here. Each iteration multiplies by another E , so after k iterations the inverse is a product of k elementary matrices applied to the original. Rounding error compounds along that product. Implementations therefore store the E factors (the product form of the inverse) or an LU factorisation, and refactorise from scratch periodically. The mathematics above is what they are approximating.

Contrast

The same run, both ways

Take the program from the tableau unit: min − 3 x 1 − 2 x 2 subject to x 1 + x 2 + x 3 = 4 , x 1 + 3 x 2 + x 4 = 6 , from B = { 3 , 4 } .

Full tableauRevised
Iteration 1, enteringscan objective row: c ¯ 1 = − 3 p T = ( 0 , 0 ) , price x 1 : c ¯ 1 = − 3
Iteration 1, ratio testread column 1: 4 / 1 , 6 / 1 u = A B − 1 A 1 = ( 1 , 1 ) T , ratios 4 , 6
Iteration 1, updaterow-reduce all 5 columnsupdate A B − 1 to ( 1 0 − 1 1 )
Iteration 2, testscan objective row: ( 0 , 1 , 3 , 0 ) p T = ( − 3 , 0 ) ; c ¯ 2 = 1 , c ¯ 3 = 3
Resultoptimal, x = ( 4 , 0 , 0 , 2 ) , z = − 12 optimal, x = ( 4 , 0 , 0 , 2 ) , z = − 12

Same entering variable, same leaving variable, same step, same optimum. The reduced costs the tableau displays in its bottom row, ( 0 , 1 , 3 , 0 ) , are the numbers the revised method computes as c j − p T A j when it prices. They are the same quantities, obtained differently.

Where they diverge in cost. With m = 2 and n = 4 the tableau updates 15 entries per pivot and the revised method updates 4. At m = 8 , n = 500 the tableau updates about 4,500 and the revised method 64, plus one dot product per column actually priced.

Where they diverge in what you can see. Reading optimality off a tableau is one glance. In the revised method it is a conclusion drawn after pricing, with nothing to look at. Conversely, asking why c ¯ 2 = 1 has an answer in the revised form, it is c 2 − p T A 2 , and p came from c B T A B − 1 , where in the tableau the entry is the result of accumulated row operations with no derivation attached.

Which to use when. By hand on a small program, the tableau: the state is visible and the arithmetic is mechanical. In an implementation, or on any program with many more columns than rows, the revised form. For understanding what a solver reports, the revised form again, because its quantities are the ones a solver's log and sensitivity output actually name.

Optional enrichment (1)

Application

Pricing a column that does not exist yet

The revised method prices columns one at a time, using only p T and the column itself. Nothing in step 3 requires the columns to be stored anywhere, and that opens a technique the tableau form cannot express.

Cutting stock. A mill has rolls of fixed width and a set of customer widths to cut. A pattern is one way of cutting a roll, so many of this width, so many of that, and a variable counts how many rolls are cut to that pattern. The number of feasible patterns grows combinatorially; for realistic inputs it runs to millions. Writing the constraint matrix is impossible, so a tableau is impossible.

But the method never needs all of it. Pricing asks one question: is there a column A j with c j − p T A j < 0 ? With c j = 1 for every pattern, that is asking whether some pattern has p T A j > 1 , and a pattern is a vector of counts fitting within the roll width. So the pricing step becomes a small knapsack problem: choose counts maximising p T a subject to the widths fitting.

If its optimum exceeds 1 , it is the entering column, generated rather than retrieved. If not, no improving column exists among the millions, and the current basis is optimal, established without enumerating them.

Why this is exactly the same algorithm. The entering rule, ratio test, step and basis update are unchanged. Only the search for a negative reduced cost is replaced: an optimisation over implicit columns instead of a scan over stored ones. This is column generation, and it works because the revised method's pricing step was already a per-column question.

What it needs. A subproblem that can be solved efficiently and returns a genuine minimiser of the reduced cost. A heuristic that misses an improving column may stop early and report a non-optimal basis as optimal. The subproblem is usually a combinatorial problem in its own right, and the technique is only worthwhile when it is much easier than the master problem.

A representation choice made for efficiency turned out to change what problems the method can address. The tableau requires every column to exist before the algorithm starts; the revised form requires only that a column can be produced on request.

Next step

Practice The Revised Simplex Method

Practice records what support you used, so the evidence reflects how you actually performed.

Practice this lessonSkip to Verifying a Reported Solution

Results update as you type. Use the up and down arrow keys to move between results, Enter to open one, and Escape to close.

Type to search.

Settings

Appearance

Interface density

Your record

Your progress is stored in this browser and nowhere else: an identifier, the answers you have given, the mastery states and review schedule derived from them, and the lesson you last opened. Clearing it makes you a new learner on this device. It cannot be undone, and it will not affect your appearance or density settings.

Focus timer

Focus--minutes remaining

Phase

Kept in this browser only, and used to label the session in your own history.

Today

Nothing recorded yet. Finish a focus session and it will appear here.

Settings

Focus sessions between long breaks.

Sessions you are aiming for in a day.

Notifications

Your history

Sessions are stored in this browser and nowhere else. They are not evidence and never reach your mastery record.