Contents  |  ‹ Previous  |  Next ›  |  Download EPUB  |  PDF

Chapter 11
Duality

Learning Outcomes

You will learn

Try it out visually!

Primal-to-Dual Construction: build the dual one multiplier at a time, exactly as in this chapter.

Duality and Sensitivity Explorer: the primal, the dual, and the shadow prices, live.

Dual Simplex Method: a further topic to explore after this chapter.

A rival baker knocks on your door with an offer: “Don’t bake tomorrow. Sell me your whole pantry (every unit of flour and sugar) and take the day off.” You would only accept if the payment beats every plan you could bake yourself, so the rival must price each ingredient carefully: the ingredients that go into one cake must fetch at least a cake’s profit, and likewise for cookies; otherwise you would simply say no and bake. The rival, of course, wants the cheapest offer that convinces you. That cheapest convincing offer turns out to equal your best baking profit exactly. Finding the rival’s prices is a linear program too: the dual of yours.

11.1 Duality Theory

Motivating Example

Imagine you run a small bakery that makes two products: cakes ( x1) and cookies ( x2). Your goal is to maximize your daily profit. Cakes yield a profit of $3 each, and cookies yield $2 each. You are limited by the ingredients you have on hand: you have at most 4 units of flour and 5 units of sugar available each day. Each cake requires 1 unit of flour and 2 units of sugar, while each cookie requires 1 unit of flour and 1 unit of sugar. We can write this scenario as a linear program:

max 3x1 + 2x2 (maximize total profit) subject to x1 + x2 4 (flour constraint) 2x1 + x2 5(sugar constraint) x1,x2 0.

Here, x1 is the number of cakes you bake, and x2 is the number of cookies. The constraints limit how many of each product you can produce given your resources.

Now, suppose a friend is not sure that you are telling the truth about the maximum profit you can make. They ask, “Can you prove an upper bound on how much money you could possibly earn with these ingredient constraints, without actually solving the problem?”

Intuition Behind Duality

Consider the constraints in the problem. Each one puts a cap on how large the combination of x1 and x2 can be. If we think of them separately:

Now, what if we take some nonnegative multipliers y1 and y2 and combine these inequalities into one single inequality? For instance, multiply the flour constraint by y1 0 and the sugar constraint by y2 0 and add them up:

y1(x1 + x2) + y2(2x1 + x2) y1(4) + y2(5).

Grouping the terms by x1 and x2 gives:

(x1(y1 + 2y2)) + (x2(y1 + y2)) 4y1 + 5y2.

If we choose y1 and y2 cleverly, we can force the left-hand side to be an expression that is always at least as large as our profit function 3x1 + 2x2. Specifically, we want

y1 + 2y2 3andy1 + y2 2.

Why? Because if the coefficients on x1 and x2 in our combined inequality dominate those in our profit function, then the upper bound on the combined inequality’s right-hand side ( 4y1 + 5y2) will also serve as an upper bound on the profit 3x1 + 2x2. This ensures:

3x1 + 2x2 (y1 + 2y2)x1 + (y1 + y2)x2 4y1 + 5y2.

Thus, by choosing y1 and y2, we obtain a valid upper bound on the maximum profit. If we try to minimize 4y1 + 5y2 over all y1,y2 0 that satisfy these inequalities, we find the best (smallest) upper bound on our original problem.

The whole argument is a pipeline: it starts from the constraints you already have and ends at a new optimization problem. Figure 11.1 summarizes it. The key step is the last one: searching for the best certificate is itself a linear program.

Four-step flowchart deriving the dual: start with the primal constraints x1+x2<=4 (flour) and 2x1+x2<=5 (sugar); multiply by y1, y2 >= 0 and add them into one inequality; choose y so the left side dominates the profit 3x1+2x2, giving the certificate 3x1+2x2 <= 4y1+5y2; finally minimize the bound over all valid y, producing the dual LP: min 4y1+5y2 subject to y1+2y2>=3, y1+y2>=2, y>=0.

Figure 11.1: From constraints to the dual: every feasible y certifies an upper bound on profit, and the dual LP finds the best certificate.

Learning Checkpoint 11.1.1

In the bakery problem, take multipliers y1 = 3 and y2 = 0. Verify that this choice satisfies both dominance conditions, and compute the resulting upper bound on profit. Then compare it with the bound from y1 = 1,y2 = 1. Which certificate is better? Can you find one better still?

General Derivation of the Dual

We started with the primal problem in a general form:

max cx subject to Ax b x 0.

Each constraint ai x bi (where ai is the i-th row of A) is valid for all feasible x. If we take a nonnegative combination of these constraints, say with multipliers yi 0, we get:

i=1my i(ai x) i=1my ibi.

This can be written as:

( i=1my iai) x i=1my ibi.

If we choose y such that i=1myiai c, then for all feasible x (since x 0):

cx ( i=1my iai) x i=1my ibi.

So, by = i=1myibi is an upper bound on the maximum primal objective value. By minimizing over all such y, we seek the tightest upper bound:

min by subject to Ay c y 0.

This is the dual problem. In our bakery scenario, this dual formulation corresponds to adjusting the prices (the y values can be thought of as “shadow prices”) you would assign to each ingredient such that if you charge yourself for using these ingredients at these shadow prices, you end up with the smallest possible “bill” that still always surpasses or equals your maximum possible profit. The Strong Duality Theorem ensures that the optimal primal value equals the optimal dual value. This is precisely the rival baker’s problem from the start of the chapter: the constraints Ay c say the offer must beat baking, product by product, and the objective min by is the rival shopping for the cheapest offer that still convinces you.

From the above reasoning, we have shown that if x is feasible for the primal and y is feasible for the dual, then cx by. In other words, the value of any feasible primal solution is always bounded above by the value of any feasible dual solution. This inequality is called weak duality; we state it as a theorem in the next section.

Weak duality is not specific to linear programming; the same kind of bound appears in many other classes of optimization problems. In the special case of linear programs (and certain other problem classes), we can say even more: there exist optimal solutions for both problems whose objective values match. This result is known as the Strong Duality Theorem.

11.2 Primal-Dual Pairs and Strong Duality

Learning Outcomes

Consider the following pair of linear programs, known as a primal-dual pair. The primal problem (P) has n decision variables and m constraints, while the dual problem (D) has m decision variables and n constraints.

max cx s.t. Ax b x 0 (Here, x n and A is an m × n matrix.)

