A graduate group project where five of us built a simulation model to find the "right" number of airline seats to sell — first in a vacuum, then with a customer-satisfaction constraint, and finally against a competitor who could undercut us.
Team: David Chen, Kristy Gao, Chetan Sarda, Robbie Wu, Jordan Yang
Course: UBC MBAN, BAMS 503 (Decision Analytics)
Tech: Python (NumPy, custom simulation harness), scenario analysis, sensitivity analysis
Airline revenue management was the first place I ever saw "real-world optimization" stop being an abstract textbook exercise and start looking like a decision someone actually has to make on a Tuesday morning. Every seat on a plane is a perishable inventory unit — once the door closes, an empty seat is worth zero forever. But every seat you sell too early at a cheap leisure fare is one you couldn't later sell to a business traveller at three times the price. That tension is why the problem is interesting: there's no clean right answer, only a distribution of outcomes you're trying to shape.
I picked this as a group project because I wanted a setting where I couldn't just throw a scikit-learn model at the problem and call it done. Revenue management forces you to confront the structure of the decision itself — how demand actually behaves, how no-shows correlate, what happens when your competitor isn't stationary. It's also the kind of problem I expect to see again in my career (health-system capacity planning has the same bone structure — finite resource, stochastic demand, real cost to over- and under-allocation), so the modelling habits I build here should compound.
The group was Chetan Sarda plus four collaborators: David Chen, Kristy Gao, Robbie Wu, and Jordan Yang. We were the BAMS 503 "Group 9," and the full report PDF (linked in the Code section) is where our individual ownership of sections is recorded verbatim.
Airlines overbook. Everyone knows this, but the why is subtler than "they're greedy." It's that a meaningful fraction of booked passengers don't show up — business travellers cancel last-minute at much higher rates than leisure travellers — and if the airline treated every booking as a committed seat, every flight would depart with empty rows of paid-for seats generating zero revenue. So they oversell, and occasionally they have to bump passengers. Sometimes people volunteer (for a voucher); sometimes they don't, and the airline has to involuntarily deny boarding, which is expensive both in hard cash compensation and in soft reputational damage.
The decision variables we modelled were small but loaded:
Everything else — demand, no-show rates, denied-boarding frequencies, competitor behaviour — was stochastic. We put distributions on the inputs, ran tens of thousands of simulated flights per candidate policy, and searched for the (tickets, reserved) pair that maximised expected profit under each scenario.
We tested three different worlds, because the "optimal policy" is only meaningful relative to what you assume about the market you're in.
Scenario 1 — Basic. Pure revenue maximisation. Involuntary denied boardings are allowed; they just show up as a line in the cost function ($2,000 per IDB — much more expensive than a $800 voluntary bump, because the airline has to compensate a passenger who didn't consent to being removed). This is the "textbook" revenue-management problem.
Scenario 2 — Customer-satisfaction constrained. Same revenue objective, but with a hard constraint: zero involuntary denied boardings. This is what an airline with a brand that lives and dies on customer experience (think premium carriers) would actually operate under. The question becomes: how much revenue do you give up to buy that zero-IDB guarantee?
Scenario 3 — Competitive market. Introduce a single competitor whose prices are drawn from a normal distribution around our own — SD of 20% for business fares, 50% for leisure fares (leisure is more price-sensitive and the market is more chaotic). Demand then adjusts via a linear price-elasticity term (k = 1.5): when the competitor undercuts us, some of our demand evaporates; when they overprice, we capture theirs. Now we're no longer in a single-agent optimisation — we're in a noisy game.