Skip to content

Expected Marginal Seat Revenue (EMSR) Actions

ExpectedMarginalSeatRevenue

Bases: RmAction

EMSR (Expected Marginal Seat Revenue) is a leg-based optimization algorithm.

The EMSR (Expected Marginal Seat Revenue) algorithm is a widely adopted heuristic for capacity allocation in revenue management, primarily used to determine how many seats to protect for higher-fare classes in a restricted product marketplace. It works by calculating a booking limit for each fare class, starting with the lowest, to maximize expected revenue.

The "A" algorithm compares each class individually, and is not generally used in practice. The "B" algorithm, often called EMSR-B, aggregates displaced low-fare passengers. This method uses Littlewood's rule with the aggregate demand and average fare to statistically determine optimal protection levels for the remaining higher-priced inventory, effectively balancing the risk of selling a seat cheaply now versus the potential of selling it at a higher price later.

Applying the EMSR algorithm requires a forecast of leg demand by fare class. Protection levels are updated at each decision control point (DCP) based on the latest sales and demand forecasts, allowing for dynamic adjustment to changing booking patterns.

requires class-attribute instance-attribute

requires: set[str] = {'leg_forecast'}

frequency class-attribute instance-attribute

frequency = 'dcp'

OPT class-attribute instance-attribute

OPT = EMSR()

variant instance-attribute

variant = variant

EMSR variant to use: "a", "b", or "c".

cabins instance-attribute

cabins = cabins

Optional list of cabin codes to optimize.

If not provided, this tool will optimize on the leg as a whole.

snapshots instance-attribute

snapshots = []

Optional list of snapshots to grap when running this action.

__init__

__init__(
    *,
    variant: Literal["a", "b", "c"] = "b",
    carrier: str = "",
    cabins: str | list[str] | None = None,
    minimum_sample: int = 10,
    snapshots: Collection[SnapshotFilter | dict] = (),
    cfg: Config | None = None,
)

run

run(sim: Simulation, days_prior: int)