auto

min by s.t. Ay c y 0 (Here, y m, so the dual has  m variables and n constraints.)

From weak duality, we know that for any feasible x in (P) and any feasible y in (D), it holds that:

cx by.

This indicates that the optimal value of the dual problem is always an upper bound on the optimal value of the primal problem.

Theorem 11.1: Weak Duality

For any feasible solution x of the primal problem (P) and any feasible solution y of the dual problem (D),

cx by.

Weak duality theorems appear in many classes of optimization problems. In the special case of linear programs (and some other structured problems), we also have a stronger result, known as the Strong Duality Theorem. This theorem completely characterizes the relationship between the primal and dual solutions:

Theorem 11.2: Strong Duality

For a primal-dual pair of linear programs:

(P)max cx subject to Ax b,x 0, (D)min by subject to Ay c,y 0,

the following cases hold:

1.
If (P) is unbounded, then (D) must be infeasible.
2.
If (D) is unbounded, then (P) must be infeasible.
3.
If both (P) and (D) have feasible solutions and are bounded, then both have optimal solutions x and y respectively, and
cx = by.

Example 11.3: Dual Infeasibility from Primal Unboundedness

Consider the following linear program:

maximize x1 subject tox1 x2 1 2x1 x2 3 x1,x2 0

As shown in Example 7.18, this primal problem is unbounded. After applying the simplex method, we found that when s1 enters the basis, there is no constraint preventing it from growing indefinitely, and the objective increases without bound. Therefore, the primal is unbounded.

Now, consider the dual of this problem:

minimize y1 + 3y2 subject toy1 + 2y2 1 y1 y2 0 y1,y2 0

To determine the status of the dual, we apply the simplex method using the Big-M technique to initialize feasibility. The auxiliary variable a1 is introduced to handle the infeasibility of the initial basic solution.

First dictionary (with Big-M penalty):

