Assortment Planning
MNL choice model · Revenue-ordered property
Select which subset of \(N\) candidate SKUs to carry in the assortment, subject to a shelf-capacity constraint, to maximise expected revenue under the multinomial-logit (MNL) choice model. The landmark result of Talluri & van Ryzin (2004) is that under MNL with a capacity constraint, the optimal assortment is revenue-ordered — sort SKUs by price, add in order, and stop when marginal revenue turns negative. Reviewed comprehensively by Kök, Fisher & Vaidyanathan (2008/2014); modern generalisations include nested and mixed logit.
Why it matters
The merchandise-mix decision under customer choice
Where the decision sits
Category planning · upstream of shelf, pricing, and replenishment
Assortment planning is the merchandise-mix decision: from a wider universe of candidate SKUs, pick the subset to carry in the category. It sits upstream of shelf-space allocation (which decides how many facings per carried SKU) and of markdown, grocery ordering, and newsvendor problems (which operate on the already-chosen mix). The retail-OR framing requires a customer-choice model because stock-out or omission substitution shifts demand across SKUs; without it, the problem is a plain knapsack and misses the structural effect (Kök & Fisher 2007).
Problem & formulation
MNL-based assortment optimisation with capacity constraint
Sets and parameters
| Symbol | Meaning | Unit |
|---|---|---|
| \(i \in \mathcal{N}\) | Candidate SKU (\(|\mathcal{N}| = N\)) | finite |
| \(r_i\) | Retail price (or gross margin) of SKU \(i\) | $ / unit |
| \(u_i\) | Utility / attractiveness of SKU \(i\) (log-scale) | real |
| \(u_0 = 0\) | Utility of the no-purchase option (normalisation) | real |
| \(C\) | Shelf capacity (max SKUs in assortment) | integer |
Decision variable
| Symbol | Meaning | Domain |
|---|---|---|
| \(S \subseteq \mathcal{N}\) | Assortment: subset of SKUs to carry | \(|S| \leq C\) |
MNL choice probabilities
Under the multinomial-logit choice model (Ben-Akiva & Lerman 1985; Train 2009), a customer facing assortment \(S\) purchases SKU \(i \in S\) with probability:
\(P_0(S)\) is the no-purchase probability. The denominator \(1 + \sum_{j \in S} e^{u_j}\) increases with every added SKU, so adding items reduces each incumbent's probability — the cannibalisation mechanic of MNL.
Objective
Maximise expected revenue per arriving customer:
Revenue-ordered optimum (Talluri & van Ryzin 2004)
Under MNL with or without capacity, the optimal assortment is revenue-ordered: sort SKUs by price \(r_{(1)} \geq r_{(2)} \geq \cdots \geq r_{(N)}\). The optimal \(S\) is a prefix of this sorted list:
A critical-revenue condition: adding SKU \((k+1)\) is profitable iff \(r_{(k+1)} > R^{\ast}_k\) (the current optimal revenue); stop at the first SKU whose price falls below the running revenue. Complexity \(\mathcal{O}(N \log N)\) for the sort plus \(\mathcal{O}(N)\) for the scan.
Limitations of MNL
MNL satisfies the Independence of Irrelevant Alternatives (IIA) axiom, which means adding a new SKU shifts demand from all incumbents in proportion to their current share. When customers perceive some SKUs as closer substitutes than others (e.g., all diet sodas vs. regular), IIA is violated and nested-logit or mixed-logit is needed. Under those richer models the revenue-ordered property breaks and the problem is NP-hard (Rusmevichientong, Shen & Shmoys 2010).
Real-world → OR mapping
| In the category office | In the MNL model |
|---|---|
| Candidate SKUs (vendor offerings, incumbents, new items) | \(\mathcal{N}\) |
| Ticket price (or gross margin) of each SKU | \(r_i\) |
| Attractiveness (brand strength, features, past sell-through) — estimated from past assortment tests | \(u_i\) |
| Category base-rate “no purchase” (customer walks away) | \(u_0\) |
| Shelf / page slots available | \(C\) |
| Chosen assortment this season | \(S\) |
| Forecast per-customer revenue | \(R(S)\) |
| “What happens if we drop this SKU” test | \(R(S) - R(S \setminus \{i\})\) |
Interactive solver
Revenue-ordered MNL assortment with capacity constraint
Candidate SKUs (edit price and utility)
Under the hood
The solver sorts the 8 SKUs by price descending, then computes the MNL revenue \(R(S_k) = \sum_{i \leq k} r_{(i)} e^{u_{(i)}} / (1 + \sum_{j \leq k} e^{u_{(j)}})\) for each prefix \(k = 1, \ldots, \min(N, C)\). The optimal \(k^{\ast}\) is the argmax. Under MNL with a capacity, the Talluri-van Ryzin revenue-ordered result guarantees this prefix-enumeration finds the global optimum — no need for exhaustive subset search over \(2^N\) possibilities. Complexity \(\mathcal{O}(N \log N)\) including the sort.
Reading the solution
Three patterns to watch for
- High-price SKUs anchor the assortment. The revenue-ordered property says we always include the highest-priced SKU. Adding a low-priced alternative reduces incumbents’ probability and may hurt revenue even if the low-priced SKU has high utility.
- Capacity rarely binds in practice. The unconstrained optimum is often smaller than \(C\) — because each added SKU cannibalises, the “more is better” intuition from pre-MNL assortment thinking is wrong. A good assortment is curated, not stuffed.
- The marginal cutoff. The running revenue \(R^{\ast}_k\) is itself the “price floor” for marginal additions — add SKU \((k+1)\) only if \(r_{(k+1)} > R^{\ast}_k\). This gives category managers a clean decision rule.
Sensitivity questions the model answers
- What if we add a new “flagship” SKU at price $80 with utility 1.0? — it becomes the new anchor; everything below it re-sorts.
- What if the no-purchase utility \(u_0\) rises (customers more willing to walk)? — the assortment should shift toward higher-utility SKUs to retain customers.
- What if capacity is reduced from 4 to 2? — the assortment drops the two lowest-price items; revenue falls by approximately their marginal contributions.
Model extensions
Nested logit
Groups of similar SKUs have correlated utilities. Revenue-ordered within a nest; allocation across nests via a higher-level logit. Davis, Gallego & Topaloglu (2014).
Mixed logit (heterogeneous customers)
Consumer utilities vary by segment. NP-hard in general; Rusmevichientong-Shen-Shmoys (2010) give constant-factor approximations.
Capacity & shelf coupling
Joint decision: which SKUs AND how many facings each gets. Cross-links to shelf-space allocation.
Personalised assortment
Different assortments for different customer segments (e-com homepage, store profile). Sub-problem per segment.
Personalisation →Dynamic assortment
Assortment changes within a season based on observed sales. Bandit framing; see Caro & Gallien (2007).
Assortment + pricing
Jointly pick \(S\) and prices \(r_i\). The MNL structure gives closed-form optimal prices when utilities are linear in price.
Markdown optimisation →Fashion buying (pre-season)
Assortment choice for short-lifecycle fashion; combined with the newsvendor buy quantity.
Fashion buying →Omnichannel assortment
Assortment differs online vs. in-store; customer can substitute across channels. Research frontier.
Key references
Back to the retail domain
Assortment planning sits in the Product × Tactical cell of the 4P decision matrix — upstream of every other retail merchandise decision.
Open Retail Landing