With one-for-one storerooms, everything was exact:
Now let the storerooms order \(Q_j\) at a time. The hub no longer sees their customers.
Axsäter counts the hub in storeroom batches: \(Q_w\) batches per hub order, reorder point \(R_w\) batches.
\[ Q_0 = Q_w Q_j \text{ units}, \qquad r_0 = R_w Q_j \]
The storeroom’s order triggered the hub’s, so its position was just reset to \(r_j + Q_j\).
Its next orders come after exactly \(Q_j\), \(2Q_j\), … further demands.
The \(i\)th sub-batch is released against system demand \(iQ_j\), and its units fill the storeroom’s \((r_j + 1)\)th to \((r_j + Q_j)\)th demands.
\[ C = \frac{1}{Q_w Q_j}\sum_{i=R_w+1}^{R_w+Q_w}\ \sum_{k=r_j+1}^{r_j+Q_j} C(iQ_j, k) \]
An average of one-for-one costs, over the hub’s positions and the storeroom’s.
Crews draw two cutouts a week. The storeroom orders \(Q_j = 3\), a week from a hub that orders \(Q_w = 2\) batches (six units) with a three-week lead time.
At \((R_w, r_j) = (0, 6)\): hub positions 3 and 6, storeroom positions 7, 8, 9.
| \(k = 7\) | \(k = 8\) | \(k = 9\) | |
|---|---|---|---|
| \(S_0 = 3\) | 3.6962 | 3.1290 | 3.0011 |
| \(S_0 = 6\) | 3.1694 | 3.5117 | 3.9591 |
\[ C = \frac{20.4665}{2 \times 3} = \$3.4111 \text{ a week} \]
\((0, 6)\) is the exact optimum, and it holds almost nothing at the hub:
0.52 cutouts on hand at the hub, against 4.13 at the storeroom.
With one storeroom there is nothing to pool, and stock is worth more a week closer to the crews.
Raise the hub’s reorder point to one batch: 1.5 units move to the hub, the best storeroom policy falls to \(r_j = 3\), and the cost rises to $3.5354, 3.6% more.
With \(N\) storerooms, the \(i\)th sub-batch is not released at a fixed system demand. It depends on where the other storerooms’ positions sit.
Axsäter’s \(p_{i,j}\): the chance the \(i\)th system demand after a hub order triggers the \(j\)th storeroom order.
The triggering storeroom has just reset. The other \(N - 1\) have positions equally likely to sit anywhere in their ranges. The move, again.
The recursion is in the software. We need its structure, not its algebra.
| Case | Status | Source |
|---|---|---|
| Hub batches, storerooms one for one, Poisson | Exact | Axsäter (1993), eq. (1) |
| Both batch, one storeroom | Exact | Axsäter (1993), eq. (2) |
| Both batch, identical storerooms, Poisson | Exact | Axsäter (1993), eq. (6) |
| Both batch, two storerooms that differ | Exact | Axsäter (1998) |
| Both batch, compound Poisson demand | Exact | Axsäter (2000) |
| Hub demand as a renewal stream of batches | Approximate | Deuermeyer and Schwarz; Svoronos and Zipkin |
Every exact row assumes no other demand at the hub and constant lead times. A real hub has both. That is the rest of this deck.
The hub sees one order of \(Q_j\) each time the customers carry the storeroom’s position down through \(r_j\).
How many orders fall in a window?
The storeroom’s orders are its customers’ demand, counted in whole batches.
Let \(u \in \{1, \dots, Q_j\}\) be how far the position sits above \(r_j\) when the window opens. \(D\): the customers’ demand in the window; \(N\): the orders placed.
The first order comes after \(u\) units, each later one after \(Q_j\) more:
\[ N \ge n \iff D \ge u + (n - 1)Q_j \]
\(u\) is uniform on its \(Q_j\) values. Average over them:
\[ P(N \ge n) = \frac{1}{Q_j}\sum_{y=(n-1)Q_j+1}^{nQ_j} P(D \ge y), \qquad n \ge 1 \]
The chance of at least \(n\) orders is the average of \(Q_j\) consecutive entries of the demand’s tail.
With Poisson customers, that is chapter 8’s table and nothing else.
Two checks, both to be run:
A window ending at one of the storeroom’s orders is not a random moment for that storeroom.
Its position has just reached \(r_j\), so \(u\) is known, not uniform.
Let \(D'\) be the demand in the window before the triggering demand. Still Poisson.
The storeroom’s earlier orders in the window number \(\lfloor D'/Q_j \rfloor\). That is the whole difference, and the order’s wait will need it.
Two cutouts a week, \(Q_j = 3\), a three-week window: \(D\) is Poisson with mean 6.
| \(y\) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| \(P(D \ge y)\) | .9975 | .9826 | .9380 | .8488 | .7149 | .5543 | .3937 | .2560 | .1528 | .0839 | .0426 | .0201 |
Average in threes:
\[ P(N \ge 1) = 0.9727,\quad P(N \ge 2) = 0.7060,\quad P(N \ge 3) = 0.2675,\quad P(N \ge 4) = 0.0489 \]
Difference: \(P(N = 0, 1, 2, 3) = 0.0273,\ 0.2667,\ 0.4385,\ 0.2186\).
Carry the small masses for four, five and six orders: 0.0443, 0.0044, 0.0002.
\[ 3E[N] = 3(0.2667 + 2 \times 0.4385 + 3 \times 0.2186 + 4 \times 0.0443 + 5 \times 0.0044 + 6 \times 0.0002) \]
\[ = 3(1.9999) = 6.0 \]
The customers’ mean demand. ✓
\(\lfloor D'/3 \rfloor\) is 0 when \(D' \le 2\), 1 when \(3 \le D' \le 5\), and so on:
| Orders | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| At a random moment | 0.0273 | 0.2667 | 0.4385 | 0.2186 |
| Seen from an order | 0.0620 | 0.3837 | 0.4015 | 0.1327 |
Much more weight on few orders. The storeroom has just ordered: its position is at the top of its range, the farthest it can be from its next order.
The customers’ demand over three weeks runs from 0 to a dozen or more.
The hub sees 0, 3, 6, 9 or 12 units, with two orders, six units, the most likely.
That is the lumpiness.
And the count bunched tightly around two is the regularity.
Hub: \((r_0, Q_0) = (1, 6)\), \(L_0 = 3\) weeks, starts with 7.
Storeroom: \((r_j, Q_j) = (1, 3)\), a week away, starts with 4.
Crew failures in weeks 1, 3, 5, 7, 8, 9, 9, 10, 11.
One unit of other demand reaches the hub in each of weeks 2 and 4.
Same columns, same posting rule, same two-way position check as the first ledger.
| Week | Event | \(I_j\) | \(B_j\) | \(\mathit{IP}_j\) | In transit | \(I_0\) | \(B_0\) | On order | \(\mathit{IP}_0\) |
|---|---|---|---|---|---|---|---|---|---|
| 1 | failure | 3 | 0 | 3 | 0 | 7 | 0 | 0 | 7 |
| 2 | other demand at the hub | 3 | 0 | 3 | 0 | 6 | 0 | 0 | 6 |
| 3 | failure | 2 | 0 | 2 | 0 | 6 | 0 | 0 | 6 |
| 4 | other demand at the hub | 2 | 0 | 2 | 0 | 5 | 0 | 0 | 5 |
| 5 | failure, order of 3 to hub, shipped | 1 | 0 | 4 | 3 | 2 | 0 | 0 | 2 |
| 6 | storeroom receives 3 | 4 | 0 | 4 | 0 | 2 | 0 | 0 | 2 |
Failures in weeks 1 and 3 never reach the hub. Its position moves only for its own customers.
Week 5: the storeroom hits its reorder point, and an order of 3 arrives at the hub at once.
Two failures in weeks 7 and 8; the hub sees neither.
Week 9: the storeroom orders three. The hub has two. It ships two and owes one.
The order of 3 takes the hub’s position from 2 to \(-1\), two below its reorder point. The hub orders six, due week 12; position 5.
Undershoot. One order of three carried the position past \(r_0\) in a single step, exactly what a lumpy demand did in chapter 8.
| Week | Event | \(I_j\) | \(B_j\) | \(\mathit{IP}_j\) | In transit | \(I_0\) | \(B_0\) | On order | \(\mathit{IP}_0\) |
|---|---|---|---|---|---|---|---|---|---|
| 7 | failure | 3 | 0 | 3 | 0 | 2 | 0 | 0 | 2 |
| 8 | failure | 2 | 0 | 2 | 0 | 2 | 0 | 0 | 2 |
| 9 | failure, order of 3: 2 shipped, 1 backordered, hub orders 6 | 1 | 0 | 4 | 2 | 0 | 1 | 6 | 5 |
| 9 | failure | 0 | 0 | 3 | 2 | 0 | 1 | 6 | 5 |
| 10 | storeroom receives 2 | 2 | 0 | 3 | 0 | 0 | 1 | 6 | 5 |
| 10 | failure | 1 | 0 | 2 | 0 | 0 | 1 | 6 | 5 |
Check week 9’s first row at the hub: \(0 + 6 - 1 = 5\). ✓
Week 11: the storeroom orders three more. The hub’s shelf is empty, so the whole order waits; the hub owes four.
| Week | Event | \(I_j\) | \(B_j\) | \(\mathit{IP}_j\) | In transit | \(I_0\) | \(B_0\) | On order | \(\mathit{IP}_0\) |
|---|---|---|---|---|---|---|---|---|---|
| 11 | failure, order of 3 to hub, backordered | 0 | 0 | 4 | 0 | 0 | 4 | 6 | 2 |
| 12 | hub receives 6, completes the week-9 order, fills week 11’s | 0 | 0 | 4 | 4 | 2 | 0 | 0 | 2 |
| 13 | storeroom receives 4 | 4 | 0 | 4 | 0 | 2 | 0 | 0 | 2 |
The week-9 order is complete only now. Two thirds of it left at once, and it still waited three weeks: an order is filled when its last unit is.
The storeroom ordered in weeks 5, 9 and 11.
Weeks 9 to 11 hold two orders. Weeks 6 to 8 hold none.
Both are values the order-count law gives appreciable probability.
The second is the regularity: a storeroom that has just ordered does not order again for a while.
\(X_o(\ell)\): other demand in a window, Poisson with mean \(\lambda_o \ell\). \(N_j(\ell)\): storeroom \(j\)’s orders, by the order-count law.
\[ D_0(\ell) = X_o(\ell) + \sum_j Q_j N_j(\ell) \]
The terms are independent: each storeroom’s position is uniform and independent of every other’s.
A convolution: a short table by hand, a worksheet column otherwise. Then chapter 8’s formulas, unchanged.
Nothing needs the storerooms to be identical. Each adds one term.
The hub’s position is uniform on \(r_0 + 1, \dots, r_0 + Q_0\) provided some of its demand comes one unit at a time.
When its only demand is storeroom orders of a common size \(Q_j\), the position moves in steps of \(Q_j\).
It is then uniform on the multiples of \(Q_j\) in that band instead.
That is why Axsäter counts the hub in batches.
The mean is \(\lambda_0 \ell\). For the variance, write the orders as demand plus the change in position:
\[ Q_j N_j = D + U_\ell - U_0 \]
Over a long window, \(U_0\) and \(U_\ell\) are independent and uniform on \(1, \dots, Q_j\), each with variance \((Q_j^{2} - 1)/12\).
\[ \mathit{Var}[D_0(\ell)] \approx \lambda_o \ell + \sum_j \Big(\lambda_j \ell + \frac{Q_j^{2}}{6}\Big) \]
The exact long-window term is \((Q_j^{2} - 1)/6\). The recipe errs by a sixth of a unit squared, on the safe side.
Treat each storeroom’s orders as Poisson arrivals of \(Q_j\) units at rate \(\lambda_j/Q_j\).
Its variance term becomes \(\lambda_j Q_j \ell\): \(Q_j\) times its customers’ own.
The storeroom’s orders are not random in that way. It orders once per \(Q_j\) units of demand, nearly on a schedule. The shortcut charges the hub for a randomness that is not there.
The hub serves two cutouts a week of its own customers and the storeroom we just counted (\(\lambda_j = 2\), \(Q_j = 3\), \(r_j = 3\)). The hub runs \(Q_0 = 8\), \(L_0 = 3\).
What is stocked? The cutout, at the hub and one storeroom.
Demand? Poisson, two a week at each, one unit per customer.
Review? Continuous. Replenishment? Storeroom at \(r_j = 3\) for 3; hub at \(r_0\) for 8.
Unmet demand? Backordered at both levels.
Costs? For this example the hub is priced alone, \(h\) and \(b\) per week on its own on-hand and backorders.
\(D_0(3) = X_o(3) + 3N(3)\): Poisson with mean 6, plus 0, 3, 6, 9 or 12.
| Variance | Reorder point chosen | True cost a week | |
|---|---|---|---|
| Exact convolution | 13.333 | 13 | $4.4054 |
| Recipe: \(6 + 6 + 9/6\) | 13.5 | 13 | $4.4054 |
| Shortcut: \(6 + 2 \times 3 \times 3\) | 24 | 15 | $4.6533 |
Check: mean \(4 \times 3 = 12\). The exact variance exceeds the customers’ 12 by 1.333, which is \((3^{2} - 1)/6\). ✓
The shortcut believes the hub faces nearly twice the variance it does.
It holds two cutouts too many and costs 5.6% more.
The recipe is within a sixth of a unit squared and chooses the same reorder point as the exact convolution.
The shortcut is not eccentric. It is the natural reading of “orders of \(Q_j\) at rate \(\lambda_j/Q_j\)”. Check for it in any planning system.
At \(Q_j = 1\) the convolution is Poisson with mean 12: the hub of Part I. ✓
The recipe’s error stays bounded as the window grows.
Not as it shrinks: over a window holding one order or none, the rounding term is far from its long-window value.
Short windows: use the convolution.
The lead-time shift still applies: an order placed at \(A\) is complete by \(A + w\) exactly when, with the supplier \(w\) faster, it would have been complete at \(A\).
Three things differ from a customer’s single unit, all visible in the ledger:
With \(\ell = L_0 - w\) and \(u\) averaged over the hub’s positions:
\[ P(W_j \le w) = \frac{1}{Q_0}\sum_{u=r_0+1}^{r_0+Q_0} P\Big(X_o(\ell) + \sum_{i \ne j} Q_i N_i(\ell) + Q_j\big\lfloor D_j'(\ell)/Q_j \big\rfloor \le u - Q_j\Big) \]
for \(0 \le w < L_0\).
At \(Q_j = 1\) it reduces to deck 1’s customer wait. ✓
Conditioning on this wait is exact, for deck 1’s reason: the wait is fixed by the history up to the order, and the customers after it are independent of that history.
The code checks the route wherever both apply:
Agreement to six decimals or better.
The order’s own view is not a refinement. Using a customer’s wait in its place overstates the cost by 14% on one of those test systems.
Hub at \((r_0, Q_0) = (12, 8)\), storeroom at \((r_j, Q_j) = (3, 3)\), one week away.
| \(P(W = 0)\) | \(P(W \le 1)\) | Mean wait, weeks | |
|---|---|---|---|
| A hub customer | 0.8228 | 0.9797 | 0.0874 |
| The storeroom’s order | 0.7626 | 0.9668 | 0.1264 |
Storeroom backorders:
| Route | Backorders | Against conditioned |
|---|---|---|
| Conditioned on the order’s wait | 0.0823 | |
| Two moments | 0.0783 | 5% low |
| The mean wait only | 0.0559 | 32% low |
The storeroom’s orders wait 45% longer on average than the hub’s own customers.
Each needs three units rather than one.
And each arrives just after a draw of three the hub has had no time to recover from.
With the batches held at \(Q_0 = 8\) and \(Q_j = 3\), \((r_0, r_j) = (12, 3)\) is the cheapest pair for the whole system, at $5.6675 a week.
Let \(L_0\) take values \(\ell_1, \dots, \ell_K\) with probabilities \(p_1, \dots, p_K\).
Condition on the lead time, then average:
\[ P\big(D_0(L_0) \le x\big) = \sum_k p_k\, P\big(D_0(\ell_k) \le x\big) \]
The measures average the same way, since each is an expectation. So does the wait:
\[ P(W \le w) = \sum_k p_k\, P(W \le w \mid L_0 = \ell_k) \]
provided orders do not overtake and lead times are independent of demand.
Both streams are counted over the same lead time.
They are independent only once its value is known.
Average each stream over the lead time on its own, then add them, and you lose the covariance a shared lead time creates:
\[ 2\lambda_o\lambda_j\mathrm{Var}[L_0] \]
The variance is understated.
The system just priced, but the supplier takes 2, 3 or 5 weeks with probabilities 0.4, 0.4, 0.2.
\[ E[L_0] = 3, \qquad \mathrm{Var}[L_0] = 0.4(1) + 0.4(0) + 0.2(4) = 1.2 \text{ weeks}^{2} \]
| Mean | Variance | |
|---|---|---|
| Built at each value, then averaged | 12 | 32.535 |
| Each stream averaged alone | 12 | 22.935 |
Check: \(32.535 - 22.935 = 9.6 = 2 \times 2 \times 2 \times 1.2\). ✓
At \((r_0, Q_0) = (12, 8)\):
| Storeroom planned on | \(r_j\) | Backorders | Cost a week |
|---|---|---|---|
| The mean wait only | 3 | 0.239 | $2.7771 |
| Two moments, or the whole wait | 4 | 0.143 | $2.7472 |
The supplier’s variability multiplies the variance the hub covers by two and a half, and it carries down to the storeroom through the wait.
Planned on the mean wait, the storeroom owes its crews 67% more than it needs to.
At a cost only 1.1% higher.
A utility that watches cost will not notice what its crews do. Report both.
When the supplier delivers in the order orders were placed, use the time from placement to receipt, order by order.
With data: a handful of values at its quantiles, equal weights.
With only a mean and a standard deviation: the values must come from a family you choose, and you should say so.
When orders overtake one another, the model over-protects, as chapter 8 warned. Correcting for it is beyond this chapter.
Next: we can evaluate any pair of policies. Now choose them.