Maximize  y1 3y2 1000a1
subject to { w1 = 1 + y1 + 2y2 + a1 w2 = 0 y1 y2

Setup: price out a1 (not a pivot). At y1 = y2 = 0 the first equation gives w1 = 1, which is infeasible. We instead make a1 basic: solve the first equation for a1 and substitute it into the objective. This is a rewriting of the same system, not a simplex pivot; it produces a feasible starting dictionary whose objective row carries the Big-M penalty.

Second dictionary:

Maximize  1000 + 999y1 + 1997y2 1000w1
subject to { a1 = 1 y1 2y2 + w1 w2 = 0 y1 y2

Pivot: Enter y2, leave w2. The coefficient of y2 in the objective is positive, and the ratio test selects w2 (a degenerate pivot: y2 enters at value 0).

Final dictionary:

Maximize  1000 998y1 1000w1 1997w2
subject to { a1 = 1 + y1 + w1 + 2w2 y2 = 0 y1 w2

In this final dictionary, all variables in the objective function have non-positive coefficients, but the artificial variable a1 remains in the basis with a positive value. Since a1 > 0 at termination, we conclude that the original dual problem is infeasible.

Conclusion via Strong Duality: This is exactly what strong duality predicts: because the primal problem is unbounded, the dual must be infeasible, and the Big-M computation confirms it directly.

11.2.1 Economic Interpretation of the Dual

Duality in linear programming has a natural economic interpretation: the dual variables represent the value of resources or constraints in the primal problem. These values are commonly known as shadow prices.

Definition 11.4: Shadow Price

The shadow price of a constraint in a linear program tells us how much the optimal objective value would change if we slightly increased the right-hand side of that constraint by one unit, while keeping everything else fixed.

In a maximization problem, a shadow price represents the increase in value per additional unit of a scarce resource. In a minimization problem, it represents the decrease in cost.

Interpretation: If a constraint represents the availability of a resource (e.g., time, material), then its shadow price reflects the marginal value of that resource: how much the objective would improve if you had one more unit of it.

Mathematically: If the constraint aix bi has corresponding dual variable yi, then:

Shadow price = dz dbi = yi

where z is the optimal value of the objective function.

Units and Interpretation: The units of a shadow price match the units of the objective function (e.g., dollars of profit) per unit of the resource (e.g., kilograms of flour, hours of labor). If y2 = 50 in the bakery example, and the constraint corresponds to sugar (in kg), then each additional kg of sugar would allow the bakery to increase profit by $50.

Example 11.5: The Bakery Revisited

Consider the primal problem:

maximize 3x1 + 2x2 subject tox1 + x2 4(Flour) 2x1 + x2 5(Sugar) x1,x2 0

The dual problem is:

minimize 4y1 + 5y2 subject toy1 + 2y2 3 y1 + y2 2 y1,y2 0

If the optimal dual solution is y1 = 1,y2 = 1, then:

The Dual of the Running Example

We can now close the loop with the running example of Chapters 710. Its primal and dual are:

max 2x + 3y  s.t.  x + y 9 (hours) 2x + y 16(flour) x + 2y 14(sugar) x,y 0 min 9y1 + 16y2 + 14y3  s.t. y1 + 2y2 + y3 2 (x column) y1 + y2 + 2y3 3 (y column) y1,y2,y3 0.

In Chapter 10 we computed the shadow prices of this problem from the final dictionary: $1 per hour, $0 per unit of flour, $1 per unit of sugar. Try that vector, y = (1,0,1), in the dual. It is feasible (the first constraint gives 1 + 0 + 1 = 2 2 and the second gives 1 + 0 + 2 = 3 3, both tight), and its objective value is

9(1) + 16(0) + 14(1) = 23,

exactly the optimal primal profit. By weak duality no dual solution can do better, so the shadow prices are the optimal dual solution. Note also that flour, the resource with slack at the optimum ( s2 = 3), is precisely the one priced at zero, a pattern we will formalize as complementary slackness.

You can experiment with this yourself: drag the multipliers on the three constraints in the Desmos duality explorer (backup interactive plot) and watch the combined inequality sweep across the feasible region. Every valid combination of multipliers gives an upper bound on the profit, and the best one touches the optimal vertex.

Example 11.6: A Larger Example: Bakery 2.0

The primal problem describes a bakery optimizing the production of cakes, cookies, and muffins to maximize profit. The constraints represent limited resources: flour, sugar, and baking time. The dual problem attaches a shadow price to each of these resources, reflecting their marginal value.

Primal Problem:

max 90x1 + 40x2 + 70x3 s.t. 5x1 + 4x2 + x3 40(Flour) x1 + x2 + x3 10(Sugar) x1 + x2 + 0.5x3 7(Baking Time) x1,x2,x3 0

Optimal Primal Solution:

x1 = 4,x2 = 0,x3 = 6,Objective Value  = 780

Dual Problem:

min 40y1 + 10y2 + 7y3 s.t. 5y1 + y2 + y3 90(Cakes) 4y1 + y2 + y3 40(Cookies) y1 + y2 + 0.5y3 70(Muffins) y1,y2,y3 0

Optimal Dual Solution:

y1 = 0,y2 = 50,y3 = 40,Objective Value  = 780

Interpretation of Shadow Prices

Complementary Slackness Verification

From the primal solution:

These relationships satisfy the complementary slackness conditions:

yi > 0 Constraint i is tight,Constraint i not tight yi = 0

Sensitivity Analysis: Marginal Value of Resources Assuming the current basis remains optimal, the increase in maximum profit from one additional unit of:

The dual solution not only validates the primal objective value (via strong duality), but also assigns economic meaning to each constraint. Shadow prices tell you how much you would be willing to pay for more of each resource, a foundational concept in operations, pricing, and planning.

When Are Shadow Prices Meaningful? Shadow prices are meaningful only when:

If a constraint is not tight, then its shadow price is 0: the resource is not limiting the optimal solution.

Connection to the Dual Problem: In the dual problem:

This ensures equilibrium: no profitable arbitrage is possible, and every unit of constrained resource is priced at its true marginal value.

Summary of Shadow Price Properties:

11.3 Different Primal–Dual Forms

The form of a dual problem depends on the primal’s objective (maximize or minimize), inequality directions, and sign constraints on variables. Rather than memorizing a separate rule for every combination, it helps to see a few representative primal–dual pairs side by side and notice the pattern: constraint types in one problem control variable signs in the other, and vice versa. We walk through four common cases below.

Case 1: Maximization with = constraints (standard form). When the primal constraints are equalities, we may combine them with multipliers of any sign, so the dual variables come out free. This is the form produced by adding slack variables, so it is the version most often seen inside the simplex method.

max cx s.t. Ax = b x 0

auto

min by s.t. Ay c y free

Case 2: Minimization with constraints. Duality is symmetric: a minimization primal produces a maximization dual, and the roles of b and c swap. Note how the direction of the constraints and the sign restrictions mirror the maximization case.

min bx s.t. Ax c x 0

auto

max cy s.t. Ay b y 0

Case 3: Free variables in the primal. If a primal variable is free, we lose the ability to relax its coefficient: the bound argument only works when the dual coefficients match the objective exactly. Free primal variables therefore force equality constraints in the dual.

max cx s.t. Ax b xfree

auto

min by s.t. Ay = c y 0

Case 4: Sign variations in primal variables and constraints. The remaining variations all follow from the same bounding logic. Each rule below can be checked by asking: what must be true of the multipliers for the combined constraint to bound the objective?

This shows how each component in the primal affects the dual, in particular how inequality direction and sign restrictions control the dual variable domain and constraint form.

As you can see, changing the primal’s constraints and variable domains changes the structure of the dual problem. Every such transformation has a corresponding primal-dual pair that maintains the duality principles. In each case, the weak and strong duality theorems still apply.

Learning Checkpoint 11.3.1

Without writing out a full derivation, predict the form of the dual of

min cxs.t.Ax b,x 0.

Is the dual a maximization or minimization? Are the dual variables sign-restricted or free? Are the dual constraints inequalities or equalities?

Deriving the Dual with Equality Constraints

Let us now consider a variation of our previous derivation of the dual problem. This time, our primal problem (P) will have equality constraints rather than inequalities, and all variables will remain nonnegative. For example, consider the following linear program with m = 2 equality constraints and n = 4 variables:

max 2x1 + 3x2 x3 + x4 subject to x1 + x2 + 0 x3 + x4 = 10 2x1 + x2 x3 + 0 x4 = 5 x1,x2,x3,x4 0.

In matrix form, if we let

A = [ 1 1 0 1 2 1 1 0 ],b = [ 10 5 ],c = [ 2 3 1 1 ],

our primal problem is:

max cxsubject to Ax = b,x 0.

Forming a Bound Using Combinations of Equalities

Previously, when we had inequalities, we formed upper bounds on the objective by taking nonnegative linear combinations of the constraints. Now, since we have equalities, we are free to choose any real multipliers for these constraints (positive, negative, or zero), and the resulting combination will still hold as an equality. This is because any scalar multiple of an equation remains a valid equation.

Let y1 and y2 be arbitrary real numbers, and form the linear combination:

y1(x1 + x2 + x4 = 10)andy2(2x1 + x2 x3 = 5).

Adding these together gives:

y1x1 + y1x2 + y1x4 + y2(2x1 + x2 x3) = 10y1 + 5y2.

Collecting terms by variable:

x1(y1 + 2y2) + x2(y1 + y2) + x3(y2) + x4(y1) = 10y1 + 5y2.

Since x 0, if we want the left-hand side to serve as an upper bound on our objective function 2x1 + 3x2 x3 + x4 for all feasible x, we need the coefficients of each xj in the combined inequality to dominate those in the objective. Specifically, we want:

y1 + 2y2 2,y1 + y2 3, y2 1(which implies y2 1),y1 1.

If these inequalities hold, then for every feasible x:

2x1+3x2x3+x4 (y1+2y2)x1+(y1+y2)x2+(y2)x3+(y1)x4 = 10y1+5y2.

Thus, 10y1 + 5y2 is an upper bound on the maximal value of 2x1 + 3x2 x3 + x4. Since y1 and y2 are unrestricted in sign, we can try to minimize 10y1 + 5y2 subject to ensuring these dominance conditions.

The Dual Problem

In the general setting with equality constraints and nonnegative primal variables, the dual variables associated with these equality constraints are free (they can be positive, negative, or zero). The process we followed above leads us to the dual problem:

min by = 10y 1 + 5y2

subject to the condition that Ay c, i.e.:

[ 1 2 1 1 0 1 1 0 ] [ y1 y2 ] [ 2 3 1 1 ].

In our numeric example, minimizing 10y1 + 5y2 subject to these four inequalities gives the optimal dual solution y = (2,1) with value 25; the constraints coming from x2 and x3 are tight there, while the other two hold with strict inequality. More generally, the dual problem corresponding to

max cxsubject to Ax = b,x 0

is

min bysubject to Ay c,y free.

The absence of sign restrictions on y is a direct consequence of using equalities in the primal. Since no direction of inequality is fixed, you are free to “add” or “subtract” the given equations as you please, hence no sign constraints emerge on the dual variables.

Example 11.7: Example with Inequalities and Free Variables

Now consider a primal problem with three inequality constraints and two free variables. Suppose:

max 3x1 2x2 s.t. x1 + x2 10 2x1 x2 5 x1 + 3x2 7 x1 free, x2 free

auto

min 10y1 + 5y2 + 7y3 s.t. y1 + 2y2 y3 = 3(coeff. of x1) y1 y2 + 3y3 = 2(coeff. of x2) y1,y2,y3 0

Here, x1 and x2 can be positive or negative.

We can write this in a compact matrix form. Let:

A = [ 1 1 2 1 1 3 ],b = [ 10 5 7 ],c = [ 3 2 ].

Then (P) is:

max cxsubject to Ax b, and x free.

To create a bound on 3x1 2x2, we take nonnegative combinations of the constraints. Let y1,y2,y3 0 be the multipliers for the three constraints:

y1(x1 + x2) + y2(2x1 x2) + y3(x1 + 3x2) 10y1 + 5y2 + 7y3.

Combining like terms in x1 and x2:

x1(y1 + 2y2 y3) + x2(y1 y2 + 3y3) 10y1 + 5y2 + 7y3.

We want this inequality to hold for all x1,x2 free. If y1 + 2y2 y3 > 3, then by choosing x1 large and positive, we could make the left side arbitrarily large, violating the bound. If y1 + 2y2 y3 < 3, by choosing x1 large and negative, we break the bound. The only way to always hold the inequality is to have exact equality:

y1 + 2y2 y3 = 3.

Similarly, for x2:

If y1 y2 + 3y3 > 2, we could send x2 to to break the bound. If y1 y2 + 3y3 < 2, we could send x2 to . Again, the only safe choice is equality:

y1 y2 + 3y3 = 2.

Thus, the dual constraints must be equalities. The dual problem is:

Dual (D):min 10y1 + 5y2 + 7y3 subject to y1 + 2y2 y3 = 3 y1 y2 + 3y3 = 2 y1,y2,y3 0.

From our derivation, the dual problem (D) becomes:

min by = 10y 1 + 5y2 + 7y3

subject to:

[ 1 2 1 1 1 3 ] [ y1 y2 y3 ] = [ 3 2 ],

and

y1,y2,y3 0.

Summarizing, we have

max [ 3 2 ] [ x1 x2 ] s.t. [ 1 1 2 1 1 3 ] [ x1 x2 ] [ 10 5 7 ] x1,x2 free

auto

min [ 10 5 7 ] [ y1 y2 y3 ] s.t. [ 1 2 1 1 1 3 ] [ y1 y2 y3 ] = [ 3 2 ] y1,y2,y3 0

Here we see the pattern: having x free in the primal forces the dual constraints to be equalities. In summary:

These relationships ensure that by choosing appropriate dual multipliers, we can always create a valid bound on the primal objective.

The following table can help remember the above.

Primal (min) Dual (max)
constraint 0 variable
constraint 0 variable
= constraint free variable
0 variable constraint
0 variable constraint
free variable = constraint
Table 11.1: Correspondence between primal constraint and variable types and their dual counterparts.

Complicated Dual

Consider the following primal linear program:

max 2x1 + x2 s.t. x1 + x2 = 2(1) 2x1 x2 3(2) x1 x2 1(3) x1 0,x2 free

auto

Let y1 , y2 0, y3 0 be dual variables for constraints (1), (2), and (3), respectively.

min 2y1 + 3y2 + 1y3 s.t. y1 + 2y2 + y3 2(from x1 0) y1 y2 y3 = 1(from x2 free) y1 free ,y2 0,y3 0

To derive the dual, we introduce a dual variable for each constraint:

Explanation of Dual Structure:

Summary: This example demonstrates how mixed constraint types in the primal ( =,,) lead to a dual with mixed variable sign restrictions. The primal variable bounds also affect whether dual constraints are inequalities or equalities. You need these mappings to construct dual problems correctly.

(A side note: this particular primal happens to be infeasible. Constraints (1) and (2) force x1 53, while constraints (1) and (3) force x1 32. The construction of the dual is purely syntactic and does not depend on feasibility; consistent with Theorem 11.2, the dual above turns out to be unbounded.)

Complicated Dual Derivation: A Second Look via Aggregation

Consider the following primal linear program:

maximize 2x1 + x2 subject tox1 + x2 = 2(constraint 1) 2x1 x2 3(constraint 2) x1 x2 1(constraint 3) x1 0,x2 free

We now derive the dual using the aggregation method.

Step 1: Multiply constraints by dual variables.

We introduce dual variables y1,y2,y3 corresponding to constraints 1, 2, and 3, respectively.

We aggregate the constraints by forming a linear combination:

y1(x1 + x2 = 2) + y2(2x1 x2 3) + y3(x1 x2 1)

Before combining, we must ensure every term contributes a valid inequality, because we’re maximizing in the primal and want an upper bound. So:

- Equality constraint: any multiplier is fine, so y1 - constraint: multiply by y2 0 (a nonpositive multiplier flips to ) - constraint: multiply by y3 0 (a nonnegative multiplier preserves )

Now aggregate:

y1(x1 + x2) + y2(2x1 x2) + y3(x1 x2) = (y1 + 2y2 + y3)x1 + (y1 y2 y3)x2

And the aggregated right-hand side is:

2y1 + 3y2 + 1y3

So the aggregated constraint is:

(y1 + 2y2 + y3)x1 + (y1 y2 y3)x2 2y1 + 3y2 + y3

Step 2: Ensure this constraint dominates the primal objective.

To upper-bound the primal objective 2x1 + x2, we want:

(y1 + 2y2 + y3)x1 + (y1 y2 y3)x2 2x1 + x2for all feasible x1,x2

Since x1 0, domination in the x1 coordinate means the aggregated coefficient must be at least 2. Since x2 is free, its aggregated coefficient must match the objective coefficient exactly (otherwise a large positive or negative x2 breaks the bound):

y1 + 2y2 + y3 2(coefficient on x1 0) y1 y2 y3 = 1(coefficient on x2 free)

Step 3: Formulate the dual.

The dual objective is the right-hand side of the aggregated constraint:

minimize 2y1 + 3y2 + y3

With constraints:

y1 + 2y2 + y3 2 y1 y2 y3 = 1 y2 0(from   primal constraint) y3 0(from   primal constraint) y1 (from  =  constraint)

Conclusion:

This derivation shows how:

This example illustrates how careful sign and inequality management gives rise to a valid dual that bounds the primal objective from above.

Question: What happens if variable x1 instead was constrained as x1 0?

11.4 Exercises

Warm-ups

Exercise 11.8: The Dual of a Small Bakery

  A bakery sells loaves ( x1, profit $5 each) and rolls ( x2, profit $4 each), using at most 12 units of flour and 5 units of sugar:

max 5x1 + 4x2 s.t. 2x1 + 3x2 12(flour) x1 + x2 5(sugar) x1,x2 0

1.
Write the dual linear program, introducing one dual variable per resource.
2.
Interpret each dual variable as a price per unit of its resource, as in the rival baker story: what do the two dual constraints say about loaves and rolls?
3.
Which primal data become the dual objective coefficients, and which become the dual right-hand sides?

11.1]

Exercise 11.9: Formulate the Dual

  Write the dual of the following linear program:

Maximize4x1 + 5x2 + 3x3 subject tox1 + 2x2 + x3 10 3x1 + x2 + 2x3 12 x1,x2,x3 0

11.1, §11.2]

Exercise 11.10: Verifying Weak Duality

  For the bakery problem of §11.1,

max 3x1 + 2x2s.t.x1 + x2 4,2x1 + x2 5,x1,x2 0,

with dual min 4y1 + 5y2 s.t.  y1 + 2y2 3, y1 + y2 2, y1,y2 0, consider the points x = (1,2) and y = (2,1).

1.
Check that x is primal feasible and compute its objective value.
2.
Check that y is dual feasible and compute its objective value.
3.
What sandwich does Theorem 11.1 give for the optimal value z? Confirm that the true optimum, x = (1,3) with z = 9, lies inside it.

[Theorem 11.1, §11.1]

Core problems

Exercise 11.11: Weak Duality Bound

  Consider the primal LP:

max 3x1 + 2x2 s.t. x1 + x2 4 2x1 + x2 6 x1,x2 0

1.
Write the dual problem.
2.
Verify that y = (1,1) is feasible for the dual. Compute the dual objective value by.
3.
Verify that x = (2,2) is feasible for the primal. Compute the primal objective value cx.
4.
Use weak duality to explain why the optimal value of the primal must lie between these two values.

[Theorem 11.1, §11.2]

Exercise 11.12: Dual with Mixed Constraints

  Formulate the dual of the following LP:

Maximize2x1 + 3x2 subject tox1 + x2 = 5 x1 x2 2 x1 0,x2 free

Identify the sign restrictions on each dual variable and whether each dual constraint is an inequality or an equality.

11.3]

