An item’s demand is independent when it arises outside the firm, and dependent when it arises from the firm’s own plans.
A distributor selling mower deck belts over the counter faces independent demand for them. The manufacturer who puts one belt into every deck it builds does not: the demand for belts is whatever the deck schedule says it is.
The distinction is not about the item. It is about the position. The same belt is independent demand at the distributor and dependent demand at the manufacturer, and the right way to plan it differs accordingly.
The forecast throws away information. The manufacturer wrote the deck schedule itself, and every belt it will need is implied by it. Replacing that with an extrapolation of past belt usage replaces a known quantity with an estimate of it, and the estimate can only be worse.
Dependent demand is lumpy. A deck assembly built in lots of 300 consumes belts in lots of 300: nothing for several periods, then 300 at once. A forecast fitted to that history produces an average, and an average is the one value the demand never takes.
For example, the belt requirement later today is 420 in one month and nothing at all four months later, and its mean, \(1{,}840/12 = 153.3\), occurs in no month at all.
Mower deck assembly (DA), lead time 1
Deck belt (B), 1 each, lead time 2
Spindle assembly (S), 2 each, lead time 1
Spindle housing (H), 1 each, lead time 2
Bearing (BR), 2 each, lead time 3
Bearing (BR), 1 each, lead time 3
A bill of material records what goes into what, and how many. The number on an arc is the quantity per: one deck assembly takes two spindle assemblies, and each of those takes two bearings.
Notice that the bearing hangs from two places. One idler bearing is fitted directly to the deck, and two more sit inside each spindle assembly. Thus, one deck consumes \(1 + 2 \times 2 = 5\) bearings.
An item must be planned once, and after every parent that consumes it. If the bearing were planned at level 1, its requirements would be netted against the stock on hand before the spindle assembly had asked for any, and the spindle assembly would then find the stock already spoken for.
Thus, each item carries a low-level code: the deepest level at which it appears anywhere in the structure.
| Item | Appears at level | Low-level code |
|---|---|---|
| Mower deck assembly, DA | 0 | 0 |
| Deck belt, B | 1 | 1 |
| Spindle assembly, S | 1 | 1 |
| Spindle housing, H | 2 | 2 |
| Bearing, BR | 1 and 2 | 2 |
Planning in low-level-code order, shallowest first, guarantees that every parent of an item has a plan before the item does: DA, then B and S, then BR and H.
Let item \(i\) be a parent of item \(j\), and let \(q_{ij}\) represent the number of \(j\) in one \(i\). Let \(\mathit{Rel}_{it}\) represent the quantity of \(i\) that the plan releases in period \(t\). Then the requirement \(j\) inherits in period \(t\) is
\[ G_{jt} = \sum_{i \in \text{parents}(j)} q_{ij} \, \mathit{Rel}_{it} . \]
Releases, not receipts
A parent needs its components in hand when it starts building, and the release is when it starts. Using the receipt row would ask for the components on the day the parent is finished, a whole lead time too late. This is the single most common error in a hand-worked explosion.
For the bearing the sum has two terms, because it has two parents: \(G_{\mathit{BR},t} = 1 \cdot \mathit{Rel}_{\mathit{DA},t} + 2 \cdot \mathit{Rel}_{S,t}\).
Every item gets a record: six rows over a common horizon, periods across the columns, the reverse of the dynamic lot sizing worksheets. Nothing in the arithmetic depends on the layout.
| Let… represent | Row | |
|---|---|---|
| \(G_t\) | gross requirement in period \(t\) | from the master schedule, or from the explosion |
| \(\mathit{SR}_t\) | scheduled receipt | already on order; arrives whether this plan wants it or not |
| \(I_t\) | projected on hand at the end of period \(t\) | |
| \(\mathit{NR}_t\) | net requirement | what is short after stock and receipts are counted |
| \(\mathit{POR}_t\) | planned order receipt | what the lot sizing rule decides should arrive |
| \(\mathit{Rel}_t\) | planned order release | the receipt moved back by the lead time |
and let \(L\) represent the lead time and \(\mathit{SS}\) the safety stock.
The release row is the record’s output. It is what the explosion reads at the next level down, and the only row the planner will act on.
\[ \begin{aligned} I_t &= I_{t-1} + \mathit{SR}_t + \mathit{POR}_t - G_t &&\text{the balance, with scheduled receipts added}\\ \mathit{NR}_t &= \max\left(G_t + \mathit{SS} - \mathit{SR}_t - I_{t-1},\; 0\right) &&\text{what is short, never negative}\\ \mathit{POR}_t &= \mathit{NR}_t &&\text{lot-for-lot; any other rule is larger and less frequent}\\ \mathit{Rel}_{t-L} &= \mathit{POR}_t &&\text{offset by the lead time} \end{aligned} \]
That is, net, lot size, and offset, in that order, in every period. The first line is the dynamic lot sizing balance equation with one term added.
A reader meeting the record for the first time usually leaves out the net requirement row, and the \(\max\) with it. Let’s take the deck assembly’s master schedule and carry the balance forward with \(\mathit{POR}_t = 0\) throughout.
| Period | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Gross requirements | 40 | 60 | 120 | 300 | 420 | 260 | 120 | 40 | 0 | 80 | 180 | 220 |
| Projected on hand | \(-40\) | \(-100\) | \(-220\) | \(-520\) | \(-940\) | \(-1{,}200\) | \(-1{,}320\) | \(-1{,}360\) | \(-1{,}360\) | \(-1{,}440\) | \(-1{,}620\) | \(-1{,}840\) |
The balance reaches \(-1{,}840\), the whole year’s requirement. That is correct arithmetic and a useless plan: it reports that if nothing is ordered then everything is short, which the reader knew.
Netting turns each shortage into an order. With nothing on hand and nothing on order, \(\mathit{NR}_t = G_t\) in every period, lot-for-lot sets \(\mathit{POR}_t = \mathit{NR}_t\), and \(I_t\) stays at zero throughout.
The \(\max\) only shows when there is stock to spare. Suppose the deck assembly ends period 5 with \(I_5 = 60\) on hand, and nothing is on order.
\[ \begin{aligned} \mathit{NR}_6 &= \max\left(40 + 0 - 0 - 60,\; 0\right) = \max(-20,\; 0) = 0 &&\text{the surplus is not a requirement}\\ I_6 &= 60 + 0 + 0 - 40 = 20 &&\text{the 20 carries into period 7}\\ \mathit{NR}_7 &= \max\left(60 + 0 - 0 - 20,\; 0\right) = 40 &&\text{period 7 needs only 40}\\ I_7 &= 20 + 0 + 40 - 60 = 0 &&\text{and the balance is back to zero} \end{aligned} \]
Without the \(\max\), lot-for-lot would plan a receipt of \(-20\) in period 6: it would cancel stock that period 7 is going to use. Netting turns each shortage into an order, and the \(\max\) stops a surplus being treated as a requirement.
The same item, opening with 60 on hand, lot-for-lot, lead time 1.
| Period | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|
| Gross requirements, \(G_t\) | 40 | 60 | 120 | 300 | 420 | |
| Scheduled receipts, \(\mathit{SR}_t\) | 0 | 0 | 0 | 0 | 0 | |
| Projected on hand, \(I_t\) | 60 | 20 | 0 | 0 | 0 | 0 |
| Net requirements, \(\mathit{NR}_t\) | 0 | 40 | 120 | 300 | 420 | |
| Planned order receipts, \(\mathit{POR}_t\) | 0 | 40 | 120 | 300 | 420 | |
| Planned order releases, \(\mathit{Rel}_t\) | 0 | 40 | 120 | 300 | 420 |
The check. What arrives must equal what is used, less what was there, plus what is left: \(0 + 40 + 120 + 300 + 420 = 880 = 940 - 60 + 0\). That check is worth performing every time, because it catches most netting errors immediately.
Safety stock is the \(\mathit{SS}\) term. It enters every period’s netting, but it raises only the first net requirement. Take an item ordered lot-for-lot, with nothing on hand or on order, whose first requirement falls in period \(t\):
\[ \begin{aligned} \mathit{NR}_t &= \max\left(G_t + \mathit{SS} - 0 - 0,\; 0\right) = G_t + \mathit{SS}, & I_t &= (G_t + \mathit{SS}) - G_t = \mathit{SS}\\ \mathit{NR}_{t+1} &= \max\left(G_{t+1} + \mathit{SS} - 0 - \mathit{SS},\; 0\right) = G_{t+1}, & I_{t+1} &= \mathit{SS} + G_{t+1} - G_{t+1} = \mathit{SS} \end{aligned} \]
Every later period repeats the second line. Thus, the plan holds \(\mathit{SS}\) permanently and plans around what is left.
Allocated stock is physically present but already promised elsewhere. It is handled by reducing the opening balance \(I_0\). Nothing else changes.
plan(bill of material, master production schedule):
assign every item its low-level code
sort the items by low-level code, shallowest first
for each item in that order:
if a master schedule speaks about this item:
G <- the master schedule
else:
G(t) <- sum over parents i of q(i, item) * Rel(i, t)
NR(t) <- max(G(t) + SS - SR(t) - I(t-1), 0)
POR <- the lot sizing rule applied to NR
I(t) <- I(t-1) + SR(t) + POR(t) - G(t)
Rel(t - L) <- POR(t)
return every item's record
Notice that the sort is what makes the sum over parents safe: by the time an item is reached, every parent of it already has a release row.
| Question | Answer |
|---|---|
| What is stocked? | Five items of one product structure: the deck assembly and what goes into it |
| What is the demand process? | Known, and computed: the master schedule for the deck assembly, and for every other item the releases of the items above it |
| When is inventory reviewed? | Once a month, over a common horizon |
| What triggers replenishment, and how much? | A net requirement in a month, ordered lot-for-lot |
| What happens to unmet demand? | None occurs; a requirement with no time left is a past-due release |
| What costs are incurred, and when? | A setup for every order; nothing is carried under lot-for-lot |
Nothing is on hand and nothing is on order. The master schedule carries the twelve-month pattern in months 6 through 17:
| Month | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Deck assemblies | 40 | 60 | 120 | 300 | 420 | 260 | 120 | 40 | 0 | 80 | 180 | 220 |
| Period | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DA gross requirements | 0 | 0 | 0 | 40 | 60 | 120 | 300 | 420 | 260 | 120 | 40 | 0 | 80 | 180 | 220 |
| DA releases, \(L = 1\) | 0 | 0 | 40 | 60 | 120 | 300 | 420 | 260 | 120 | 40 | 0 | 80 | 180 | 220 | 0 |
| B gross, \(1 \times\) DA releases | 0 | 0 | 40 | 60 | 120 | 300 | 420 | 260 | 120 | 40 | 0 | 80 | 180 | 220 | 0 |
| B releases, \(L = 2\) | 40 | 60 | 120 | 300 | 420 | 260 | 120 | 40 | 0 | 80 | 180 | 220 | 0 | 0 | 0 |
| S gross, \(2 \times\) DA releases | 0 | 0 | 80 | 120 | 240 | 600 | 840 | 520 | 240 | 80 | 0 | 160 | 360 | 440 | 0 |
| S releases, \(L = 1\) | 0 | 80 | 120 | 240 | 600 | 840 | 520 | 240 | 80 | 0 | 160 | 360 | 440 | 0 | 0 |
Each row is the one above it moved left by a lead time or multiplied by a quantity per. That is, lot-for-lot with nothing on hand makes every record a shift and a scale of the master schedule, and nothing else.
| Period | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| \(1 \times\) DA releases | 0 | 40 | 60 | 120 | 300 | 420 | 260 | 120 | 40 | 0 | 80 | 180 | 220 |
| \(2 \times\) S releases | 160 | 240 | 480 | 1,200 | 1,680 | 1,040 | 480 | 160 | 0 | 320 | 720 | 880 | 0 |
| BR gross requirements | 160 | 280 | 540 | 1,320 | 1,980 | 1,460 | 740 | 280 | 40 | 320 | 800 | 1,060 | 220 |
Notice the shape of the last row. It is not the shape of the master schedule, and it is not the shape of either contribution alone. Two streams on different offsets add to a pattern that looks nothing like the demand that caused it, peaking at 1,980 although no deck assembly is ever built in a quantity approaching that. And nobody forecast any of it.
The check. The row sums to \(9{,}200 = 5 \times 1{,}840\): five bearings for every deck assembly scheduled.
Under lot-for-lot no item carries anything from one period to the next, so every dollar is setup. Each item orders once in every period with a net requirement:
| Item | Orders | Setup | Cost | Why that many orders |
|---|---|---|---|---|
| Deck assembly | 11 | $500 | $5,500 | eleven months with a requirement |
| Deck belt | 11 | $300 | $3,300 | one per DA release |
| Spindle assembly | 11 | $250 | $2,750 | one per DA release |
| Spindle housing | 11 | $150 | $1,650 | one per S release |
| Bearing | 13 | $100 | $1,300 | months 4 to 16, from two parents |
| Total | 57 | $14,500 | every dollar of it setup |
That is the plan the next session improves on, and the way it improves on it is not the obvious one.
A record cannot release an order before period 1. If a receipt is due in period \(t\) and the lead time is \(L\), the release falls in \(t - L\), and when that is less than 1 the order is past due: the plan has found a requirement it no longer has time to meet.
Lead times accumulate down every path, so the horizon must lead the first requirement by the longest accumulation, the cumulative lead time:
| Path | DA to B | DA to BR | DA to S to H | DA to S to BR |
|---|---|---|---|---|
| Lead times | \(1 + 2 = 3\) | \(1 + 3 = 4\) | \(1 + 1 + 2 = 4\) | \(1 + 1 + 3 = \mathbf{5}\) |
Rerunning the whole explosion with the schedule moved earlier confirms it:
| Empty months in front of the schedule | 3 | 4 | 5 | 6 |
|---|---|---|---|---|
| Units the plan cannot release in time | 520 | 160 | 0 | 0 |
Five months of lead-in is exactly enough. Thus, the horizon used throughout is 17 months: five empty, then the twelve-month schedule.
Past-due orders at the bottom of a structure are usually not a data problem. They are a horizon problem.
Dependent demand is calculated, not forecast, and forecasting it discards information the firm already holds.
Low-level codes plan every item once, after all its parents.
The explosion reads releases, not receipts. Using receipts asks for components a lead time too late.
The record nets, lot sizes and offsets. The \(\max\) turns shortages into orders and stops a surplus being treated as a requirement; safety stock raises only the first net requirement.
Lot-for-lot costs $14,500 in 57 setups, and the bearing’s requirement looks nothing like the schedule that caused it.
The horizon must lead by the cumulative lead time down the deepest path: five months here.
Read before next session: What Lot Sizing Does to the Level Below, Distribution Requirements Planning, Nervousness and What Requirements Planning Assumes.
Today’s material was Demand You Should Not Forecast, The Bill of Material, The MRP Record and Running the Explosion.
Next session:
Bring the $14,500. Next session changes one rule on the deck assembly and watches everything below it move.