案例 065 换电柜排队 4 个人
案例 065 换电柜排队 4 个人
摘要:体育西 C 口换电柜午高峰排了 \(4\) 个人,每人 \(3.0\) min,等于白等 \(12.0\) min。把 \(3\) 位骑手的换电指派写成 \(3 \times 6\) 的 0-1 规划,目标同时计骑行成本(\(0.60\) 元/km)与排队成本(\(0.20\) 元/min),排队时长 \(q_j = s L_j\) 直接挂在柜子的实时队长上。静态模型把队长当常数,一次求解就把三个人全送到"最空"的体育东路,模型自报 \(1.52\) 元,真实核算却是 \(5.12\) 元——低估 \(70.3\)%。 原因是反馈回路:三个人一起过去,那个零排队的柜子立刻变成排 \(3\) 个人。按"解→更新队长→再解"逐个迭代,两轮内落到不动点 \(2.95\) 元(省 \(2.18\) 元、\(42.5\)%),三人分散到 \(2\) 个柜;把自身到来也计入队长的系统最优是 \(2.53\) 元,还差 \(0.41\) 元的拥挤外部性。
关键词:带排队成本的指派;反馈回路;不动点迭代;用户均衡;拥挤外部性
1 问题提出
1.1 问题是什么
午高峰,\(3\) 位骑手同时要换电,周边 \(6\) 个换电柜的实时队长见表 1。"实时"两个字是关键:此刻的队长是别人留下的,你去了以后,队长里就多了一个你。
表 1 六个换电柜的实时排队与到柜距离
| 换电柜 | 坐标 / km | 实时排队 / 人 | 排队耗时 / min | A 距离 / km | B 距离 / km | C 距离 / km |
|---|---|---|---|---|---|---|
| 体育西C口 | (0.00, 0.00) | 4 | 12.0 | 0.13 | 0.52 | 1.16 |
| 天环广场 | (-0.32, 0.46) | 3 | 9.0 | 0.57 | 1.03 | 1.63 |
| 正佳广场 | (0.34, 0.58) | 1 | 3.0 | 0.55 | 0.76 | 1.18 |
| 天河城 | (0.60, -0.28) | 2 | 6.0 | 0.62 | 0.16 | 0.52 |
| 体育东路 | (1.28, 0.18) | 0 | 0.0 | 1.18 | 0.85 | 0.51 |
| 珠江新城 | (1.95, -0.92) | 1 | 3.0 | 2.10 | 1.64 | 1.04 |
计价口径照题目来:骑过去 \(0.60\) 元/km,排队 \(0.20\) 元/min,每人换一次电排 \(3.0\) min。于是体育西那 \(4\) 个人构成的队伍值 \(2.40\) 元——比再骑 \(4.0\) km 还贵。表 2 是四种指派在真实排队下的核算。
表 2 三种指派在真实排队下的核算(元)
| 方案 | A 去 | B 去 | C 去 | 距离成本 | 排队成本 | 合计 | 模型自报 |
|---|---|---|---|---|---|---|---|
| 静态(队列当常数) | 体育东路 | 体育东路 | 体育东路 | 1.52 | 3.60 | 5.12 | 1.52 |
| 迭代不动点 | 正佳广场 | 体育东路 | 体育东路 | 1.15 | 1.80 | 2.95 | — |
| 系统最优 | 正佳广场 | 天河城 | 体育东路 | 0.73 | 1.80 | 2.53 | — |
| 就近不看排队 | 体育西C口 | 天河城 | 体育东路 | 0.48 | 3.60 | 4.08 | — |
1.2 为什么要优化
第一,队列长度不是参数,是决策的结果。把它当参数,模型给出的最优解会让所有人都挤向同一个"空柜",这个解在被执行的那一刻就自我毁灭了:自报 \(1.52\) 元、实付 \(5.12\) 元,差的 \(3.60\) 元不是舍入误差,是模型结构错了。
第二,"分散"未必更贵。迭代解只用 \(1.15\) 元骑行就换掉 \(3.60\) 元排队,合计比静态解省 \(2.18\) 元——它连里程都更短(\(2.54\) km 降到 \(1.91\) km),因为静态解把三个人赶去了最远那个"空柜"。这笔账只有把两项放进同一个目标才算得清。
第三,不动点不等于最优。每个骑手只对自己负责时,谁也不会把自己造成的 \(3.0\) min 拥堵算进账;系统最优比用户均衡再低 \(0.41\) 元。这个差额就是"该不该统一调度"的定价依据。
1.3 Gurobi 如何求解
模型只有 \(18\) 个 0-1 变量和 \(9\) 条约束,单次求解在毫秒级,全部算例共 \(516\) 次重解、\(0.46\) 秒。真正的工作量在外层迭代:把上一轮的到达人数加进队长后重解,直到指派不再变化。本文做了三组:
- 联合重解:三人同时面对 \(L_j = L_j^{0} + n_j\),一次 MIP 解完。不收敛,在 \(4.41\) 与 \(5.12\) 元之间来回跳(图 4 虚线)。
- 逐个重解:钉住另外两人、只让第 \(i\) 个人重选,一轮扫完三人。第 \(1\) 轮即到不动点,第 \(2\) 轮复核不动,本文用它。
- 系统最优:把 \(z_{ij}\) 的自身到达也计入队长即可,等价于对 \(3\) 人 \(6\) 柜的 \(6^{3} = 216\) 种组合全枚举,用来标定外部性的大小。
2 数学模型
2.1 符号说明
\(I\) 为骑手集合(\(|I| = 3\)),\(J\) 为换电柜集合(\(|J| = 6\));\(d_{ij}\) 为骑手 \(i\) 到柜 \(j\) 的距离(km);\(L_j\) 为柜 \(j\) 的队长(人),\(L_j^{0}\) 为实时观测值;\(s = 3.0\) 为每人排队耗时(min);\(c_d = 0.60\) 元/km,\(c_t = 0.20\) 元/min;\(z_{ij} \in \{0,1\}\) 表示骑手 \(i\) 是否去柜 \(j\);\(q_j\) 为柜 \(j\) 的排队时长(min)。
2.2 目标函数
括号里是"感知成本":骑过去的钱,加上排队的时间折价。\(c_t s = 0.60\) 元/人——队伍里每多一个人,这个柜对骑手就贵 \(0.60\) 元。
2.3 约束条件
每人恰好换一次电。
每次换电的排队时长,即题目里的 \(q_j = 3 L_j\),只是把 \(L_j\) 拆成"别人留下的 + 我这一轮带来的"。
真实成本核算。\(n_j\) 是柜 \(j\) 这一轮的到达人数,每个到达者前面有 \(L_j^{0} + n_j - 1\) 个人(自己不在自己的队伍里),\(n_j(n_j - 1)\) 这一项就是外部性:你加到别人头上的等待,不会出现在自己的账单上。式 (1) 用猜想的 \(L_j\),式 (4) 用执行后的真相,两者之差就是静态近似的学费。
2.4 规模与性质
\(18\) 个 0-1 变量、\(9\) 条约束,规模小到可以手算,但结构上有意思:式 (1) 里的 \(L_j\) 求解时必须取一个猜想值;一旦按式 (3) 换回 \(\sum_i z_{ij}\),目标就出现 \(z_{ij} z_{kj}\) 的二次项(两人同柜互相加长队伍)。线性化不难(\(L_j\) 只有 \(0\) 到 \(7\) 共 \(8\) 个取值),但会掩盖真正的教学点——这是不动点问题,不是一次优化能了结的问题。
3 Gurobi 求解实现
3.1 建模要点
z = m.addVars(NI, NJ, vtype=GRB.BINARY)
m.addConstrs((gp.quicksum(z[i, j] for j in range(NJ)) == 1 for i in range(NI)))
q = m.addVars(NJ, lb=0.0)
m.addConstrs((q[j] == TS * (L0[j] + gp.quicksum(z[i, j] for i in range(NI)))
for j in range(NJ)))
两个实现细节:一是外层迭代复用同一个模型对象,每轮只改目标系数(\(L_j\) 变、系数变),Gurobi 从上一轮基出发热启动,\(516\) 次重解合计 \(0.46\) 秒;二是逐个重解靠变量上下界实现——把另外两人的 \(z\) 锁死在当前指派(LB = UB = 1),只解放第 \(i\) 行,等于给 Gurobi 一个 6 变量的小问题。
3.2 求解结果
三轮最佳响应算一轮:第 \(1\) 轮就从 \(5.12\) 元掉到 \(2.95\) 元,第 \(2\) 轮复核无人改主意。收敛判据是"整轮无人改主意",所以至少要跑两轮才能宣布停。 但收敛不等于唯一:从"三个人全在体育西"出发会落到另一个均衡 \(3.27\) 元(图 4 橙线),比从静态解出发差 \(0.32\) 元——多个纯策略均衡的路径依赖。
4 结果分析
4.1 结构:最空的柜最远