Exercise 11.13: Shadow Prices and Dual Variables

  A bakery solves the following LP:

max 5x1 + 4x2(profit in dollars) s.t. 2x1 + x2 20(flour in kg) x1 + 2x2 18(sugar in kg) x1 + x2 13(oven capacity) x1,x2 0

The optimal primal solution is (x1,x2) = (71 3,51 3) with z = 58. The optimal dual solution is (y1,y2,y3) = (2,1,0).

1.
Verify that strong duality holds: compute by and confirm it equals z.
2.
Which constraints are binding at the optimal solution? Which are non-binding?
3.
Verify that the complementary slackness conditions are satisfied.
4.
Interpret the dual variables as shadow prices. If the bakery could acquire 1 additional kg of flour, by approximately how much would profit increase?

11.2.1, Theorem 11.2]

Concepts and connections

Exercise 11.14: Certificates in Your Own Words

  Figure 11.1 describes every dual feasible solution as a certificate.

1.
In your own words, explain what a dual feasible y certifies about the primal, and what you would show a skeptical friend to convince them, without solving the primal, that no feasible plan can earn more than a given amount.
2.
Why does the certificate argument need y 0 when the primal constraints are inequalities?
3.
Explain why hunting for the best certificate is itself a linear program, and what strong duality says about how good the best certificate is.

