MCM520 ← 资料站首页 2019C 机场出租车智能调度(优秀范文 · 一) 打开交互阅读器 →

2019C 机场出租车智能调度(优秀范文 · 一)

本文为 2019 年国赛 C 题「机场出租车调度」的优秀级解法范文之一。全文手写,所有关键数字(图、正文、附录、数据工具)均源自统一模型 tools/gen_2019c.py,四路完全一致。范文一侧重问题一:基于报童模型的最优调度计划,并完整回答第二、第三问。

摘要

针对机场出租车调度中"乘客久候"与"车辆空驶"并存的矛盾,本文建立三层递进模型。问题一将每日 24 小时出租车需求视为带噪声的时间序列,以报童临界比 CR=wp/(wp+we)=0.800CR=w_p/(w_p+w_e)=0.800 确定安全系数,结合蓄车池库存机制给出逐时派车计划,使乘客等待率压至 2.35%2.35\%、空驶率 28.71%28.71\%。问题二用离散事件仿真对比"无管理(司机滞后自我调度)"与"最优计划":前者在早高峰造成平均 103103 分钟等待、单日流失 832832 名乘客,后者将等待降至 0.750.75 分钟、零流失。问题三引入对提前离场司机的"损失费"惩罚机制,三方满意度综合指标在惩罚 p∗=20p^*=20 元时达到峰值 0.69880.6988。模型以固定随机种子复现,结论稳健。本文所有图表与附录代码均可在统一代码库下重新生成,便于评审复算与后续迭代。

一、问题重述

某机场需对出租车进行统一调度,使到达旅客尽快乘上车、同时避免出租车空驶浪费。给定航班时刻表隐含的旅客到达规律,要求:

  • 问题一:制定一天内逐时的最优出租车调度计划(派多少车到机场)。
  • 问题二:分析现实因素(司机可提前离场、乘客久候流失)对调度效果的影响,并评价策略。
  • 问题三:设计对"空载离场司机"的惩罚机制,使乘客、司机、机场管理方三方尽可能满意。

二、模型假设与符号

符号 含义 取值/说明
μt\mu_t 第 tt 小时出租车需求均值 见正文序列
σt\sigma_t 需求标准差 0.18μt0.18\mu_t
wp,wew_p,w_e 等待/空驶成本权重 4.0/1.04.0 / 1.0
CC 单车载客数 44 人
ff 打车旅客占比 0.300.30
zz 安全系数(派车缓冲) 待优化

主要假设:①需求 hour 级均值已知(由历史航班拟合),日内随机波动服从正态分布;②出租车到达机场后可滞留蓄车池待客,池容上限 150150 辆;③乘客等待超过可忍阈值比例时改乘其他交通(流失)。

三、整体建模思路

全年调度可分解为"供给计划(问题一)→ 动力学仿真(问题二)→ 激励机制(问题三)"三层。问题一在"期望"层面用报童模型定出逐时供给;问题二在"随机动态"层面检验该计划能否扛住现实波动;问题三则弥补计划执行中司机的机会主义行为。三层共享同一需求序列与成本结构,保证四路一致。

图1 机场出租车调度系统总体框架

四、问题一:最优调度计划(报童模型)

4.1 需求刻画

由航班到达规律(落地旅客中约 30%30\% 打车、人均 44 人/车)拟合出 24 小时出租车需求均值序列(单位:辆/小时):

μ=[15,12,10,8,8,12,30,90,120,110,80,70,75,70,65,80,100,115,110,95,70,55,40,25]\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]

呈现明显的夜间低谷 + 早晚双高峰(早高峰 7–9 时、晚高峰 17–19 时)。仿真中采用一组固定随机种子生成的实测到达 AtA_t(见图 2),用于后续动力学检验。

图2 全天 24 小时出租车需求分布

4.2 报童临界比

每派一辆车到机场,若无人乘坐则产生空驶成本 wew_e;若需求未被满足则产生乘客等待(声誉)成本 wpw_p。这正是经典报童模型:最优安全库存对应的临界比

CR=wpwp+we=4.04.0+1.0=0.800CR=\frac{w_p}{w_p+w_e}=\frac{4.0}{4.0+1.0}=0.800

权重 wp=4w_p=4 显著大于 we=1w_e=1,反映"乘客久候损害机场声誉、后果远重于车辆空驶油耗"这一运营现实,因此模型天然偏向"多派车以防万一"。

对应标准正态分位数 z∗=Φ−1(0.800)≈0.842z^*=\Phi^{-1}(0.800)\approx 0.842。即"无蓄车池、每时独立"时,应按 μt+0.842σt\mu_t+0.842\sigma_t 派车。

4.3 逐时派车 (s,S)(s,S) 策略 + 蓄车池

现实中前一小时未用完的车可结转(蓄车池),故采用带库存的短视最优:

St=max⁡ ⁣(0, ⌈μt+zσt⌉−Lt−1),Lt=min⁡(μt+zσt−St, 150)S_t=\max\!\big(0,\ \lceil\mu_t+z\sigma_t\rceil-L_{t-1}\big),\qquad L_t=\min(\mu_t+z\sigma_t-S_t,\ 150)

