机场出租车调度问题的数学建模与仿真实现
机场出租车调度是典型的运筹优化问题,涉及乘客等待时间、司机收益与机场管理效率的多目标平衡。本文以 2019 年全国大学生数学建模竞赛 C 题为例,拆解如何通过排队论与博弈论构建模型,并提供 Python 仿真代码供参考。
问题背景
在机场场景中,出租车通常在"蓄车池"排队候客。管理人员采集乘客目的地信息后,会对短途乘客(距离小于阈值 d)给予补偿或优先安排。司机则面临选择:加入短途通道(接客快但收入低)还是普通通道(等待久但可能接长途)。核心目标是设计调度方案,在各方利益间找到平衡点。
核心模型
排队论基础
系统主要受乘客到达率、出租车到达率及服务时间影响。飞机班次有固定规律但也存在延误,乘客出站时间随机,路况导致出租车到达具有波动性。
假设乘客到达率为 λ_p,出租车到达率为 λ_d,短途比例为 ρ,服务平均时间为 1/μ。经典的 M/M/1 模型可估算平均等待时间:
W_q = λ / (μ(μ - λ))
该公式过于简化,实际场景需引入优先级机制。对于短途乘客设置专用通道,采用非抢占式优先排队模型:
W_q_short = (λE[S^2]) / (2(1 - ρ_short))
W_q_long = (λE[S^2]) / (2(1 - ρ_short)(1 - ρ_short - ρ_long))
其中 S 为服务时间,ρ 为流量强度。
司机决策与博弈
司机的选择取决于收益预期。收益计算需考虑基本运费、里程费及空返成本:
司机收益 = 基本运费 + 里程费 × 距离 - 空返成本 - 时间成本
利用博弈论中的混合策略均衡分析,设选择短途通道的司机比例为 q,均衡点满足:
E[收益 | 短途] = E[收益 | 普通]
解此方程即可确定司机群体的最优策略比例。
Python 仿真实现
理论推导之后,通过代码模拟验证模型效果。以下是一个简化的离散事件仿真框架,重点展示队列匹配与收益计算逻辑。
import numpy as np
from scipy.stats import expon, uniform
class TaxiSimulator:
def __init__(self, passenger_rate=50, taxi_rate=60, short_ratio=0.3,
d_threshold=15, base_fare=10, fare_per_km=,
waiting_cost=, empty_return_ratio=):
.passenger_rate = passenger_rate
.taxi_rate = taxi_rate
.short_ratio = short_ratio
.d_threshold = d_threshold
.base_fare = base_fare
.fare_per_km = fare_per_km
.waiting_cost = waiting_cost
.empty_return_ratio = empty_return_ratio
.passenger_queue = []
.taxi_queue = []
.short_taxi_queue = []
.time =
.stats = {
: [],
: [],
: ,
:
}
():
is_short = np.random.random() < .short_ratio
is_short:
np.random.uniform(, .d_threshold)
:
np.random.exponential(scale=) + .d_threshold
():
passenger_arrivals = expon.rvs(
scale= / .passenger_rate,
size=(.passenger_rate * hours * )
)
taxi_arrivals = expon.rvs(
scale= / .taxi_rate,
size=(.taxi_rate * hours * )
)
passenger_times = np.cumsum(passenger_arrivals)
taxi_times = np.cumsum(taxi_arrivals)
p_idx = t_idx =
p_idx < (passenger_times) t_idx < (taxi_times):
passenger_times[p_idx] <= taxi_times[t_idx]:
dist = .generate_distance()
.passenger_queue.append((passenger_times[p_idx], dist))
p_idx +=
:
current_short_ratio = (
(.passenger_queue) / ((.taxi_queue) + )
.passenger_queue
)
np.random.random() < current_short_ratio * :
.short_taxi_queue.append(taxi_times[t_idx])
:
.taxi_queue.append(taxi_times[t_idx])
t_idx +=
.match_passenger_taxi()
.stats
():
.passenger_queue (.taxi_queue .short_taxi_queue):
arrival_time, dist = .passenger_queue[]
is_short = dist <= .d_threshold
is_short .short_taxi_queue:
taxi_time = .short_taxi_queue.pop()
queue_type =
.taxi_queue:
taxi_time = .taxi_queue.pop()
queue_type =
:
wait_time = (.time - arrival_time, )
.stats[].append(wait_time)
fare = .base_fare + .fare_per_km * dist
is_short dist < .d_threshold / :
fare +=
np.random.random() < .empty_return_ratio:
profit = fare - dist *
:
profit = fare
.stats[].append(profit)
is_short:
.stats[] +=
:
.stats[] +=
.passenger_queue.pop()
sim = TaxiSimulator(passenger_rate=, taxi_rate=, short_ratio=)
results = sim.run_simulation(hours=)
()
()
()
()
