Where the Stock Sits: Repairable Items

Manuel D. Rossetti, PhD P.E.

Agenda

  • The question that comes before a policy: where should stock sit?
  • Why an entire class of items has no order quantity to choose
  • A population that never grows or shrinks
  • Palm’s theorem, and why it asks for a mean and nothing else
  • One location, solved completely, with nothing new
  • Two levels by hand, and where the coupling shows up

Every Model So Far Had One Location

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.

The Question Before the Policy

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”.

Why Two Locations Are Enough

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

  • whether forward stock is worth holding
  • what a supplying location owes its customers
  • the interaction that makes the two inseparable

A network is a collection of such pairs. This is a two-echelon system.

Moving Stock Forward Changes Three Things

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 Transformer That Comes Back

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.

A Failure Is Two Events at Once

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.

One-for-One Is Not a Choice Here

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.

An Honest Aside

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.

The Population Is Fixed

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.

Two Words We Will Use Constantly

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.

Naming, Once

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.

The System

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.

Two Rates Fall Out Immediately

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.

For Example

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.

What We Actually Need

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.

Palm’s Theorem

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.

Only the Mean Enters

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.

Do Not Over-Read This

“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.

What the Theorem Requires

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.

The Storeroom’s 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.

A Debt, Recorded Now

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.

The Transformer’s Pipeline

\(\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} \]

Always Check It Twice

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.

One Location, Solved

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) \]

The Arithmetic Check

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.

What One More Unit Buys

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.

Read That as a Sentence

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.

The Transformer at One Storeroom

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\). ✓

Read the Last Column Down

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.

Now Stop Pretending the Depot Is Perfect

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.

The Ledger, Set Up

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.

The Check on Every Row

\[ 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.

Weeks 2 to 11

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.

Week 12: The Luck Runs Out

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.

Weeks 13 to 21

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.

The Storeroom Was Short Once

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.

Now Average the Backorder Column

\(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.

Two Routes, One Answer

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.

Why They Agree

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 Wrong Version Is Easy to Write

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.

Where We Are

  • Positioning is decided by reading a policy, not computed beside one
  • For a repairable, one-for-one is forced and the population is fixed
  • Palm’s theorem gives the pipeline exactly, from a mean
  • One location is then solved with nothing new
  • The depot’s backorders are the storeroom’s lead time

Next: turn that last line into a formula, and find out what it costs to do so.

⌂ Index