443. Multi-Echelon

Relax one dimension from basic EOQ: number of echelons is no longer one. Inventory is held at multiple stages of a supply chain (warehouse → retailer, supplier → factory → distributor, etc.). Orders cascade up the chain, and each stage has its own setup and holding costs.

Key concept: echelon inventory at each stage, count not just on-hand but also all downstream inventory you’ve already paid to put in motion.

443.0.1. Setup (two-echelon: warehouse retailer)

The retailer pulls from the warehouse every 𝑇𝑟. The warehouse re-orders from the upstream supplier every 𝑇𝑤. Nesting requirement: 𝑇𝑤 must be an integer multiple of 𝑇𝑟 (otherwise the warehouse stocks fractionally, which is wasteful).

443.0.2. Cost model

Annual cost = sum across stages:

TC(𝑇𝑟,𝑇𝑤)=𝑆𝑟𝑇𝑟+𝑟𝑑𝑇𝑟2retailer+𝑆𝑤𝑇𝑤+𝑤𝑑𝑇𝑤2warehouse

Constraint: 𝑇𝑤=𝑘𝑇𝑟 for some integer 𝑘1.

443.0.3. Unconstrained optimum (relax integer 𝑘)

If we ignored nesting, each stage would independently optimize:

𝑇𝑟basic=2𝑆𝑟𝑟𝑑𝑇𝑤basic=2𝑆𝑤𝑤𝑑

This is just basic EOQ at each stage. But a non-integer ratio 𝑇𝑤/𝑇𝑟 wastes capacity — the warehouse would carry partial cycles. Nesting is required for clean operation.

443.0.4. Roundy’s power-of-two policies

Restrict cycle times to powers of two of a base period: 𝑇𝑖=2𝑘𝑖𝑇0 for integer 𝑘𝑖0, where 𝑇0 is fixed (e.g., 1 day).

Then any two cycles are nested: a stage with 𝑘𝑖=3 orders 8 base periods; another with 𝑘𝑖=5 orders every 32 base periods the second is always a multiple of the first.

Roundy’s 98% theorem: the best power-of-two policy achieves at least 98% of the unconstrained optimum (worst-case cost ratio 2/ln(2)/(1+1/2)1.06). So a 6% penalty is the worst case for using powers of two.

443.0.5. Algorithm

  1. Compute unconstrained 𝑇𝑖basic at each stage.
  2. Round each to the nearest power of two: 𝑇𝑖=2𝑘𝑖𝑇0 where 𝑘𝑖=round(log2(𝑇𝑖basic/𝑇0)).
  3. Compute resulting cost TC and verify it’s within 6% of 𝑖2𝑆𝑖𝑖𝑑.

443.0.6. Final formulas (two-stage, nested with 𝑇𝑤=𝑘𝑇𝑟)

Substitute 𝑇𝑤=𝑘𝑇𝑟 into TC:

TC(𝑇𝑟,𝑘)=𝑆𝑟+𝑆𝑤/𝑘𝑇𝑟+(𝑟+𝑘𝑤)𝑑𝑇𝑟2

Optimize over 𝑇𝑟 for fixed 𝑘:

𝑇𝑟(𝑘)=2(𝑆𝑟+𝑆𝑤/𝑘)(𝑟+𝑘𝑤)𝑑TC(𝑘)=2(𝑆𝑟+𝑆𝑤/𝑘)(𝑟+𝑘𝑤)𝑑

Now optimize over integer 𝑘1 — small search (typically 𝑘{1,2,4,8}).

Example

Given (two-echelon: warehouse retailer):

  • Retail demand: 𝑑=12000 units/year
  • Retailer: 𝑆𝑟 = $50 / order, 𝑟 = $2 / unit / year
  • Warehouse: 𝑆𝑤 = $200 / order, 𝑤 = $1 / unit / year (echelon — added cost over nothing)

Step 1 — unconstrained 𝑇𝑖basic at each stage

𝑇𝑟basic=2502120000.0645yr24days𝑇𝑤basic=22001120000.1826yr67days

Ratio 𝑇𝑤basic𝑇𝑟basic67/242.83 — roughly 3, but not an integer.

Step 2 — search nested integer 𝑘

Try 𝑘=1,2,3,4:

TC(𝑘)=2(𝑆𝑟+𝑆𝑤/𝑘)(𝑟+𝑘𝑤)𝑑:

𝑘𝑆𝑟+𝑆𝑤/𝑘𝑟+𝑘𝑤TC(𝑘)
150 + 200 = 2502 + 1 = 322503120004243
250 + 100 = 1502 + 2 = 421504120003795
350 + 67 = 1172 + 3 = 521175120003742
450 + 50 = 1002 + 4 = 621006120003795

Optimal 𝑘=3 (warehouse cycle is 3× the retailer cycle).

Step 3 — cycle times at 𝑘=3

𝑇𝑟=2(50+200/3)(2+31)12000=21175120000.0625yr23days𝑇𝑤=3𝑇𝑟68days

Order quantities: retailer 𝑄𝑟=𝑑𝑇𝑟750, warehouse 𝑄𝑤=𝑑𝑇𝑤2280.

Step 4 — compare to basic EOQ at each stage independently

Treating the two stages independently (no nesting):

  • Retailer: TC𝑟=2502120001549
  • Warehouse: TC𝑤=22001120002191
  • Sum (independent): $3740/year

Multi-echelon nested: TC(3)3742.

They almost coincide! The 6% Roundy bound is achieved here at 0.05% — the integer-𝑘 constraint costs almost nothing because 𝑇𝑤basic/𝑇𝑟basic2.83 was already close to a small integer (3). This is the Roundy theorem at work: with two stages, the worst-case nesting penalty is bounded by 6%, and in practice it’s usually much less.

The deeper takeaway: power-of-two policies generalize this beyond two stages — at any number of echelons, restrict each cycle to 𝑇𝑖=2𝑘𝑖𝑇0 and the worst-case penalty stays below 6%. Predictable, nestable, near-optimal.