9. Distribution MEIO and Serial Simulation
The previous chapter introduced multi-echelon inventory optimization (MEIO) and the simplified guaranteed-service risk-period model for a serial chain. This lesson extends that toolkit in two directions that appear constantly in practice:
- Distribution networks — one upstream node can serve several downstream branches (a central warehouse feeding stores or regions).
- Policy simulation — turn local and echelon targets into a short, inspectable time loop so you can check service before trusting a spreadsheet answer.
Original teaching rewrite for this course. Numbered network examples are constructed for the drills below; they mirror the structure of classic GSM results without reprinting a commercial textbook.
Distribution topology under guaranteed service
In a distribution network each node has at most one supplier, and possibly many customers. A common pattern is:
- Node 1: central stocking point (incoming lead time )
- Node 2: regional hub fed by node 1 (incoming lead time )
- Nodes 3–5: demand-facing sites fed by node 1 or node 2 (incoming lead times )
Under the same GSM assumptions used for serial chains (aligned review period , deterministic lead times, bounded demand with an explicit exception response), Inderfurth-type results say that a distribution network can still be optimized by checking a small set of all-or-nothing buffer placements: each candidate stocking point either covers the full risk segment back to the next upstream buffer, or holds none.
For a three-echelon distribution sketch with five nodes, four representative placements are enough to illustrate the idea (not every industrial network collapses to four cases, but the search tree stays small compared with a naïve continuous allocation).
Risk-period table for a concrete sketch
Take and . Label nodes upstream → branches as . Four feasible placements (periods of demand protected by safety stock at each node) are:
| Case | Idea | |||||
|---|---|---|---|---|---|---|
| 1 | 4 | 2 | 2 | 2 | 2 | Buffer at every echelon |
| 2 | 4 | 0 | 2 | 3 | 3 | Skip the regional buffer; branches absorb more |
| 3 | 0 | 6 | 5 | 2 | 2 | Push the first buffer to the hub |
| 4 | 0 | 0 | 5 | 7 | 7 | Hold only at demand-facing sites |
Each row covers the network’s exposure: demand nodes always include , and a “transparent” intermediate node () shifts protection onto its downstream clients. The arithmetic is the same as the serial lesson once each node’s is known:
Use the local demand standard deviation at that node (see pooling below). Minimizing total units is again not the same as minimizing holding cost when rises downstream.
The serial lesson’s cost explorer still applies once each node’s and are set—compare holding-cost weighted cases rather than raw unit totals.
Demand pooling at aggregation nodes
A regional or central node does not see a single store’s demand; it sees the sum of branch demand that flows through it.
If branch demands are independent and Normal,
If branches are positively correlated, the hub variance is larger than the independent case; if negatively correlated, it is smaller. When distributions differ (Normal at one branch, gamma at another) or correlation is unknown, estimate the hub series directly from historical throughput rather than assuming independence.
Pooling is one reason MEIO often places less safety stock upstream than a naive sum of store-level buffers would suggest—provided the shared demand model is honest.
Quick pooling check
Stores A and B have independent weekly demand with and . The hub that serves both has mean and SD under independence—not . Using as the hub SD would overstate the buffer.
Serial simulation: why “almost 95%” still happens
Even with GSM risk periods chosen for cycle service , a multi-node simulation often shows slightly lower measured cycle service at intermediate placements than at “all stock downstream.” Upstream nodes are themselves imperfect; a demand-facing node protected only against its local segment still feels occasional shortages of supply from above. When every unit of risk is pooled at the customer-facing site and the external supplier is modeled as perfectly reliable, the measured cycle service matches the Normal calculation more closely.
That gap is a reminder: spreadsheet GSM is a planning approximation. Simulation (or field measurement) remains the check on service, fill rate, and exceptional-response volume.
Timing conventions used in the drill
For a short serial simulator with sites ordered upstream → downstream:
- Advance on-hand by receipts due this period.
- Consume final demand at the last site; record a stockout period if on-hand goes negative (or lost sales, if you clamp at zero).
- For each site from upstream to downstream (or reverse, consistently), compute echelon inventory = sum of on-hand and in-transit for that site and all downstream sites.
- Order up to the echelon target , but for every site except the external supplier, cap the order by stock available at its immediate supplier.
The previous chapter already built from local . The drill below focuses on one update step of that loop.
Practice
Concept check
Distribution networks and pooling
1 / 4In a distribution network under the simplified GSM idea, what does an intermediate x_i = 0 mean?
Pick an answer to see if you are right.
Rank the distribution analysis
From network sketch to costed cases
1 / 1A distribution sketch, lead times, R, branch demand models, and holding costs are given.
OrderDrag the handle to rearrange — top should be first.
- 1Compute SS_i = z σ_{d,i} sqrt(x_i) and holding cost Σ h_i SS_i for each case.
- 2List a small set of feasible all-or-nothing risk-period allocations that cover the network.
- 3Estimate demand mean and SD at each node, pooling branches where they aggregate.
- 4Choose by cost (or service trade-off), then validate with simulation or history.
Drag items into the correct order (or use ↑↓), then check.
Python practice: pool independent Normal branches
Implement hub_demand_moments(means, sds) for independent Normal branches. Return (hub_mean, hub_sd) with floating results.
Python practice: one serial echelon order step
Given local on-hand by site (upstream → downstream), in-transit totals by site (already summed over pipeline positions), and echelon targets , compute orders where echelon inventory is the sum of on-hand and in-transit from through the demand end. Then, from upstream to downstream, cap every site except the external supplier by the supplier’s current on-hand (do not model consumption of that on-hand beyond the cap for this drill).
| Site | On-hand | In-transit | Echelon target |
|---|---|---|---|
| Upstream | 300 | 0 | 1224 |
| Middle | 250 | 0 | 742 |
| Demand-facing | 100 | 0 | 371 |
Raw shortfalls are , , ; after caps by supplier on-hand they become , , .
Takeaways
- Distribution MEIO under GSM still uses sparse all-or-nothing placements; the hard part is honest demand at aggregation nodes.
- Independent Normal branches pool by adding variances, not standard deviations.
- Serial simulation explains why upstream buffers can leave measured cycle service a little short of the Normal plan.
- Cap echelon orders by real supplier availability; unconstrained shortfalls are planning signals, not guaranteed shipments.
Previous: Multi-Echelon Inventory Optimization.
Next: Newsvendor Model — one-period order quantity with discrete demand and the critical ratio.