425. Clark-Scarf
The foundational result for stochastic multi-echelon inventory in serial systems (Clark & Scarf 1960). Shows that the multi-echelon problem decomposes into independent single-echelon problems — one per stage, each solved as a newsvendor-like base-stock problem with an induced penalty cost.
425.1. Setup: serial system
Stages numbered (most upstream) to (most downstream = retailer). Customer demand hits stage only. Each stage:
- Holds inventory
- Receives shipments from upstream stage with lead time
- Ships to downstream stage
- Stage also faces backorder cost per unit per period
Holding cost rates: at stage (assume — inventory is more expensive downstream where it carries more added value).
425.2. Echelon stock
Define echelon stock at stage :
— what’s at stage plus everything below it. Holding cost on echelon stock is incremental:
(with ). This is the marginal holding cost as inventory moves from stage to stage .
425.3. Optimal policy: echelon base-stock
The optimal policy is echelon base-stock: at each review, stage orders to bring its echelon stock up to a target .
The Clark-Scarf decomposition shows that at each stage solves a single-stage newsvendor problem with:
- Demand: lead-time demand from the most upstream (stage 1) feeding through
- Underage cost: an induced penalty that propagates upstream
- Overage cost: (incremental echelon holding cost)
425.4. Induced penalty
The recursion (downstream → upstream):
Formally: each stage’s penalty depends on the optimal cost-to-go from downstream — a backward DP. The decomposition magic is that, despite this coupling, the form of each stage’s optimal policy is base-stock with parameters depending only on local data + the induced penalty.
425.5. Worked sketch (2-stage)
Stages: warehouse (1) → retailer (2). lead times. . Backorder cost at retailer.
Retailer (stage 2): classical newsvendor with critical ratio . Solve for .
Warehouse (stage 1): newsvendor with critical ratio where is the expected cost the warehouse imposes on the retailer when warehouse stockouts cause retailer delays.
425.6. Penalty-function recursion
For this construction, index stages = downstream (demand-facing) to = upstream (vendor) — the reverse of the setup above.
Consider a serial system with stages, where stage faces stochastic customer demand and each is replenished from stage with deterministic lead time :
Solve stages . Each stage does three things:
- receives the penalty function from below
- solves its own newsvendor balance
- produces a new penalty function to pass up
Base case (stage 1). No stage below it, so . Stage 1′s expected cost as a function of its echelon level :
where is demand over the lead-time window. This is convex; its minimizer is the fractile:
Inductive step (stage ). Stage has received from below. Its cost combines its own echelon holding with the penalty it inflicts downstream when it can’t fully supply:
Minimize over to get .
Produce the penalty to pass up. The clamp-and-floor operation:
Zero when (stage isn’t constrained), positive and rising as drops below . Hand to stage .
Example: 3-stage serial system
Stage 1. Window , fractile , :
Stage 2. Window , fractile , :
Stage 3. Window , fractile , :
The local stock held at each stage is the echelon-difference: at stage 3, at stage 2, at stage 1.
The fractile formula with window is the exact stage-1 newsvendor and a standard approximation upstream. The exact Clark-Scarf come from minimizing numerically, since isn’t a clean newsvendor cost.
# pip install stockpyl
from stockpyl.ssm_serial import optimize_base_stock_levels
# Nodes indexed 1=downstream(demand-facing) ... 3=upstream(vendor-facing)
S_star, C_star = optimize_base_stock_levels(
num_nodes=3,
echelon_holding_cost=[3, 2, 1], # h_1, h_2, h_3
stockout_cost=27, # p, charged at downstream node
lead_time=[1, 1, 2], # L_1, L_2, L_3 (into each stage)
demand_mean=10,
demand_standard_deviation=2,
)
print(S_star) # exact echelon base-stock levels
print(C_star) # optimal expected cost425.7. Why echelon stocks decouple the problem
If stage ’s order pulls from infinite supply (or upstream is always available), each stage is independent. Real life: upstream isn’t always available. The induced penalty charges upstream for the downstream cost of its stockouts — capturing the coupling exactly.
425.8. Limitations
- Serial systems only: pure chains, no branching
- Stationary demand: i.i.d. demand each period
- Costly to compute for many stages and long horizons
For general networks, see Graves-Willems guaranteed-service.
425.9. See also
- Multi-Echelon — overview
- Graves-Willems — alternative for general networks
- Base Stock Policy
- Newsvendor