上一节,简单介绍了收益管理的背景。本节正式开始介绍收益管理中最简单的一类模型,single resource model。它只研究在某一个 leg 上如何实现最大化期望收益。

为了更好的说清楚 single resource model,以下有必要正式地阐述主要假设。

假设

  • 各个舱位 (票价等级) 共享同一个资源(座位)。这些舱位区别在于不同的折扣水平,和服务条款。
  • 每个需求都只为 1,即不考虑团体预定。
  • Yieldable demand. 每个顾客的需求不会因为舱位控制而改变。即不存在顾客本来要买高价格舱位,看到低价格舱位开放转而购买了低舱位,称为 buy-down 效应;也不存在本来只想买低舱位,但是由于低舱位关闭,被迫转而预定高舱位的 buy-up 效应。
  • Poisson arrival. 假设 demand arrival 是一个泊松过程(Poisson process)。
  • Risk neutral. 假设公司是风险中性的,也就是优化目标是最大化期望收益。

以上的假设又称作动态模型假设。既然有『动态』,肯定也有『静态』。静态模型假设主要是假定需求的到来严格按照从低到高的先后顺序,没有重叠。例如,出发前 3 个月到 1 个月,只有 Q 舱需求,1 个月到半个月,只有 M 舱需求,出发前两周内,只有 Y 舱需求。如此,需求仿佛被『固定』下来了,『动态』相对于『静态』,则并不假定需求的先后顺序。

静态需求模型有很多出名的算法,如 EMSR。本文重点在动态模型,就不扯歪了。

问题描述

总共 $C$ 个座位资源。 $n$ 个舱位,各自的票价为 $f_1 \geq f_2 \geq \dots \geq f_n$. 总共 $T$ 段时间,从前往后分别是 $1,\dots,T$. 舱位和时间的 index 分别用 $j$$t$ 表示。需求的到达是泊松过程,所以可以认为当时间划分的足够细,每一段时间内最多有一个需求到达。在时间段 $t$ 内,各个舱位需求到达的概率为 $p_{jt}$。 没有需求到达的概率为 $p_{0t}$。那么对每个 $t$ 必然有

j=1npjt=1p0t.\sum_{j=1}^n p_{jt} = 1 - p_{0t}.

我们的问题就是如何动态地控制各个舱位的开闭,使得期望收益最大化。

动态规划

动态模型(DP)可以很自然的用动态规划来表示。 用 $V_t(x)$ 表示处于时间 $t$ 时,还剩 $x$ 个座位的最大期望收益。设定边界条件:

VT+1(x)=0,x=0,1,,C,V_{T+1}(x) = 0, x=0,1,\dots,C,

Vt(0)=0,t=1,,T.V_t(0)=0, t=1,\dots,T.

DP 模型如下:

Vt(x)=j=1npjtmax{fj+Vt+1(x1),Vt+1(x)}+p0tVt+1(x)=j=1npjtmax{fj+Vt+1(x1)Vt+1(x),0}+j=1npjtVt+1(x)+p0tVt+1(x)=j=1npjtmax{fjΔVt+1(x),0}+Vt+1(x) \begin{aligned} V_t(x) &= \sum_{j=1}^n p_{jt} \cdot \max\Big\{f_j+ V_{t+1}(x-1), V_{t+1}(x)\Big\} + p_{0t} V_{t+1}(x) \\ &= \sum_{j=1}^n p_{jt} \cdot \max\Big\{f_j + V_{t+1}(x-1) -V_{t+1}(x), 0\Big\} + \sum_{j=1}^n p_{jt} V_{t+1}(x) + p_{0t} V_{t+1}(x) \\ &= \sum_{j=1}^n p_{jt} \cdot \max\Big\{f_j - \Delta V_{t+1}(x), 0\Big\} +V_{t+1}(x) \end{aligned}

以上第三步定义了 $\Delta V_{t+1}(x) := V_{t+1}(x) - V_{t+1}(x-1)$,其实际意义是在时间 $t+1$ 还剩 $x$ 个座位的情况下,增加一个座位的期望边际收益。另一种解释是,在时间 $t+1$ 还剩 $x$ 个座位的情况下,卖掉一个座位的机会成本。严格来说,以上两种解释并不是完全等价的,第一个看到的是多一个座位的收益,而第二个看到的是少一个座位的成本。然而我们可以认为这两个值近似相等。

事实上,以上 DP 还告诉我们了,任何时候,一个舱位 $j$ 的需求到来,最优的策略是,接受这个需求,当且仅当

fjΔVt+1(x).f_j \geq \Delta V_{t+1}(x).

于是,很形象的,$\Delta V_{t+1}(x)$ 在业界还有另一个名字,叫 bid price. 最优的策略是,任何时候,航司只接受票价高于 bid price 的舱位需求。

DP 的计算可以用 back recursion,即从起飞日算起(此时的 $V_{T+1}(x)=0$),逐渐往早算,直至最早的时间($t=1$).

具体的实施,是通过 DP,计算一个巨大的 bid price 表格,以剩余座位数为行,时间为列。对于任何一个到来的需求,只需要查找对应的 bid price,做一个比较,即可决定接受或拒绝该需求。

结构性质

Bid price $\Delta V_{t}(x)$ 有两个重要的边际价值递减性质,在 DP 的运算中可以充分利用以加速。

对任意 $x$$t$$\Delta V_{t}(x)$ 满足:
(1) $\Delta V_{t}(x+1) \leq \Delta V_{t}(x)$
(2) $\Delta V_{t+1}(x) \leq \Delta V_{t}(x)$

总结

对于动态模型,采用 DP 推导出的 bid price 控制,可以达到最优的期望收益。理论上,bid price 应当在每个需求到达后重新计算,以保持精确。实践中,一般将出发前的时间分段成大的几个 DCP (Data Collection Points),只在每个 DCP 才更新 bid price。

本文的模型只是很简单的 single-leg 模型。对很多大航司而言,大多数的票并不是按照一个 leg 一个 leg 卖的,而是打包成一个行程,比如从 A 到 B 到 C 的联程票。如何管理一个航班网络的座位资源,显然,问题变得复杂许多。下一节,将介绍考虑了网络效应的 network model。