机场出租车调度问题:数学建模实战解析
机场出租车调度是一个典型的资源优化问题。以 2019 年全国大学生数学建模竞赛 C 题为例,题目看似简单,实则涉及复杂的排队论与博弈论应用。我们需要在乘客等候时间、司机收益和机场管理效率之间找到平衡点。
问题背景
想象一下你刚下飞机,拖着行李箱走到候客区,发现两条队伍:一条是'短途专用通道',另一条是普通队。这背后是一套复杂的调度系统在运作。
核心信息点包括:
- 大多数出租车司机会在'蓄车池'排队等待
- 机场管理人员会采集乘客目的地信息
- 对于短途乘客(如目的地小于阈值 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 是服务时间,ρ_short 和 ρ_long 分别是短途和长途的流量强度。
补偿机制需考虑成本分析:
司机收益 = 基本运费 + 里程费 * 距离 - 空返成本 - 时间成本
司机决策模型
司机是否选择短途通道取决于收益比较。用博弈论中的混合策略均衡分析:假设选择短途通道的司机比例为 q,均衡点应满足 E[收益 | 短途] = E[收益 | 普通]。解这个方程就能找到司机群体的最优策略比例 q。
Python 实现
理论说完,上代码。下面是一个简化的模拟实现,用于观察不同策略的效果。
import numpy as np
from scipy.stats import expon, uniform
class TaxiSimulator:
def ():
.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=)
()
()
()
()