[Figure 11.1, §11.1, Theorem 11.2]

Exercise 11.15: Strong Duality and Infeasibility

  Consider the primal LP:

max x1 + x2 s.t. x1 x2 1 x1 + x2 3 x1,x2 0

1.
Write the dual problem.
2.
Show that the primal is infeasible by arguing that no (x1,x2) 0 can simultaneously satisfy both constraints.
3.
Is the dual feasible, infeasible, or unbounded? Explain using the strong duality theorem.

[Theorem 11.2, Example 11.3]

Challenge problems

Exercise 11.16: The Dual of the Dual is the Primal

  Consider the symmetric primal-dual pair

(P)max cx s.t. Ax b,x 0,(D)min by s.t. Ay c,y 0.

Prove that the dual of (D) is again (P). (Hint: first rewrite (D) as a maximization problem in the same symmetric form, with a new objective vector, constraint matrix, and right-hand side; then apply the definition of the dual to that problem and simplify.)

11.2, §11.3]

Selected Solutions

Solution

(Exercise 11.9) There are two constraints, so the dual has two variables y1,y2 0, one per constraint. Each of the three primal variables produces a dual constraint whose right-hand side is that variable’s objective coefficient:

Minimize10y1 + 12y2 subject toy1 + 3y2 4 2y1 + y2 5 y1 + 2y2 3 y1,y2 0.

Solution

(Exercise 11.11) The dual is min 4y1 + 6y2 subject to y1 + 2y2 3, y1 + y2 2, y1,y2 0. For y = (1,1): 1 + 2 = 3 3 and 1 + 1 = 2 2, so y is dual feasible with objective 4(1) + 6(1) = 10. For x = (2,2): 2 + 2 = 4 4 and 4 + 2 = 6 6, so x is primal feasible with objective 3(2) + 2(2) = 10. By weak duality, every primal value is at most every dual value, so the optimal value z satisfies 10 z 10. Since the two bounds coincide, both solutions are in fact optimal and z = 10.

Solution

(Exercise 11.16) Rewrite (D) in symmetric maximization form. Minimizing by is the same as maximizing (b)y, and the constraints Ay c are equivalent to (A)y c. So (D) is

