The storeroom’s policy needs the hub’s, through the wait.
The hub’s policy needs the storeroom’s, through the orders it passes up.
Neither can be computed first.
Under one-for-one ordering (chapter 9), the depot could be solved first, because its demand contained no storeroom policy. Batching breaks that.
Chapter 8’s cost, at each location:
\[ C_i(r_i, Q_i) = \frac{k_i \lambda_i}{Q_i} + h\,\bar{I}_i(r_i, Q_i) + b_i\,\bar{B}_i(r_i, Q_i) \]
The storeroom’s \(b_j\) is the shortage cost of its crews.
The hub has no shortage cost of its own, yet this formula needs one.
Recall from chapter 4: a service constraint and a penalty are the same thing seen from two sides.
Set the hub’s \(b_0\) from a ready rate target \(\gamma_0\), through the critical ratio:
\[ \frac{b_0}{b_0 + h} = \gamma_0 \quad\Longleftrightarrow\quad b_0 = \frac{\gamma_0\, h}{1 - \gamma_0} \]
With \(\gamma_0 = 0.8\): \(b_0 = 4h = \$2.2115\) per unit per week.
It is a stated input, and we will price it. It prices \(b_0\); it is not the service the hub actually delivers, and it is not a fill rate.
The way out is the one chapter 4 took for a different coupling:
Repeat until nothing moves.
twoLevel():
E[W] <- 0, Var[W] <- 0 // step 0: the hub never delays anyone
loop:
// step 1: the storeroom against the wait
(r_j, Q_j) <- optimize, lead time demand over O_j + W
// step 2: the hub against the storeroom's orders
(r_0, Q_0) <- optimize, lead time demand by the recipe or the
convolution, b_0 from gamma_0
// step 3: the wait the hub's policy implies
E[W], Var[W] <- Little's law and its distributional form,
or the order's wait by the lead-time shift
// step 4: stop when the four integers repeat
if (r_j, Q_j, r_0, Q_0) == previous: return them
It is the only guess in the procedure.
A wait of zero says the hub always has stock.
That is the assumption a planner makes by default when modeling a location alone.
So the first pass is the uncoupled planner’s answer, and every pass after it is a correction.
The test is that the four integers stopped moving.
Not that any optimality condition holds.
The iteration finds a fixed point of a heuristic: a pair of policies, each optimal given the other.
Nothing shows the pair is the best pair. A fixed point of a biased map is a biased answer that has stopped moving.
The moment route
The exact route
The system of deck 2, but now both batches are chosen.
| Pass | Storeroom \((r_j, Q_j)\) | Storeroom cost | Hub \((r_0, Q_0)\) | Hub cost | \(E[W]\), weeks | \(\sigma_W\) |
|---|---|---|---|---|---|---|
| 1 | \((-1, 26)\) | $13.09 | \((2, 47)\) | $20.99 | 0.5634 | 1.5988 |
| 2 | \((0, 29)\) | $14.35 | \((2, 48)\) | $21.71 | 0.6166 | 1.8033 |
| 3 | \((0, 29)\) | $14.65 | \((2, 48)\) | $21.71 | 0.6166 | 1.8033 |
Pass 1 ignores the hub: with no wait, the storeroom holds a reorder point of \(-1\) against a week of transit.
The hub’s answer implies a wait of 0.56 weeks, standard deviation 1.6.
Pass 2 raises the storeroom’s reorder point by one and its batch by three. Pass 3 changes nothing.
The storeroom’s policy is the same at passes 2 and 3.
Its cost is not: $14.35, then $14.65.
Each pass prices the storeroom against the wait the pass before it left. Pass 2 pays against 0.56 weeks; pass 3 against 0.62.
Also three passes. It reaches hub \((2, 48)\) and storeroom \((3, 28)\).
Its storeroom holds three more units. Why?
Its orders of 28 wait for their last unit: 1.75 weeks on average.
The moment route carries a customer’s wait, 0.62 weeks.
Priced exactly: the moment route’s answer costs $34.35 a week, the exact route’s $33.54.
An iteration never checked against an exact answer is one you are asked to trust.
We do not have to ask.
In Axsäter’s setting there is an exact cost. With one-unit customers the chapter’s own route gives one everywhere.
| System | Fixed point, exactly | Exact optimum | Gap |
|---|---|---|---|
| Part I, batches held: hub \((11, 8)\), \(S_j = 3\) | $7.4337 | $7.0195 at \((9, 3)\) | 5.9% |
| One batching storeroom, hub at one batch | $3.5354 | $3.4111 | 3.6% |
| Part II, both batches chosen, exact route | $33.5370 | $33.3955 nearby | 0.4% |
| Part II, both batches chosen, moment route | $34.3462 | $33.3955 nearby | 2.9% |
In every case the fixed point holds more at the hub than the exact optimum does.
The exact optima run the hub at a low ready rate: 0.60 in Part I.
A unit at the hub protects every storeroom a little.
A unit at a storeroom protects its own crews a lot.
A hub target of 0.8 already asks for more protection than the system wants.
The target is the input to choose with care; the route matters less. Repeat this comparison on your own items whenever an exact cost is available.
Chapter 8’s cutout is drawn in job lots. Nothing exact in Parts I and II reaches it.
A lot can carry the position past the reorder point, and the undershoot varies.
The moment route needs only two moments at each location.
Those are available.
Crews draw cutouts in lots of 1, 2 or 4 with probabilities 0.40, 0.40, 0.20 (chapter 8’s lots).
Demand? Compound Poisson at both locations. Review? Continuous. Replenishment? Each location’s position reaching its reorder point, for its batch. Unmet demand? Backordered.
\[ E[Y] = 0.4(1) + 0.4(2) + 0.2(4) = 2.0, \qquad E[Y^{2}] = 0.4 + 1.6 + 3.2 = 5.2 \]
So 300 units a year at the storeroom and 500 of the hub’s own.
A lot is at most 4 and the storeroom’s batch will be near 50, so every storeroom order is exactly \(Q_j\).
The hub, by the recipe with compound Poisson customers, at \(Q_j = 49\):
\[ \text{mean} = 800 \times \tfrac{2}{12} = 133.33, \qquad \text{variance} = (250 + 150)\tfrac{2}{12}(5.2) + \tfrac{49^{2}}{6} = 346.67 + 400.17 = 746.83 \]
| Pass | Storeroom \((r_j, Q_j)\) | Hub \((r_0, Q_0)\) |
|---|---|---|
| 1 | \((22, 48)\) | \((120, 92)\) |
| 2 | \((25, 49)\) | \((120, 92)\) |
| 3 | \((25, 49)\) | \((120, 92)\) |
The coupling moves the storeroom’s reorder point by three units, from the planner who ignores the hub to the converged answer.
The hub’s policy does not move at all: the storeroom’s batch barely changes, and the hub’s lead time demand barely changes with it.
The storeroom’s batch contributes 400 of the 747 units squared of the hub’s variance: more than all the customers together. A hub serving a storeroom that orders fifty at a time faces a demand its customers never place.
Nothing exact covers this case.
The assumption that breaks is stated: customers who take one unit each.
What remains is to check the answer by simulation, which chapter 11 builds.
Chapter10Models.xlsx, one sheet per section, no macros:
Hub, Delay (a row a day), Exact (Axsäter’s recursion down a grid), Storeroom (the three routes)Orders, HubGeneral (exact, recipe, shortcut), OrderDelay, RandomLeadIterate: the iteration by handA sheet cannot run chapter 8’s search by itself. You type each pass’s policies; the sheet prices them and their four neighbours and hands the wait to the next pass.
Iterate SheetThe last column reads “no” on every pass: no neighbour of any typed policy is cheaper.
Passes 2 and 3 agree: the stopping test of the algorithm, read off a sheet.
The utility is offered a price break for ordering cutouts twelve at a time instead of eight.
Before weighing the price: what does the larger batch do to the system, with everything else held?
Step 1. On Hub, \(r_0 = 9\), \(Q_0 = 8\). Exact!B28 reads $7.0195 a week.
Step 2. Type 12 into Hub!B19, and read down the sheets.
| Cell | What it is | \(Q_0 = 8\) | \(Q_0 = 12\) |
|---|---|---|---|
Hub!B22 |
\(\bar{B}_0\) | 1.0273 | 0.6984 |
Hub!B23 |
\(\overline{\mathit{RR}}_0\) | 0.6030 | 0.7242 |
Hub!B27 |
\(\bar{W}\), weeks | 0.2568 | 0.1746 |
Storeroom!E19 |
backorders per storeroom | 0.0726 | 0.0567 |
Exact!B28 |
system cost per week | $7.0195 | $7.7367 |
The hub holds more, so it owes less, and the crews wait less.
And the system costs $0.72 a week more. The cheapest \(S_j\) is still 3.
Holding more at the hub is more protection than the system wants, so lower Hub!B18.
At 7, Exact!B28 reads $7.5379: the cheapest reorder point for a batch of twelve.
The check. On Storeroom, exact and conditioned backorders at \(Q_0 = 12\) are 0.0567 and 0.0568, apart only by the day grid. ✓
Without an ordering cost the larger batch cannot pay for itself: it only adds stock.
Its best version costs $0.52 a week more than the present policy: $27 a year.
The hub buys about 208 cutouts a year. A thirteen-cent discount pays for it.
A planner who changed the batch and left the reorder point would have priced the offer at $0.72 a week instead of $0.52.
inventory.multiechelon, one class per idea:
BatchedHub: the convolution, the recipe, the shortcut, the hub’s measuresHubDelay: a customer’s wait, or an order’sStoreroomWithDelay: the three routesAxsaterBatchOrdering: the exact yardstickTwoLevelIteration: the algorithm, and the exact price of any policy### Part III: the two-level iteration
moments route, 3 passes:
1 hub (2, 47), storeroom (-1, 26) E[W] 0.5634
2 hub (2, 48), storeroom (0, 29) E[W] 0.6166
3 hub (2, 48), storeroom (0, 29) E[W] 0.6166
priced exactly: 34.3462 a week
exact route, 3 passes:
1 hub (2, 48), storeroom (-1, 26) E[W] 1.6250
2 hub (2, 48), storeroom (3, 28) E[W] 1.7500
3 hub (2, 48), storeroom (3, 28) E[W] 1.7500
priced exactly: 33.5370 a week
Every number the chapter prints has a test behind it.
A storeroom that batches passes up its customers’ demand in whole batches. Lumpier, and more regular. Countable from the Poisson table.
One move carries the chapter: condition on the position, then average. Chapter 8’s \((r, Q)\) measures, Axsäter’s equation (1), the order-count law, a random lead time.
With one-for-one storerooms, everything is exact. The wait’s distribution is the ready rate at a shorter lead time.
Conditioning a storeroom on the wait is exact, and for a batching storeroom the wait is its order’s own.
Little’s law gets the mean right, and the mean is not enough. 30% low on the running example.
The recipe is sound; the shortcut over-stocks.
A random lead time: build at each value, then average.
The iteration converges fast, and its answer depends most on the hub’s target.
Next: chapter 11, where a system’s behavior is generated rather than solved for.