图 1 六个换电柜的空间分布与实时排队(球径与数字 = 排队人数)
体育西 C 口排了 \(4\) 个人(棒最高),排队 \(12.0\) min;体育东路 \(0\) 人、零等待,可它离 A 有 \(1.18\) km、离 B 有 \(0.85\) km,只有离 C 最近(\(0.51\) km)。"最空"和"最近"在这张图上几乎不重合,这是本案例全部张力的来源。绿箭头是不动点指派:三人分了 \(2\) 个柜,没有一个人去最挤的体育西。

图 2 18 个候选指派:距离与排队耗时(气泡 = 成本)
每位骑手面前 6 个点,纵坐标只有 \(5\) 档(\(0\) 到 \(12.0\) min),决策面离散得很厉害。实心点是不动点选中的:A 去排 \(1\) 人的正佳(\(0.55\) km),B、C 去排 \(0\) 人的体育东路(\(0.85\)、\(0.51\) km)。同样 \(3.0\) min 的队,近的骑手觉得值,远的觉得不值——距离和排队在图上是两条独立的轴,谁也不能替代谁。
4.2 结果:静态解自己毁掉自己

图 3 三种指派的成本分解(虚线段为系统最优)
静态解里,A 看体育西是 \(2.48\) 元、看体育东路只有 \(0.71\) 元,于是三人全去了体育东路;执行后那柜排 \(3\) 个人,每人等 \(6.0\) min,排队成本从 \(0.00\) 元跳到 \(3.60\) 元。迭代解把骑行成本也压到 \(1.15\) 元(少跑 \(0.38\) 元),排队成本从 \(3.60\) 压到 \(1.80\),合计省 \(2.18\) 元。 "就近不看排队"最贵(\(4.08\) 元):三人各自贴着最近的柜,正好各自把队加长。