max (b)ys.t.(A)y c,y 0,

which is the symmetric form with objective vector c~ = b, matrix à = A, and right-hand side b~ = c. Its dual, by definition, is

min b~zs.t.Ãz c~,z 0,

that is, min (c)z subject to (A)z b, z 0. Multiplying the objective and the constraints by 1 turns this into

max czs.t.Az b,z 0,

which is exactly (P) with z in place of x. Hence the dual of the dual is the primal.

11.5 Complementary Slackness

So far, we have established that the primal and dual problems are closely linked, and their optimal objective values coincide under strong duality. However, how can we identify optimal solutions for both problems simultaneously? The answer lies in complementary slackness, the condition we use to verify optimality.

11.5.1 Definition of Complementary Slackness

Definition 11.17: Complementary Slackness

Complementary slackness conditions state that if x and y are optimal solutions for the primal and dual problems, then the following must hold:

1.
For each primal constraint i, the constraint is tight, or the corresponding dual variable is zero (or both):
either aix = b ioryi = 0,i.

Equivalently,

yi(a ix b i) = 0.
2.
For each dual constraint j, the constraint is tight, or the corresponding primal variable is zero (or both):
either (Ay) j = cjorxj = 0,j.

Equivalently,

xj(c j (Ay) j) = 0.

Together, these conditions ensure that at optimality, only the active constraints have positive dual variables, and only the active dual constraints have positive primal variables.

Theorem 11.18: Primal Dual Optimality

A primal solution x and a dual solution y are optimal if and only if:

1.
x is feasible in the primal problem.
2.
y is feasible in the dual problem.
3.
Complementary slackness holds between the primal and dual solutions.

This set of conditions allows us to efficiently check whether a given solution is optimal without needing to compare all feasible solutions explicitly.

11.5.2 Interpreting Complementary Slackness

Complementary slackness provides a way to determine which constraints are binding at the optimal solution. If we solve either the primal or the dual problem, we can use these conditions to deduce the optimal solution of the other problem.

Example 11.19: The Bakery Problem Revisited

Consider the bakery problem from the previous section. Recall the primal and dual formulations:

Primal Problem:

max 3x1 + 2x2 subject to x1 + x2 4(flour constraint) 2x1 + x2 5(sugar constraint) x1,x2 0.

Dual Problem:

min 4y1 + 5y2 subject to y1 + 2y2 3 y1 + y2 2 y1,y2 0.

Suppose we are given the optimal solutions:

x1 = 1,x 2 = 3,y 1 = 1,y 2 = 1.

To verify optimality, we check complementary slackness:

1.
The first constraint in the primal ( x1 + x2 4) is tight ( 1 + 3 = 4), so y1 can be positive.
2.
The second constraint ( 2x1 + x2 5) is tight ( 2(1) + 3 = 5), so y2 can be positive.
3.
Checking the dual constraints: y1 + 2y2 = 1 + 2(1) = 3,(tight, so x1 > 0 is allowed) y1 + y2 = 1 + 1 = 2,(tight, so x2 > 0 is allowed).

Since complementary slackness holds, the given values are indeed optimal solutions.

11.5.3 Using Complementary Slackness to Solve Problems

Often, we do not have full information about an optimal solution. Instead, we might have partial information or only one of the optimal solutions (primal or dual). Complementary slackness allows us to deduce missing information.

Example 11.20: Finding Missing Dual Variables

Suppose we solve the primal problem and find the optimal solution:

x1 = 1,x 2 = 3.

Using complementary slackness, we determine y:

Solving the system:

y1 + 2y2 = 3, y1 + y2 = 2.

Solving for y1 and y2 gives y1 = 1,y2 = 1.

Thus, complementary slackness allowed us to determine the dual solution directly from the primal solution.

11.5.4 Summary of Key Takeaways

Learning Checkpoint 11.5.1

At an optimal solution of the bakery problem, suppose two units of flour are left over (the flour constraint is not tight). What does complementary slackness say about the shadow price of flour? Explain in one sentence why this makes economic sense.

Bakery 2.0 Example Revisited

Example 11.21: Verifying Optimality with Complementary Slackness

We are given the primal and dual optimal solutions:

We will verify that these satisfy complementary slackness.

Step 1: Check tightness of primal constraints

Step 2: Check tightness of dual constraints where xj > 0

Since all complementary slackness conditions are satisfied, both solutions are optimal and duality holds (objective values match at 780).

Example 11.22: Recovering Dual Variables via Complementary Slackness

Suppose we only know the optimal primal solution:

x1 = 4,x2 = 0,x3 = 6.

We use complementary slackness to recover the optimal dual solution.

Step 1: Use tightness conditions from primal

Step 2: Use slackness in primal constraints to find zero dual variables

Step 3: Substitute y1 = 0 into equations (1) and (2):

y2 + y3 = 90 (1’) y2 + 0.5y3 = 70 (2’)

Step 4: Solve the system

Subtract (2’) from (1’):

(y2 + y3) (y2 + 0.5y3) = 90 70 0.5y3 = 20 y3 = 40

Substitute back into (1’): y2 + 40 = 90 y2 = 50

Result: y1 = 0,y2 = 50,y3 = 40

Thus, the dual solution is fully recovered using complementary slackness.

11.6 Exercises

Warm-ups

Exercise 11.23: Checking the Conditions

  Consider the primal-dual pair

max 4x1 + 3x2 s.t. x1 + x2 6 2x1 + x2 10 x1,x2 0 min 6y1 + 10y2 s.t. y1 + 2y2 4 y1 + y2 3 y1,y2 0

and the candidate solutions x = (4,2) and y = (2,1).

1.
Verify that x is primal feasible and y is dual feasible.
2.
Write out all four complementary slackness conditions for this pair and check each one.
3.
Conclude that both solutions are optimal, and confirm by computing both objective values.

[Example 11.19, §11.5]

Core problems

Exercise 11.24: Bakery Production and Duality Interpretation

  A bakery produces cakes ( x1), cookies ( x2), and muffins ( x3) to maximize profit:

maximize90x1 + 40x2 + 70x3

Subject to the following resource constraints:

The optimal primal solution is:

x1 = 4,x2 = 0,x3 = 6

Dual Linear Program:

minimize40y1 + 10y2 + 7y3
subject to5y1 + y2 + y3 90 4y1 + y2 + y3 40 y1 + y2 + 0.5y3 70 y1,y2,y3 0

The optimal dual solution is:

