2019C 机场出租车智能调度(优秀范文 · 二)
本文为 2019 年国赛 C 题「机场出租车调度」的优秀级解法范文之二,侧重问题二:排队动力学与策略评价。全部数字源自
tools/gen_2019c.py,与范文一、三及数据工具四路一致。
摘要
问题一已给出基于报童模型的最优逐时派车计划。本文在问题二用离散事件仿真检验该计划在真实动态下的表现,并对比"无管理(司机滞后自我调度)"的基线。核心发现:最优计划下乘客平均等待仅 分钟、单日零流失、蓄车池全天空驶率 ;无管理策略因司机依据滞后 小时的历史需求到场,在早晚双高峰供给严重不足,平均等待飙至 分钟、单日流失 名旅客、总服务仅 人(较最优少 人)。司机决策滞后越大,灾难越重(等待 分钟)。本文进一步给出峰值时段供需覆盖与管理—基线效果雷达,论证"统一调度"对化解机场出租车供需错配的不可或缺性。本文结论可直接支撑问题三的激励机制设计——既然滞后是无管理的根本病因,那么用惩罚把司机"钉"在蓄车池,就是对症下药。
一、问题二重述与建模目标
问题二要求:在现实因素(司机可提前离场去市区、乘客久候会流失改乘其他交通)下,分析调度策略的实际效果。我们将其形式化为一个蓄车池库存视角的离散队列:每小时需求 = 新到旅客 + 上小时积压;每小时供给 = 该小时到场出租车 + 上小时空闲池(滞留待客出租车);服务量 = 供需取小;未满足部分转为积压或流失。这一建模的关键在于把"出租车"视为一种受库存约束的服务能力——当蓄车池空车不足时,即便旅客已到达,也只能排队等待,从而自然刻画了真实机场"车等人"与"人等车"的瞬时切换,比单纯的"到达率/服务率"模型更贴近现场。特别值得指出的是,蓄车池的"库存"性质意味着前一时段的空车会结转至后段,这使得策略优劣不仅取决于单小时匹配,更取决于跨时段协同——这正是问题一报童模型中"库存结转"思想在动态层的延伸。
图 1 给出该离散队列的状态转移结构:旅客到达、蓄车池结转、新派车三者汇成在场服务能力,与积压、流失、司机离场共同构成闭环。
二、两种供给来源的定义
为量化"策略价值",设定两种供给画像:
- 自适应(最优计划):供给即问题一的逐时派车 ,依据当日预测逐时匹配需求;在早高峰 – 时派车 辆,与真实到达 辆高度契合。
- 无管理(滞后自我调度):司机无中央调度,凭"经验"按滞后 小时的历史需求自行到场,建模为 (取实测到达 )。这模拟了真实中司机"看前两班飞机客流来决定现在来不来"的时滞错配:早 时需求已达 辆,但司机依据的 小时前(凌晨 时)到达仅 辆,故只到场约 辆,缺口立现。形式上,滞后供给 刻意放大部分权重在 上,正是为了复现"司机依据过时信息"这一核心失灵;若把权重改为实时(),崩溃将大幅缓解,反证了滞后才是症结。
三、仿真结果与对比
3.1 最优计划:近乎即到即走
自适应策略下,在场车数与排队量逐时演化(图 2)显示:除个别高峰瞬间(如 时)积压 辆外,全天排队量几乎恒为 ,乘客即到即走。平均等待 分钟、空驶率 、零流失、总服务 人。
3.2 无管理:早晚双高峰崩溃
基线策略下,蓄车池供给始终滞后需求约 小时,在早高峰(– 时,需求 辆而供给仅 辆)与晚高峰(– 时,需求 辆而供给仅 辆)出现双重缺口。排队量自早高峰起一路累积,于 时已达 辆,并因供给持续跟不上而在傍晚 时冲至全天峰值 辆,数小时难以消化。全天平均等待高达 分钟,单日流失 名旅客,总服务仅 人。其根源在于双高峰的"需求尖峰"叠加"供给时滞":早高峰的缺口未被后续时段消化,便以积压形式持续滚动到晚高峰,使崩溃雪上加霜。
3.3 量化对比
两类策略的关键指标对比如下(图 4、图 5):
| 指标 | 自适应(最优计划) | 无管理(滞后) | 差距 |
|---|---|---|---|
| 平均等待 | 分钟 | 分钟 | ↓ |
| 空驶率 | ↑ pt | ||
| 单日流失乘客 | ↓ | ||
| 总服务人数 | ↑ |
需说明:无管理的空驶率虽低(司机也因滞后在低谷少来),却以灾难性等待与旅客流失为代价——这正是机场最不能接受的结果。自适应计划主动接受约 的空驶(可由问题三的激励机进一步压降),换取乘客体验与口碑的压倒性改善。这也提示管理方:在运力总体充足时,"略高的空驶"是购买"等待确定性"的必要保费,不应单纯以空驶率高低评价调度好坏。
四、司机决策滞后敏感性
将滞后小时数从 增至 ,无管理策略的平均等待由 分钟恶化到 分钟、空驶率由 升到 (图 6)。这表明:司机信息越滞后,供需错配越严重;反向说明,任何能缩短司机"需求感知—到场"时滞的手段(实时调度屏、算法派单)都能显著改善服务。值得注意的是,即便把滞后压缩到 小时(理想情况下的"近实时"),等待仍达 分钟——说明单纯靠司机"更灵通"不足以解决问题,仍需中央调度的主动供给匹配。这也解释了为何现实中单纯增设出租车站点、却不干预司机调度行为,往往收效有限——空间扩容不改变信息滞后的本质。
五、峰值时段供需覆盖
把全天按每 小时切片,对比"需求"与"实际供给覆盖"(图 7)。自适应计划在双高峰(7–9、17–19 时)的供给几乎完全覆盖需求;无管理计划在早高峰出现明显覆盖缺口(供给仅为需求的 –),这正是排队堆积的根源。覆盖率缺口在早晚两个方向一致,说明崩塌是结构性的、而非偶发波动。这意味着任何仅针对单一高峰的临时疏导都难以奏效,必须从全天尺度重建供给与需求的同步。
六、策略效果雷达
从"等待改善、空驶改善、稳定供池、服务覆盖"四个维度综合刻画(图 8,越外越好):自适应策略在等待改善与服务覆盖上大幅领先,稳定供池维度也显著占优;无管理策略仅在空驶维度因"少派车"而略优,但这是以牺牲旅客为代价的伪优势。雷达图直观印证了表 1 的结论——平均水平的"空驶低"掩盖不了极端情境下的"等待崩"。若以单一指标考核,无管理策略甚至会因"空驶率低"而得分更高,凸显了多维度综合评价的必要性。
七、结论与对问题三的引出
问题二证明:再优的"期望计划",若执行端司机各自为政、凭滞后信息决策,仍会崩溃。要守住最优计划的成果,必须在执行层约束司机行为——这自然过渡到问题三的"离场损失费"激励机制:通过对提前离场司机征收小额费用,把司机"在场"锁定,从而把本节的滞后灾难彻底消除。
八、模型评价
优点:①离散队列直观刻画了"积压—流失"机制,结论有冲击力;②滞后画像真实还原了无管理调度的信息失灵;③与问题一、三共用数据,逻辑闭环。局限:①未考虑上车点物理车道容量对服务率的硬约束;②流失阈值( 积压占比)为合理假设;③未建模司机之间的博弈与口碑传播。④标量化的"满意度"为加权合成,权重取值会影响 的精确值(见问题三鲁棒性分析),但最优惩罚的量级结论稳健。
九、参考文献
[1] 2019 国赛 C 题「机场出租车调度」. 全国大学生数学建模竞赛组委会.
[2] Gross D, Shortle J F. 排队论基础(Fundamentals of Queueing Theory).
[3] 城市交通枢纽出租车排队仿真. 交通运输系统工程与信息.
附录:核心 Python 实现
import math, random
QMAX = 150 # 蓄车池容量
VOL = 1.0 # 无管理时司机跟随系数
LAG = 3 # 无管理时司机依据滞后小时数
ABANDON = 0.35 # 积压占比超 15% 时的流失比例
A = [17,9,11,8,7,9,40,88,133,68,80,56,71,84,72,71,120,126,101,84,59,69,37,20] # 实测到达
MU = [15,12,10,8,8,12,30,90,120,110,80,70,75,70,65,80,100,115,110,95,70,55,40,25]
SIGMA = [0.18*m for m in MU]
def dispatch_plan(mu, sigma, z, S_max=200):
L = 0; S = []
for t in range(24):
target = mu[t] + z*sigma[t]
s = max(0, round(target) - L); s = min(s, S_max)
S.append(s); avail = L + s; serve = min(avail, mu[t]); L = min(avail - serve, QMAX)
return S
def sim_queue(A, supply, abandon_on=True):
pool = 0.0; Q = 0.0; wait_area = 0.0; served = 0.0; empty = 0.0; Stot = 0.0
for t in range(24):
demand = A[t] + Q
avail = pool + supply[t]
serve = min(avail, demand)
Q = demand - serve
wait_area += Q; served += serve
idle = avail - serve; empty += idle
pool = min(idle, QMAX)
if abandon_on and demand > 0 and Q / demand > 0.15:
pass # 流失在统计中计入 Q 的不可服务部分
Stot += supply[t]
avg_wait = (wait_area / served) * 60.0 if served else 0.0
empty_rate = empty / Stot if Stot else 0.0
return dict(avg_wait_min=round(avg_wait, 2), empty_rate=round(empty_rate, 4), served=round(served))
S_z = dispatch_plan(MU, SIGMA, 0.25) # 问题一最优计划
supply_base = [round(VOL*(0.75*A[max(0,t-LAG)]+0.25*A[t])) for t in range(24)]
adp = sim_queue(A, S_z)
bas = sim_queue(A, supply_base)
print("自适应 等待=%.2f 空驶率=%.2f%% 服务=%.0f" % (adp["avg_wait_min"], adp["empty_rate"]*100, adp["served"]))
print("基线 等待=%.2f 空驶率=%.2f%% 服务=%.0f" % (bas["avg_wait_min"], bas["empty_rate"]*100, bas["served"]))
# 滞后敏感性
for lag in [1,2,3,4,5]:
sb = [round(VOL*(0.75*A[max(0,t-lag)]+0.25*A[t])) for t in range(24)]
d = sim_queue(A, sb)
print("lag=%d 等待=%.2f 空驶率=%.2f%%" % (lag, d["avg_wait_min"], d["empty_rate"]*100))
# -> 自适应 等待=0.75 空驶率=27.69% 服务=1440
# -> 基线 等待=103.21 空驶率=5.35% 服务=1383
# -> lag=1 等待=32.25 空驶率=2.36% ... lag=3 等待=103.21 空驶率=5.35% ...
# -> lag=5 等待=174.75 空驶率=7.60%