其中 LtL_t 为蓄车池结转量。该式使当日总派车量仅略高于总需求,空驶被池中库存吸收。我们扫描 z∈[−0.5,2.0]z\in[-0.5,2.0] 得到权衡曲线(图 4):等待率随 zz 增大单调下降,空驶率单调上升。

图3 部署派车量 vs 实际需求

图4 安全系数 z 的等待—空驶权衡

由于蓄车池可跨时结转,实证最优 z=0.25z=0.25(而非理论 0.8420.842):池子吸收了大部分缓冲需求,额外派车的边际空驶成本已超过等待收益。表 1 给出三种方案的蒙特卡洛(200200 次)评估:

方案 派车总量 等待率 空驶率
朴素 z=0z=0 14651465 2.55%2.55\% 28.14%28.14\%
部署 z=0.25z=0.25 14661466 2.35%2.35\% 28.71%28.71\%
过度 z=1.5z=1.5 14721472 1.60%1.60\% 36.62%36.62\%

部署方案以几乎相同的派车量,将等待率压到最低且空驶率可控,综合成本最小。

带池机制的直观解释:以早高峰 t=8t=8(9 时)为例,需求 μ8=120\mu_8=120、σ8=21.6\sigma_8=21.6,目标供给 120+0.25×21.6≈125120+0.25\times21.6\approx125 辆;若上一小时蓄车池结转 L7=5L_7=5 辆,则当小时只需新派 S8=max⁡(0,125−5)=120S_8=\max(0,125-5)=120 辆,剩余的 55 辆池车继续结转。这样"池子"像水库一样削平逐时波动,使总派车量(14661466)仅比总需求(14421442)多 2424 辆缓冲,空驶被池吸收而非重复派车。对比之下,若每时独立、不依赖池,则须按理论 z∗=0.842z^*=0.842 派车,早高峰单时即需 120+0.842×21.6≈138120+0.842\times21.6\approx138 辆,全天累计空驶显著上升——这正是蓄车池把实证最优 zz 从 0.8420.842 拉低到 0.250.25 的根本原因。

图5 三种派车方案成本对比

4.4 蓄车池与预测误差敏感性

部署方案下蓄车池空闲车数随时间演化(图 6):双高峰前池子被消耗、高峰后小幅回补,整体平稳,说明库存机制有效削峰。预测误差敏感性(图 7)显示:当需求波动噪声 σnoise\sigma_{\text{noise}} 从 0.050.05 升到 0.250.25,等待率由 0.69%0.69\% 升至 3.98%3.98\%、空驶率由 11.56%11.56\% 升至 40.7%40.7\%——计划对预测精度有一定依赖,但 z=0.25z=0.25 的缓冲使其在中度噪声下仍稳健。值得注意的是,图 4 的权衡曲线在 z∈[0,0.5]z\in[0,0.5] 区间几乎平坦(成本 0.381→0.3820.381\to0.382),说明该区间内任一缓冲都接近最优;一旦 z>0.75z>0.75,空驶率急剧攀升、成本恶化,提示过度派车比略微保守危害更大,这与临界比 CR=0.8CR=0.8 偏向"宁空勿等"的直觉一致。

图6 蓄车池空闲车数随时间演化
图7 预测误差敏感性(部署方案)

五、问题二:排队动力学(简述,详见范文二)

将问题一的计划投入离散事件仿真。供给有两种来源:(a)最优计划 StS_t(依据当日预测);(b)无管理下司机按滞后 33 小时的历史需求自我调度(含少量实时观察)。结果(图 2/3 系列):

策略 平均等待 空驶率 单日流失乘客 总服务
最优计划 0.750.75 分钟 27.69%27.69\% 00 14401440
无管理(滞后) 103.21103.21 分钟 5.35%5.35\% 832832 13831383

无管理策略在早高峰(77–99 时)供给严重不足,排队量在 99 时堆积到 158158 辆待客、并持续数小时难以消化,平均等待高达 103103 分钟、单日流失 832832 名旅客;而最优计划将供给与需求逐时对齐,几乎所有旅客即到即走。这从动力学角度反证了问题一计划的价值——再优的"期望计划",若执行端司机各自为政,仍会崩溃。

六、问题三:惩罚机制(简述,详见范文三)

即便有最优计划,司机仍可能因短时无客而提前离场去市区,造成后续供给缺口。对此引入对提前离场司机的"损失费" pp。随 pp 升高:

  • 离场比例由 92.4%92.4\%(p=0p=0,近乎全部离场)单调降至 7.6%7.6\%(p=20p=20);
  • 乘客平均等待由 14.314.3 分钟降至 6.76.7 分钟;
  • 司机净收入在 p=20p=20 时达 27.0527.05 元/趟,乘客满意度 0.7550.755、管理方满意度 0.9770.977;
  • 三方综合满意度在 p∗=20p^*=20 元达到峰值 0.69880.6988。

惩罚费本质是用一笔小额"机会成本"锁住司机在场,把问题二的"无管理灾难"彻底化解,同时不显著侵蚀司机收入。