y1 = 0,y2 = 50,y3 = 40

Answer the following questions:

1.
Feasibility Check: Verify that the primal solution satisfies all constraints. Then check that the dual solution satisfies all dual constraints.
2.
Complementary Slackness: Determine which constraints are tight in the primal and which are tight in the dual. Use complementary slackness to verify consistency between the primal and dual optimal solutions.
3.
Objective Value Check: Compute the primal and dual objective values using the given solutions and verify that they are equal.
4.
Economic Interpretation (Shadow Prices): Using the dual solution (y1,y2,y3), interpret the shadow price of each resource (flour, sugar, baking time). For example, what does y2 = 50 tell you about the value of an additional kg of sugar?
5.
Sensitivity Analysis: How would the optimal profit change if you had:
(a)
One more kg of flour?
(b)
One more kg of sugar?
(c)
One more hour of baking time?

Use the shadow prices to justify your answers.

[Example 11.21, §11.5]

Exercise 11.25: Box Constraints and a Dual Certificate

  Consider the optimization problem

max x1 + 4x2 + 9x3 + 16x4 s.t. x1 1  (Constraint 1) x2 1  (Constraint 2) x3 1  (Constraint 3) x4 1  (Constraint 4) x1 + 2x2 + 3x3 + 4x4 8  (Constraint 5)

x1 0,x2 0,x3 0,x4 0

(a.) What is the dual of this linear program?

(b.) Explain how the dual can be used to prove that a solution is optimal.

(c.) The optimal solution to this linear program is (x1,x2,x3,x4) = (0, 1 2,1,1) with objective value 27.

Using duality theory, prove that this is an optimal solution.
(Hint: Recall that complementary slackness implies that dual variables corresponding to constraints 1 and 2 must be 0).

[Theorem 11.1, Theorem 11.18]

Exercise 11.26: Deducing the Primal from a Dual Guess

  Consider the following primal-dual pair:

Primal Problem:

Maximize5x1 + 4x2 subject to2x1 + x2 8 x1 + 3x2 9 x1,x2 0

Dual Problem:

Minimize 8y1 + 9y2 subject to2y1 + y2 5 y1 + 3y2 4 y1,y2 0

(a) Suppose you are given a candidate dual solution y = (1,1). Use complementary slackness to determine the values of x1 and x2.

(b) Is the resulting primal solution feasible?

(c) Does complementary slackness hold? Is this a valid optimal solution pair?

[Example 11.20, §11.5.3]

Concepts and connections

Exercise 11.27: A Positive Price on a Slack Constraint

  A classmate solves a primal-dual pair of linear programs and reports a primal feasible x and a dual feasible y. In their report, the second primal constraint has slack at x (its left-hand side is strictly below b2), and yet the dual price is y2 = 3 > 0. They claim both solutions are optimal.

1.
What can you conclude, and from which theorem?
2.
Does your conclusion mean x is not optimal? Does it mean y is not optimal? Be precise about exactly what is ruled out.
3.
Explain the economic absurdity of a positive price on a resource that is not fully used.

[Theorem 11.18, §11.5]

Exercise 11.28: Disproving a Claimed Optimum

  Suppose a linear program has the following primal and dual formulations:

Primal:

Maximize3x1 + 2x2 subject tox1 + x2 4 2x1 + x2 5 x1,x2 0

Dual:

Minimize 4y1 + 5y2 subject toy1 + 2y2 3 y1 + y2 2 y1,y2 0

A student claims that the optimal primal solution is x1 = 2,x2 = 0.

(a) Write down the complementary slackness conditions for this problem.

(b) Assuming the student’s claim, use the conditions to derive requirements on y1 and y2.

(c) Show that no feasible dual solution satisfies these requirements, and conclude that the student’s claimed solution cannot be optimal. What is the actual optimal solution?

[Theorem 11.18, §11.5.3]

Challenge problems

Exercise 11.29: Meal Kit Optimization and Duality

  You are the operations manager at a startup that assembles and ships healthy meal kits. Each kit appeals to different customer preferences: vegetarian, high-protein, quick-prep, etc. You want to decide how many of each kit to produce today to maximize profit.

There are six meal kit options:




Variable Description Profit per Kit



x1 Classic Chicken $3
x2 Vegan Delight $2
x3 Protein Boost $4
x4 Quick & Light $1
x5 Gourmet Chef Special $5
x6 Breakfast Box $2



Table 11.2: The six meal kit options and the profit per kit.

Each kit requires time in two key areas:

Your available resources:




Meal Kit Kitchen Time Packaging Time



x1: Classic Chicken 1 2
x2: Vegan Delight 2 0
x3: Protein Boost 1 0
x4: Quick & Light 0 1
x5: Gourmet Chef Special 1 3
x6: Breakfast Box 0 1



Table 11.3: Kitchen and packaging time required per meal kit.

The primal linear program is:

maximize 3x1 + 2x2 + 4x3 + x4 + 5x5 + 2x6 subject to x1 + 2x2 + x3 + x5 10 2x1 + x4 + 3x5 + x6 12 x1,x2,x3,x4,x5,x6 0

Answer the following:

1.
Formulate the dual linear program. Identify what each dual variable represents and write down the dual objective and constraints explicitly.
2.
Graphically solve the dual problem. Plot the dual constraints in y1- y2 space and identify the feasible region. Use level curves to determine the optimal solution.
3.
Economic interpretation. Describe the meaning of the dual solution in terms of the value of your resources.
4.
Use complementary slackness to determine the basic variables in the primal. Based on the optimal dual solution and complementary slackness, identify which constraints in the primal are tight and hence which variables are basic.
5.
Recover an optimal primal solution. Use the tight constraints and system of equations to solve for the primal basic variables and compute the optimal objective value.

11.5.3, §11.2.1]

Exercise 11.30: Duality with Mixed Constraint Types: Eco-Friendly Packaging Startup

  You are managing production at an eco-friendly packaging startup. Your team produces various biodegradable container sets for local farms and grocery stores. Each set is assembled using labor and recycled material.

You produce three types of packaging sets:




Variable Packaging Set Type Retail Price



x1 FreshBox Standard $6
x2 FreshBox Premium $9
x3 Market Crate $8



Table 11.4: Packaging set types and retail prices.

You must manage the use of three critical resources:

The profit per unit for each set is:



Packaging Set Profit per Unit


x1: FreshBox Standard $4
x2: FreshBox Premium $6
x3: Market Crate $5


