Proposition 2 — algorithm AllocOpt solves the allocation optimization (7.22)
ProvedServiceParts.Allocation.allocOpt_correctLet the data of Section 7.4 satisfy its standing assumptions (see AllocData): locations with , integer gridpoints with for and for location , values of convex functions at the gridpoints, the slopes of (7.19), the piecewise linear functions of (7.20)–(7.21), and a convex function on .
Then Algorithm AllocOpt (Definition 4), run with any rule for breaking ties in its steps, terminates with values that satisfy (7.22) for every :
In words, marginal allocation — repeatedly giving the next block of units to the location whose current marginal cost is smallest — solves the separable convex piecewise linear allocation problem exactly, simultaneously for every target total . In Section 7.3 this computes the nested cost functions (7.14), (7.15) and (7.17) of the multi-echelon pooling model.
Formalization Note The book's Proposition 2 also bounds the number of calculations by ; that half is not stated (an operation count with no machine model). The minimum is stated as (a) some feasible integer allocation attains the value and (b) no feasible integer allocation has a smaller value. Termination is structural in Lean (see AllocOpt). The tie-breaking rule is universally quantified; the book leaves it open.
import Mathlib import Definitions.Def_ServiceParts_Allocation_AllocData import Definitions.Def_ServiceParts_Allocation_AllocOpt
namespace ServiceParts.Allocation
/-- Muckstadt (2005), Proposition 2, p. 179 (correctness half): algorithm AllocOpt
(Definition 4) terminates with values `c^0_k` satisfying (7.22) for each `k ∈ N₀`:
`c^0_k = f(r^0_k) + min { Σ_{m ∈ M} Ĉ_m(r_m) : r_m ≥ 0 integer, Σ_{m ∈ M} r_m = r^0_k }`.
The minimum is stated as attainment plus lower bound. Termination is structural in Lean.
Stated for every tie-breaking rule of the arg min. -/
theorem allocOpt_correct {Mbar : ℕ} (d : AllocData Mbar) (hd : d.WellFormed)
(sel : (Fin Mbar → ℝ) → Fin Mbar) (hsel : IsArgminRule sel)
(k : ℕ) (hk : k ≤ d.n0) :
(∃ r : Fin Mbar → ℕ, ∑ m, (r m : ℤ) = d.grid0 k ∧
d.allocOpt sel k = d.f (d.grid0 k) + ∑ m, d.pwl m (r m)) ∧
∀ r : Fin Mbar → ℕ, ∑ m, (r m : ℤ) = d.grid0 k →
d.allocOpt sel k ≤ d.f (d.grid0 k) + ∑ m, d.pwl m (r m) := by sorry
end ServiceParts.Allocation
Confirmed by the mission captain (proposal self-audit).
Confirmed by the moderator at approval.