图 4 三种迭代的收敛轨迹
逐个重解第 \(1\) 轮就到 \(2.95\) 元、第 \(2\) 轮原地不动;联合重解 \(5\) 轮还在 \(4.41\) 与 \(5.12\) 之间来回跳——三个人同时改主意,谁都算不准别人会不会也改,这就是同步更新在拥挤博弈里失效的原因。工程对策很朴素:串行更新(一次只动一个人),或给队列估计加惯性。
4.3 灵敏度:钱、柜子、队伍长度

图 5 时间价值系数的主灵敏度
时间价值从 \(0.10\) 涨到 \(0.40\) 元/min,不动点成本从 \(1.63\) 元升到 \(4.75\) 元,几乎线性——每涨 \(0.05\) 元/min 多花约 \(0.52\) 元。阶梯线(用到的柜数)走向反直觉:\(0.10\) 元/min 时三人分三个柜,涨到 \(0.15\) 元以上反而只剩两个。原因不是"更集中",而是唯一的空柜被抢光——时间越值钱,大家越肯多骑 \(0.85\) km 去体育东路,天河城那 \(6.0\) min 的队就没人排了。

图 6 可用柜数与时间价值的二维灵敏度
按"离三人重心由近及远"逐个放开柜子,成本从 \(6.49\) 元降到 \(2.95\) 元(\(c_t = 0.20\) 那一列)。\(2\) 到 \(4\) 个柜是陡降段(省 \(3.54\) 元),第 \(5\)、\(6\) 个柜一分钱不省:体育东路这个空柜一进来就把局面盘活,再往外的天环、珠江新城纯属摆设。六个柜的现实供给,真正有用的只有 \(4\) 个。

