5.5 The dual simplex method

The primal simplex method keeps \(x_B \geq 0\) (primal feasibility) and works towards non-negative reduced costs (dual feasibility). The dual simplex method (Lemke, 1954) does the opposite: it keeps the reduced costs non-negative and works towards \(x_B \geq 0\). An iteration chooses a row \(r\) with \(x_{B(r)} < 0\) to leave, and among the columns with a negative entry in that row chooses the entering one by the dual ratio test \[ j = \operatorname *{arg\,min}\Bigl \{\frac {\bar c_j}{|T_{rj}|} : T_{rj} < 0\Bigr \} , \] which keeps every reduced cost non-negative after the pivot. If no entry of the row is negative, the row reads \(\sum _jT_{rj}x_j = x_{B(r)} < 0\) with \(T_{rj} \geq 0\), which no \(x \geq 0\) satisfies, so the primal is infeasible. The objective value moves monotonically towards the optimum from the other side, and the method is the simplex method applied to the dual, carried out on the primal tableau.

It is the natural method when a solved problem gains a constraint, as in the branch-and-bound and cutting-plane methods for integer programming: the old optimal basis stays dual feasible, the new constraint makes it primal infeasible, and a few dual pivots restore optimality. It is also the default of most modern solvers, because it handles bounds and degeneracy well.

Example 5.5.1. Minimise \(20x_1 + 10x_2\) subject to \(x_1 + 2x_2 \leq 40\), \(3x_1 + x_2 \geq 30\), \(4x_1 + 3x_2 \geq 60\). Multiplying the \(\geq \) rows by \(-1\) and adding slacks, the slack basis has \(x_B = (40, -30, -60)\), primal infeasible, but reduced costs \((20, 10) \geq 0\), dual feasible. The most negative row, \(-60\), leaves; the dual ratios are \(20/4 = 5\) and \(10/3\), so \(x_2\) enters. Then the second row, now \(-10\), leaves and \(x_1\) enters, giving the optimum \((6, 12)\) at cost \(240\) in two pivots without any artificial variables (Software 5.6.2).

Questions on this section

Stuck on something here? Ask below and it stays attached to this topic.