The EOQ, the newsvendor, and continuous review all described one stock point.
The lead time was a number the supplier quoted.
That number is the assumption we remove. When the supplier is itself a stocking location, its lead time is an outcome of its own inventory policy.
And it gets worse exactly when the supplier is short.
An item can be held centrally, or forward, or both.
Which locations hold any? That is the stock positioning problem.
It looks like it sits above the policy models.
It does not. If a policy calculation says a location should hold zero, that is the positioning answer arriving as a stock level.
So: the answer to “how much” also answers “whether”.
Real networks have many locations and many layers.
We will not solve that. We do not have to.
One location against two, where one supplies the other, already contains
A network is a collection of such pairs. This is a two-echelon system.
Forward stock is faster. A unit at the site issues at once; a unit at the depot has to be picked, packed and shipped.
Forward stock is less pooled, so there is more of it. Ten locations each covering their own variability need more than one covering the pooled stream.
And it does not remove the need for stock behind it. The supplier still faces demand, now from the locations it supports.
Rules of thumb (stock fast movers forward, slow movers centrally) are usually right. Use them to decide which items to analyze, not as the analysis.
A pad-mount transformer fails. It is pulled, a good one goes in its place, and the failed one goes to a shop to be rewound.
At $3,800 a unit, that is worth doing.
So are aircraft engines, circuit cards, pumps, traction motors.
An item managed this way is a repairable item.
It is a demand for a serviceable unit.
It is an arrival of an unserviceable one.
They happen at the same instant and they are the same physical event.
So the quantity demanded and the quantity inducted into repair are never different.
An order quantity exists to amortize an ordering cost: accumulate demand until a batch is worth placing.
For a repairable there is nothing to amortize. The repair pipeline is fed by failures, one failure at a time.
For a consumable, \(Q = 1\) is a decision. For a repairable, the item makes it.
That is why we can carry two locations without also carrying an order quantity.
Does the transformer’s EOQ collapse to one?
\[ Q^{*} = \sqrt{\frac{2(220)(45)}{950}} = \sqrt{20.84} = 4.57 \to 5 \]
No. As a consumable it has a batching decision and the answer is five.
As a repairable it has no batching decision at all.
The batching argument did not collapse. The batching decision disappeared.
Failures are repaired, not replaced.
So the number of units the system owns does not change as demand is met.
Buying more is a separate, much slower decision, usually made once when a fleet is fielded.
The day-to-day question is not how much to buy. It is where the units already owned should sit.
A serviceable unit is ready to be issued.
An unserviceable unit, a carcass, has failed and is awaiting or undergoing repair.
Every unit is exactly one of the two, and the sum over both, at every location, is the fixed population.
The literature calls the forward locations bases and the central one the depot.
This course says storeroom and depot.
Because base-stock is already the name of a policy, and this chapter uses it constantly. When you read Sherbrooke, bases are storerooms.
Storeroom \(j\): failures at rate \(\lambda_j\). A fraction \(\phi_j\) are rebuilt locally in an average time \(T_j\). The rest go to the depot, and a replacement comes back after an order-and-ship time \(O_j\) plus whatever the request waits.
Depot: repairs what it receives in an average time \(T_0\), and ships from its own stock.
Notice: no arrow leaves this system and none enters it.
Requests storeroom \(j\) sends up:
\[ \lambda_{j0} = (1 - \phi_j)\lambda_j \]
The depot’s demand rate:
\[ \lambda_0 = \sum_{j=1}^{J}(1 - \phi_j)\lambda_j \]
The stream a storeroom sends up is its own failure stream, thinned. One line, because \(Q = 1\). A thinned Poisson process is Poisson.
Four alike storerooms, 45 failures a year each, three in ten rebuilt locally.
\[ \lambda_{j0} = 0.7(45) = 31.5 \text{ a year} \]
\[ \lambda_0 = 4(31.5) = 126 \text{ a year} \]
That is the whole derivation. Batch ordering will take several pages for the same object.
Everything follows from one identity:
\[ \mathit{IN} = S - X \]
where \(X\) is the number of units in resupply.
For a consumable with a constant lead time, the units on order are the lead time demand. A repair pipeline is not so obliging: repair times vary by an order of magnitude, and the shop does not finish jobs in the order it receives them.
It turns out none of that matters.
Failures arrive in a Poisson process at rate \(\lambda\). Each starts a resupply activity whose duration is drawn independently from a distribution with mean \(T\).
Then the number in progress at a random instant is Poisson with mean \(\lambda T\),
\[ P\{X = x\} = \frac{e^{-\lambda T}(\lambda T)^{x}}{x!} \]
whatever the duration distribution may be.
Not the variance. Not the shape.
Not whether it is bimodal because half the carcasses need a rewind and half need a bushing.
This is worth more than it looks. Repair time data is the worst data in this business. A shop can usually tell you an average flow time and rarely more, and what it does tell you is contaminated by jobs that sat waiting for a part.
Palm says: use the average and stop.
“Lead time variability never matters”?
No. Random lead times inflate lead time demand variance by \(\mathit{Var}[L](E[D])^{2}\). Both claims are true.
The separating question: can an activity started later finish earlier?
Under one common lead time it cannot, and one long draw stretches everything in the pipe at once.
In a repair shop it can, and routinely does, so a long teardown and a quick reseat overlap and the long one delays nothing.
That is a fact about the shop, not about the model. Check it describes yours.
Poisson failures. Reasonable for a population of independently operating units.
Independently drawn durations. This is what lets the proof run.
Repair capacity never binds. The \(M/G/\infty\) reading makes it explicit: infinitely many servers, so a carcass starts repair the instant it arrives.
Three test benches and twelve carcasses breaks the third condition. The model then understates the pipeline.
Two routes, each a thinning of the failure stream, each Poisson:
\[ \mu_j = \underbrace{\phi_j\lambda_j T_j}_{\text{local repair}} + \underbrace{(1-\phi_j)\lambda_j\left(O_j + \bar{W}\right)}_{\text{from the depot}} \]
Every quantity here is measurable except one. \(\bar{W}\), the wait at the depot, is produced by how much stock the depot decided to hold.
That is what “multi-echelon” means.
Palm’s theorem wants durations drawn independently.
The depot-routed durations are not independent: two requests arriving while the depot is empty wait on the same repairs.
We will use the formula anyway. That is what makes METRIC an approximation rather than a result, and it is the subject of the next deck.
\(\lambda_j = 45\), \(\phi_j = 0.3\), \(T_j = 30\) days, \(O_j = 10\) days, and suppose a depot that never delays anybody.
Local: \((0.3)(45)(30/365) = 1.1096\) units
Depot: \((0.7)(45)(10/365) = 0.8630\) units
\[ \mu_j = 1.9726 \text{ units} \]
One rate times one average duration:
\[ E[\text{duration}] = (0.3)(30) + (0.7)(10) = 16 \text{ days} \]
\[ 45\left(\frac{16}{365}\right) = 1.9726 \text{ units} \]
Agreement. Do this every time. Putting the repair fraction on the wrong stream is the error that survives inspection.
Nothing new is needed. The base-stock derivation used only that the position is held at \(S\) and that the outstanding units are those whose resupply has not finished.
Neither fact says what the resupply is.
\[ \bar{B}_j(S_j) = G^{1}(S_j), \qquad \bar{I}_j(S_j) = S_j - \mu_j + G^{1}(S_j) \]
\[ \overline{\mathit{RR}}_j(S_j) = G(S_j - 1) \]
Rearrange the on-hand formula:
\[ \bar{I}_j - \bar{B}_j = S_j - \mu_j \]
An identity, not an approximation. It holds on every row of any table you build, under any distribution. Run it.
Ask what the \((S+1)\)st unit is worth, in backorders removed.
The first order loss function is a tail sum: \(G^{1}(b) = \sum_{x \ge b}G^{0}(x)\).
Drop one term from a tail sum and you are left with that term:
\[ \Delta_j(S_j) = G^{0}(S_j) = P\{X_j > S_j\} \]
No algebra required.
The next unit removes a backorder exactly when the pipeline would otherwise have exceeded the stock.
Its value is the probability that it does.
And \(G^{0}\) is a complementary distribution function, so it never rises.
The first unit buys more than the second, which buys more than the third.
Diminishing returns, stated exactly. We will spend this later.
Pipeline Poisson with mean 1.9726.
| \(S_j\) | \(G(S_j)\) | \(\bar{B}_j\) | \(\bar{I}_j\) | \(\overline{\mathit{RR}}_j\) | \(\Delta_j\) |
|---|---|---|---|---|---|
| 0 | 0.1391 | 1.9726 | 0.0000 | 0.0000 | 0.8609 |
| 1 | 0.4135 | 1.1117 | 0.1391 | 0.1391 | 0.5865 |
| 2 | 0.6841 | 0.5252 | 0.5526 | 0.4135 | 0.3159 |
| 3 | 0.8620 | 0.2093 | 1.2367 | 0.6841 | 0.1380 |
| 4 | 0.9498 | 0.0713 | 2.0987 | 0.8620 | 0.0502 |
| 5 | 0.9844 | 0.0211 | 3.0485 | 0.9498 | 0.0156 |
Check row 3: \(1.2367 - 0.2093 = 1.0274 = 3 - 1.9726\). ✓
0.86, then 0.59, then 0.32, then 0.14, then 0.05.
At $3,800 a unit, the fifth transformer buys almost nothing.
Notice we have not needed a backorder cost to see this. We have a ranked list of what each unit buys.
Every number so far set \(\bar{W} = 0\).
Before any formula for it, run the system by hand.
You should be able to perform by hand the bookkeeping that the worksheet will otherwise perform for you.
One row per event, at the week it occurs, state recorded after the event. Review is continuous: no periods, no buckets.
\(S_j = 2\), \(S_0 = 2\). Local repair 4 weeks, depot repair 8 weeks, shipping 2 weeks.
Failures in weeks 2, 5, 8, 11, 12, 15, 17. The ones in weeks 5 and 15 are rebuilt locally.
Columns: \(I_j\), \(B_j\), \(X_j\) at the storeroom, and \(I_0\), \(B_0\), \(X_0\) at the depot.
\[ X_j = S_j - I_j + B_j, \qquad X_0 = S_0 - I_0 + B_0 \]
Compute the resupply columns two ways: by counting what is actually out there, and from the identity. Stop when they disagree.
| Week | Event | \(I_j\) | \(B_j\) | \(X_j\) | \(I_0\) | \(B_0\) | \(X_0\) |
|---|---|---|---|---|---|---|---|
| 0 | start | 2 | 0 | 0 | 2 | 0 | 0 |
| 2 | failure, request to depot | 1 | 0 | 1 | 1 | 0 | 1 |
| 4 | shipment arrives | 2 | 0 | 0 | 1 | 0 | 1 |
| 5 | failure, rebuilt locally | 1 | 0 | 1 | 1 | 0 | 1 |
| 8 | failure, request to depot | 0 | 0 | 2 | 0 | 0 | 2 |
| 9 | local rebuild returns | 1 | 0 | 1 | 0 | 0 | 2 |
| 10 | depot repair completes | 1 | 0 | 1 | 1 | 0 | 1 |
| 10 | shipment arrives | 2 | 0 | 0 | 1 | 0 | 1 |
| 11 | failure, request to depot | 1 | 0 | 1 | 0 | 0 | 2 |
Ten weeks in, every failure met the day it happened. Both locations look healthy.
A fifth failure, one week after the fourth.
The storeroom issues its last transformer. Shelf empty, but it still owes nobody.
The carcass goes up as a request, and the depot has nothing to ship.
| Week | Event | \(I_j\) | \(B_j\) | \(X_j\) | \(I_0\) | \(B_0\) | \(X_0\) |
|---|---|---|---|---|---|---|---|
| 12 | failure, request backordered | 0 | 0 | 2 | 0 | 1 | 3 |
The storeroom’s resupply column now holds a unit that no serviceable anywhere in the system has been assigned to.
| Week | Event | \(I_j\) | \(B_j\) | \(X_j\) | \(I_0\) | \(B_0\) | \(X_0\) |
|---|---|---|---|---|---|---|---|
| 13 | shipment arrives | 1 | 0 | 1 | 0 | 1 | 3 |
| 15 | failure, rebuilt locally | 0 | 0 | 2 | 0 | 1 | 3 |
| 16 | depot repair completes, ships | 0 | 0 | 2 | 0 | 0 | 2 |
| 17 | failure backordered, request backordered | 0 | 1 | 3 | 0 | 1 | 3 |
| 18 | shipment arrives, clears the crew | 0 | 0 | 2 | 0 | 1 | 3 |
| 19 | depot repair completes, ships | 0 | 0 | 2 | 0 | 0 | 2 |
| 19 | local rebuild returns | 1 | 0 | 1 | 0 | 0 | 2 |
| 21 | shipment arrives | 2 | 0 | 0 | 1 | 0 | 1 |
The depot’s week-12 backorder lasted four weeks. Week 17’s lasted two.
Run it again with a depot that never delays.
The week-12 request arrives in week 14 instead of 18. The shelf carries through week 16.
The storeroom’s only backorder disappears.
Its failures did not change. Its own shop did not change. Its stock level was never touched.
The backorder was manufactured at the depot and delivered.
\(B_0(t)\) is a step function: 0 until week 12, 1 to week 16, 0 to week 17, 1 to week 19, 0 after.
Its average is an average over time, weighted by how long it held each value.
Not the average of the numbers in the column. Those are samples at the instants the process happened to change, and there are more of them in a busy fortnight than in a quiet month.
Weighting by duration: 4 weeks plus 2 weeks is 6 backorder-weeks.
\[ \bar{B}_0 = \frac{6}{26} = 0.2308 \text{ units} \]
Following the requests: five reached the depot, three filled at once, one waited four weeks and one waited two.
\[ \bar{W} = \frac{0+0+0+4+2}{5} = 1.20 \text{ weeks} \]
And \(\dfrac{6/26}{5/26} = \dfrac{6}{5} = 1.20\) weeks.
Both are the same six backorder-weeks divided by the same five requests.
One swept along the time axis, weighting each level by its duration.
The other swept across the requests, adding each one’s wait.
The six is an area either way, counted in rows or in columns.
That is Little’s Law, with nothing hidden.
The \(B_0\) column holds twenty entries, five of them 1.
\(5/20 = 0.25\), against a true time average of \(0.2308\).
That number is not an average of anything the system did. It is an average over the events the ledger happened to record.
Whenever a quantity carries \((t)\): integrate it, do not average the rows.
Next: turn that last line into a formula, and find out what it costs to do so.