图 7 每人排队时长对成本与最长等待的影响
每人排队从 \(2.0\) 拉到 \(5.0\) min,成本从 \(1.93\) 元涨到 \(4.15\) 元,最长等待从 \(6.0\) 升到 \(15.0\) min。\(s\) 超过 \(4.5\) min 后最长等待越过 \(12.0\) min 的忍耐线(虚线):这时排最长队的柜在现实中会被骑手直接否掉,模型愿意接受、人不接受。3 min/人这个假设本身,就决定了模型能用多"满"的柜。
4.4 前沿、风险与边际贡献

图 8 216 种指派的里程—等待前沿与不可行区
\(216\) 种组合铺成点云,前沿只有 \(3\) 个点。静态解(红叉)在里程和等待两头都被支配:\(2.54\) km、人均等 \(6.0\) min,而不动点是 \(1.91\) km、人均等 \(3.0\) min。就近解(橙方块)压在前沿最左端(\(0.80\) km),可人均也要等 \(6.0\) min——它省下的里程,正好被体育西那 \(12.0\) min 吃掉。不动点与系统最优都在前沿上,差的 \(0.41\) 元全在谁去承担天河城那 \(6.0\) min:系统最优让 B 改去天河城,B 自己多花 \(0.19\) 元,换来 C 少等 \(3.0\) min(省 \(0.60\) 元),净赚 \(0.41\) 元——可吃亏的是 B,B 不会自愿。

图 9 队长随机扰动下「迭代减静态」的省钱分布
把实时队长当泊松随机变量(均值取观测值)重抽 \(1200\) 次,迭代比静态省钱的概率 \(77.8\)%,平均省 \(1.36\) 元。分布右偏:多数时候只省一两元,排队越极端省得越多(右尾 \(3.5\) 元)。可见静态模型不是"偶尔错",而是平均地、系统性地低估。

图 10 单个柜子排队清零后的成本下降
把每个柜的队长单独清零再重解,贡献最大的是天河城(\(1.61\) 元),天环广场、体育西C口 次之(\(1.24\)、\(1.05\) 元),体育东路只值 \(0.00\) 元。注意排序与"谁排队长"并不同:排 \(4\) 个人的体育西只排第三,因为它虽然长、却没人愿意去,清空它对总成本影响有限;真正贵的是天河城——它就在 B 的脚边(\(0.16\) km),一有人排就立刻把人推走。
5 结论
-
排队是动态的:静态模型自报 \(1.52\) 元、真实成本 \(5.12\) 元,低估 \(70.3\)%。三个人一起奔向"最空的柜",等于把那个柜亲手变成最挤的柜。
-
迭代法第 \(1\) 轮(三次最佳响应)就到不动点 \(2.95\) 元,第 \(2\) 轮复核无人改主意,比静态省 \(2.18\) 元(\(42.5\)%),里程还少 \(0.38\) 元;但必须串行更新,联合重解 \(5\) 轮仍在 \(4.41\) 与 \(5.12\) 之间振荡。
-
不动点不是最优:系统最优 \(2.53\) 元,比用户均衡低 \(0.41\) 元(\(14.1\)%)。这笔钱没人愿意自己出,只能靠平台补贴或排队信息披露内部化。
-
均衡有路径依赖:从静态解出发落到 \(2.95\) 元,从"全员体育西"出发落到 \(3.27\) 元,差 \(0.32\) 元。初值选得好不好,直接决定省多少钱。
-
该先清哪条队可以算:天河城清空值 \(1.61\) 元,体育西C口只有 \(1.05\) 元,高 \(53.7\)%。午高峰的疏导动作按边际贡献排序,而不是按"谁排队长"拍脑袋。
参考文献
[1] Gurobi Optimization LLC. Gurobi Optimizer Reference Manual[Z]. 2024.
[2] Kellerer H, Pferschy U, Pisinger D. Knapsack Problems[M]. Berlin: Springer, 2004.
[3] Martello S, Toth P. Knapsack Problems: Algorithms and Computer Implementations[M]. Chichester: John Wiley & Sons, 1990.
[4] 司守奎, 孙玺菁. 数学建模算法与应用[M]. 3 版. 北京: 国防工业出版社, 2021.

浙公网安备 33010602011771号