flowchart RL
S([Supplier]) --> W[Stage 2<br/>warehouse]
W --> R[Stage 1<br/>store]
R --> C([Customers])
A shared resource leaves the cost functions separate and adds a constraint.
A shared setup couples the cost functions and leaves the items unconstrained.
An echelon structure couples them end to end: one stock exists in order to replenish another.
And it needs its accounting fixed before either earlier technique can be applied at all.
flowchart RL
S([Supplier]) --> W[Stage 2<br/>warehouse]
W --> R[Stage 1<br/>store]
R --> C([Customers])
Stage 1 faces the customer. Stage 2 replenishes stage 1. Arrows point the way a requirement travels.
Both stages hold stock. Both place orders. Both incur holding cost.
That last sentence contains the problem.
Suppose we charge each stage its own installation holding rate, \(h_i\).
A unit sitting at the store has already passed through the warehouse. The money tied up in it was already being charged upstream.
Charging every stage its installation rate counts the same money at every stage the unit has passed through.
The fix is to charge each stage only for the value it adds.
Echelon stock of a location is everything at that location together with everything downstream of it.
The echelon holding rate is the value added at that stage:
\[ h'_i = h_i - h_{i+1} \]
with \(h'_n = h_n\) at the most upstream stage.
These telescope: \(h'_1 + h'_2 + \cdots + h'_n\) recovers \(h_1\), the full installation rate at the customer-facing stage.
A two-stage chain, nested, \(T_1 = \tfrac{1}{2}T_2\), \(\lambda = 100\), \(T_1 = 1/2\) year, so \(Q_1 = 50\) and \(Q_2 = 100\).
Installation rates \(h_1 = \$2.00\), \(h_2 = \$1.20\). So \(h'_1 = \$0.80\) and \(h'_2 = \$1.20\).
Stage 1 on hand is an ordinary sawtooth: \(\bar{I}_1 = Q_1/2 = 25\).
Stage 2 on hand is not. It receives \(Q_2\), ships \(Q_1\) downstream at once, holds the remainder until stage 1 reorders, and is then empty:
\[ \bar{I}_2 = \frac{(Q_2 - Q_1)T_1}{T_2} = 25 \]
Stage 2 echelon stock is a clean sawtooth of height \(Q_2\): \(\bar{I}^{\,e}_2 = 50\).
| Accounting | Term | Average | Rate | Cost rate |
|---|---|---|---|---|
| Installation | stage 1 | 25 | $2.00 | $50.00 |
| stage 2 | 25 | $1.20 | $30.00 | |
| total | $80.00 | |||
| Echelon | stage 1 | 25 | $0.80 | $20.00 |
| stage 2 | 50 | $1.20 | $60.00 | |
| total | $80.00 |
Perform this check every time echelon rates are introduced. It catches a sign error in \(h'_i = h_i - h_{i+1}\) immediately.
Installation accounting charges the two stages $50 and $30.
Echelon accounting charges them $20 and $60.
Echelon accounting moves cost upstream, because stage 2’s echelon stock includes what stage 1 is holding.
Echelon accounting reassigns cost between stages and preserves the total.
That is the licence to use it. No money is invented or lost.
And in exchange, one awkward rectangle becomes a sawtooth, so every stage looks like an EOQ.
Now \(n\) stages, \(n \to \cdots \to 1\), every stage seeing the same \(\lambda\).
\[ \min \; \sum_{i}\left[\frac{k_i}{T_i} + g_iT_i\right] \]
subject to \(T_i = 2^{\ell_i}T\) and, crucially,
\[ T_i \ge T_{i-1} \]
\[ T_i \ge T_{i-1} \]
Whenever a stage orders, every stage below it orders too. No stage can replenish more often than the one it supplies.
Nestedness keeps work in process from piling up between stages.
With power-of-two intervals it comes for free, because any two powers of two divide one another.
Drop the power-of-two restriction and keep nesting: that is the relaxation we solve first.
Without nesting, each stage separates and takes \(T_i = \sqrt{k_i/g_i}\).
So the constraint binds exactly when those intervals fail to increase up the chain.
The key structural fact: stages that would violate the constraint are merged into a block and share one interval.
\[ T(r) = \sqrt{\frac{k(G_r)}{g(G_r)}} \]
using the block’s totals. Which is the same formula again, one level up.
\(\lambda = 500\) per year, weekly base period.
| Stage \(i\) | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| \(k_i\) | $10 | $12 | $25 | $7 | $2 |
| \(h_i\) | $0.60 | $0.50 | $0.35 | $0.10 | $0.05 |
| \(h'_i = h_i - h_{i+1}\) | 0.10 | 0.15 | 0.25 | 0.05 | 0.05 |
| \(g_i = \tfrac{1}{2}\lambda h'_i\) | 25 | 37.5 | 62.5 | 12.5 | 12.5 |
| \(k_i/g_i\) | .400 | .320 | .400 | .560 | .160 |
Stage by stage the intervals are 0.632, 0.566, 0.632, 0.748, 0.400 years.
Not nondecreasing. Stage 2 would order less often than stage 1 supplies, and stage 5 less often than anything below it. Infeasible.
Walk up the chain, absorbing a stage when it wants a shorter interval than the current block.
| \(i\) | Block ratio | \(k_i/g_i\) | Action |
|---|---|---|---|
| 2 | \(10/25 = .400\) | \(12/37.5 = .320\) | \(.400 > .320\), absorb: \(G_1 = \{1,2\}\) |
| 3 | \(22/62.5 = .352\) | \(25/62.5 = .400\) | \(.352 \le .400\), start \(G_2 = \{3\}\) |
| 4 | \(25/62.5 = .400\) | \(7/12.5 = .560\) | \(.400 \le .560\), start \(G_3 = \{4\}\) |
| 5 | \(7/12.5 = .560\) | \(2/12.5 = .160\) | \(.560 > .160\), absorb, then merge |
The merge: \(G_3\) now has ratio \(9/25 = .360\), below \(G_2\)’s \(.400\), so the two combine into \(G_2 = \{3,4,5\}\) with ratio \(34/87.5 = .389\).
That exceeds \(G_1\)’s \(.352\), so the walk stops.
\[ G_1 = \{1, 2\}, \qquad G_2 = \{3, 4, 5\} \]
\[ T(1) = \sqrt{\frac{22}{62.5}} = 30.9 \text{ weeks}, \qquad T(2) = \sqrt{\frac{34}{87.5}} = 32.4 \text{ weeks} \]
Nondecreasing, so feasible, at a cost of $183.25 a year.
The infeasible stage-by-stage solution would have cost $181.81, so nesting the chain costs 0.8%.
\(G_1\): \(2^{\ell} \ge 30.9/\sqrt{2} = 21.8\), so \(\ell^{*} = 5\).
\(G_2\): \(2^{\ell} \ge 32.4/\sqrt{2} = 22.9\), so \(\ell^{*} = 5\).
Both blocks land on \(2^{5} = 32\) weeks, at a total of $183.31, which is 0.03% above the relaxed solution.
The two blocks were distinguished by the relaxation and then rounded back together.
That is not a failure. Intervals within a factor of two of one another often round to the same power, and 30.9 and 32.4 weeks differ by 5%.
When it happens, the whole chain replenishes on one schedule: the strongest form of coordination available.
A central warehouse supplies several regional warehouses.
flowchart TB
CW[Central warehouse<br/>index 0] --> R1[Region 1]
CW --> R2[Region 2]
CW --> R3[Region 3]
Index 0 is the center, and \(\lambda_0 = \sum_{i \ge 1}\lambda_i\) passes through it.
The echelon rate. The center’s echelon stock is everything in the system, so its echelon rate is its installation rate, \(h'_0 = h_0\), and each region is charged only what it adds:
\[ h'_i = h_i - h_0 \]
The holding coefficient carries each location’s own demand rate, \(g_i = \tfrac{1}{2}\lambda_i h'_i\), unlike a serial chain where every stage shares one \(\lambda\).
\[ T_0 \ge T_i \qquad \text{for every region } i \]
In a chain, a stage cannot order more often than the stage it supplies.
Here the center supplies everyone, so nothing downstream may wait longer than the center.
A region ordering less often than the center would leave stock sitting at the center with nowhere to go.
This is the constraint students most often write down backwards.
Regions split into two groups.
Those whose unconstrained interval \(\sqrt{k_i/g_i}\) is short enough keep it and order on their own schedule.
Those that would have wanted a longer interval than the center can offer are pinned to the center’s interval and nested with it.
Call the pinned set \(\mathcal{C}^{0}\): the center together with every region sharing its interval.
Relabel the regions in ascending order of \(k_i/g_i\), then work down from the largest, adding a region only when leaving it out would be infeasible.
\[ T_0 = \sqrt{\frac{\sum_{j \in \mathcal{C}^{0}}k_j}{\sum_{j \in \mathcal{C}^{0}}g_j}} \]
Six regions each facing \(\lambda_i = 200\), so the center sees 1,200.
| Step | Candidate | Its \(k_i/g_i\) | Pooled ratio | Action |
|---|---|---|---|---|
| 1 | (6) | .625 | \(500/6000 = .0833\) | larger, add |
| 2 | (5) | .200 | \(625/6200 = .1008\) | larger, add |
| 3 | (4) | .1875 | \(725/6700 = .1082\) | larger, add |
| 4 | (3) | .1286 | \(875/7500 = .1167\) | larger, add |
| 5 | (2) | .110 | \(965/8200 = .1177\) | smaller, stop |
\[ \mathcal{C}^{0} = \{0, (3), (4), (5), (6)\} \]
Regions \((1)\) and \((2)\) are left alone.
\[ T_0 = \sqrt{\frac{965}{8{,}200}} = 17.8 \text{ weeks} \]
shared by the center and four regions, while \((2)\) takes 17.2 weeks and \((1)\) takes 14.2.
This is a scan, not a search. One pass down the list suffices, because the regions were sorted first.
Center: \(2^{\ell} \ge 17.8/\sqrt{2} = 12.6\), so \(\ell^{*} = 4\): 16 weeks.
Region (2): needs \(2^{\ell} \ge 12.2\). Region (1): needs \(2^{\ell} \ge 10.1\).
Both also give \(\ell^{*} = 4\). Every location ends on a sixteen-week cycle.
By the rounding rule, \(\ell^{*} = 4\) covers every interval from \(8\sqrt{2} = 11.3\) weeks to \(16\sqrt{2} = 22.6\) weeks, and 14.2, 17.2 and 17.8 all sit inside it.
No. The exponent \(\ell^{*}\) is a non-decreasing function of \(T^{*}\).
So if \(T_i^{*} \le T_j^{*}\) then \(\ell_i^{*} \le \ell_j^{*}\), hence \(T_i \le T_j\). Two intervals cannot cross when both are rounded by the same rule.
Together with the fact that any two powers of two divide one another, that is why nesting comes for free once the restriction is imposed.
Merging into blocks is needed for the relaxed problem, before rounding. Not after.
Installation rates double count, because a unit downstream has already been charged upstream.
Echelon stock and the value-added rate fix it, reassigning cost between stages while preserving the total. $50 and $30 became $20 and $60, both totalling $80.
Serial chains need intervals to increase; stages that violate that are merged into blocks sharing one interval.
Distribution systems have the constraint reversed: nothing downstream may wait longer than the center.
Rounding preserves feasibility, because the exponent is monotone.
Read before next session: When the Demand Rate Changes, and What a Plan Costs.
That closes multi-item. Next we keep items independent again and remove a different assumption: that the demand rate holds still.
Next session:
We are leaving the world of a single repeating cycle. Everything built on the general cycle assumed one, so almost none of it survives.