Table 11.5: Profit per unit for each packaging set.

The retail revenue constraint is:

6x1 + 9x2 + 8x3 80

The resource requirements for each packaging set are:




Packaging Set Labor Material



x1: FreshBox Standard 2 4
x2: FreshBox Premium 4 6
x3: Market Crate 3 4



Table 11.6: Labor and material required per packaging set.

The primal linear program is:

maximize 4x1 + 6x2 + 5x3 subject to2x1 + 4x2 + 3x3 140(Labor) 4x1 + 6x2 + 4x3 = 240(Material) 6x1 + 9x2 + 8x3 80(Retail Revenue Commitment) x1,x2,x3 0

Tasks:

1.
Formulate the dual linear program. Carefully handle the signs of each constraint and variable in the dual. What does each dual variable represent? What type of constraint does each dual constraint become?
2.
Solve the dual graphically or using software. If the dual is two-dimensional, solve it by plotting its feasible region and finding the optimal value. Otherwise, use a solver like PuLP or graphical analysis of intersections.
3.
Use complementary slackness. Based on the optimal dual solution, determine which primal constraints are tight. Use this to identify likely basic variables in the optimal primal solution.
4.
Recover the optimal primal solution. Solve the resulting system using the tight constraints to find the primal solution, and compute the optimal total profit.

11.3, §11.5.3]

Selected Solutions

Solution

(Exercise 11.24)

1.
Feasibility: Substituting (x1,x2,x3) = (4,0,6): flour 5(4) + 4(0) + 6 = 26 40, sugar 4 + 0 + 6 = 10 10, baking time 4 + 0 + 0.5(6) = 7 7, so the primal solution is feasible. Substituting (y1,y2,y3) = (0,50,40): the dual constraints evaluate to 90 90, 90 40, and 70 70, so the dual solution is feasible.
2.
Complementary slackness: In the primal, sugar and baking time are tight while flour has slack ( 26 < 40); accordingly y1 = 0 while y2,y3 > 0. In the dual, constraints 1 and 3 are tight while constraint 2 has slack ( 90 > 40); accordingly x2 = 0 while x1,x3 > 0. Every condition yi(aix bi) = 0 and xj(cj (Ay)j) = 0 is satisfied.
3.
Objective values: Primal: 90(4) + 40(0) + 70(6) = 780. Dual: 40(0) + 10(50) + 7(40) = 780. They match, confirming optimality by strong duality.
4.
Shadow prices: Flour has shadow price y1 = 0: with 14 kg left over, more flour is worthless. Sugar has shadow price y2 = 50: one more kg of sugar would increase profit by $50. Baking time has shadow price y3 = 40: one more oven hour is worth $40.
5.
Sensitivity: (a) One more kg of flour: no change ($0). (b) One more kg of sugar: profit increases by $50. (c) One more hour of baking time: profit increases by $40. These estimates are valid for small changes in the right-hand sides (as long as the optimal basis does not change).

Solution

(Exercise 11.25) (a) The dual is

min y1 + y2 + y3 + y4 + 8y5 s.t. y1 + y5 1,y2 + 2y5 4,y3 + 3y5 9,y4 + 4y5 16, y1,,y5 0.

(b) By weak duality, every dual feasible y gives an upper bound by on the primal objective. If we exhibit a primal feasible x and a dual feasible y whose objective values are equal, both must be optimal.

(c) At x = (0, 1 2,1,1), constraints 1 and 2 have slack ( 0 < 1 and 1 2 < 1), so y1 = y2 = 0. Since x2,x3,x4 > 0, dual constraints 2, 3, 4 must be tight: 2y5 = 4 gives y5 = 2; then y3 = 9 3(2) = 3 and y4 = 16 4(2) = 8. The remaining dual constraint holds with slack: y1 + y5 = 2 1, consistent with x1 = 0. So y = (0,0,3,8,2) is dual feasible with objective 3 + 8 + 8(2) = 27, matching the primal value 4(1 2) + 9 + 16 = 27. By part (b), both solutions are optimal.

Solution

(Exercise 11.28) (a) The conditions are y1(x1 + x2 4) = 0, y2(2x1 + x2 5) = 0, x1(y1 + 2y2 3) = 0, and x2(y1 + y2 2) = 0.

(b) At (x1,x2) = (2,0): the first primal constraint gives 2 < 4 (slack), forcing y1 = 0; the second gives 4 < 5 (slack), forcing y2 = 0. But x1 = 2 > 0 requires the first dual constraint to be tight: y1 + 2y2 = 3.

(c) With y1 = y2 = 0 we get 0 = 3, a contradiction: no dual solution is compatible, so (2,0) is not optimal. (It is feasible, but both constraints have slack, so we can do better.) The actual optimum is (x1,x2) = (1,3) with value 9: both primal constraints are tight, and solving y1 + 2y2 = 3, y1 + y2 = 2 gives the dual optimum y = (1,1) with matching value 4(1) + 5(1) = 9.

Summary: Why Learn Duality?

Most students and practitioners rarely write down the dual linear program explicitly. However, understanding duality is essential to interpreting the output of optimization solvers and making informed decisions.

In practice, you solve the primal LP, but the solver uses duality internally and reports the dual variables as shadow prices on each constraint: how much the objective would improve if you relaxed that constraint by one unit. The economic meaning of those numbers, the reasoning behind zero versus nonzero values, and the marginal value of resources all rest on the duality concepts developed in this chapter: dual feasibility, strong duality, and complementary slackness. Shadow prices also support rapid “what-if” sensitivity analysis, letting you estimate the impact of changing a right-hand side without re-solving the LP.

As a small illustration, consider the LP below alongside typical solver output:

Primal LP:

max 50x1 + 20x2 s.t. 2x1 + x2 90(Labor) x1 + x2 70 (Material) x1,x2 0
Solver Output:

Without ever writing the dual, the solver output already speaks its language: labor is the scarce resource (an extra hour is worth $25), while material is not fully used (only 45 of the 70 units are consumed, so its shadow price is zero, exactly what complementary slackness predicts).

For students continuing in optimization, operations research, or algorithms, duality returns as a core idea behind decomposition methods (e.g., Benders, Dantzig–Wolfe), primal-dual interior point methods, approximation algorithms, and large-scale optimization.

© 2026 Robert Hildebrand and contributors · Licensed CC BY-SA 4.0 · Sources and attribution · Book home