七、灵敏度与稳健性

  • 安全系数:权衡扫描确认 z=0.25z=0.25 为实证最优(图 4),理论 z∗=0.842z^*=0.842 仅在无池假设下成立。
  • 需求噪声:计划在中度预测误差下仍保持等待率 <4%<4\%(图 7)。
  • 滞后决策:司机滞后小时数越大,无管理策略越灾难(等待 32→17532\to175 分钟,见范文二图 6)。

问题一的完整决策链路可归纳为"需求拟合 → 报童临界比 → 带池 (s,S)(s,S) 派车 → 蒙特卡洛校验"四步(图 8),每一步均可由统一代码复现,是后续两问的供给基准。

图8 报童模型决策链路

八、模型评价

优点:①报童模型与库存机制结合,物理含义清晰、可解释;②离散仿真暴露了无管理调度的真实风险;③三层模型共用数据,四路一致、可复现。
局限:①需求序列为合理假设的合成数据,真实落地需接航班 API;②未细分上车点车道容量瓶颈;③三方满意度权重为主观设定。实际部署时,可把本文的 (s,S)(s,S) 派车表接入机场调度大屏,配合范文三的离场损失费,形成"计划—执行—激励"闭环;合成数据仅用于跑通方法,真实场景应以其替换并月度滚动更新。

九、参考文献

[1] 中国机场出租车调度问题(2019 国赛 C 题). 全国大学生数学建模竞赛组委会.
[2] Porteus E L. 报童模型与库存理论基础. Foundations and Trends in Operations Research.
[3] 机场陆侧交通需求预测方法综述. 交通运输工程学报.


附录:核心 Python 实现

import math, random

# 题目给定/合理常量
WP, WE = 4.0, 1.0          # 等待/空驶成本权重
QMAX = 150                 # 蓄车池容量
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 norm_inv_cdf(p):       # Acklam 逆 CDF 近似
    a=[-3.969683028665376e+01,2.209460984245205e+02,-2.759285104469687e+02,
        1.383577518672690e+02,-3.066479806614716e+01,2.506628277459239e+00]
    b=[-5.447609879822406e+01,1.615858368580409e+02,-1.556989798598866e+02,
        6.680131188771972e+01,-1.328068155288572e+01,1.0]
    c=[-7.784894002430293e-03,-3.223964580411365e-01,-2.400758277161838e+00,
        -2.549732539343734e+00,4.374664141464968e+00,2.938163982698783e+00]
    d=[7.784695709041462e-03,3.224671290700398e-01,2.445134137142996e+00,
       3.754408661907416e+00]
    pl, ph = 0.02425, 1-0.02425
    if p < pl:
        q=math.sqrt(-2*math.log(p)); return (((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5])/\
                                          ((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1)
    if p > ph:
        q=math.sqrt(-2*math.log(1-p)); return -(((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5])/\
                                           ((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1)
    q=p-0.5; r=q*q
    return (((((a[0]*r+a[1])*r+a[2])*r+a[3])*r+a[4])*r+a[5])*q / \
           (((((b[0]*r+b[1])*r+b[2])*r+b[3])*r+b[4])*r+b[5])

CR = WP/(WP+WE)                 # 临界比 0.800
z_theory = round(norm_inv_cdf(CR), 3)   # 0.842

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 eval_day(A, S):
    L=Wtot=Etot=Atot=Stot=0.0
    for t in range(24):
        avail=L+S[t]; serve=min(avail,A[t]); W=A[t]-serve
        E=max(0,S[t]-max(0,A[t]-L)); L=min(avail-serve,QMAX)
        Wtot+=W; Etot+=E; Atot+=A[t]; Stot+=S[t]
    return Wtot/Atot, Etot/Stot

def mc(mu, sigma, z, trials=200, seed=2019, noise=0.15):
    S=dispatch_plan(mu,sigma,z); rnd=random.Random(seed)
    ws=es=0.0
    for _ in range(trials):
        A=[max(0,round(mu[t]*(1+rnd.gauss(0,noise)))) for t in range(24)]
        w,e=eval_day(A,S); ws+=w; es+=e
    return ws/trials, es/trials

# 实证最优 z=0.25(蓄车池吸收缓冲,低于理论 0.842)
S_z = dispatch_plan(MU, SIGMA, 0.25)
w_z, e_z = mc(MU, SIGMA, 0.25)
w_n, e_n = mc(MU, SIGMA, 0.0)
w_o, e_o = mc(MU, SIGMA, 1.5)
print("CR=%.3f z_theory=%.3f" % (CR, z_theory))            # 0.800 0.842
print("z=0.25 等待率=%.2f%% 空驶率=%.2f%%" % (w_z*100, e_z*100))
print("z=0    等待率=%.2f%% 空驶率=%.2f%%" % (w_n*100, e_n*100))
print("z=1.5  等待率=%.2f%% 空驶率=%.2f%%" % (w_o*100, e_o*100))
# -> CR=0.800 z_theory=0.842
# -> z=0.25 等待率=2.35% 空驶率=28.71%
# -> z=0    等待率=2.55% 空驶率=28.14%
# -> z=1.5  等待率=1.60% 空驶率=36.62%