SCAN 的祖师爷是电梯,但电梯自己早就不用它了

现在走进一栋 2010 年以后盖的写字楼,大堂里很可能找不到上行按钮。取而代之的是一块数字键盘:先输入你要去的楼层,屏幕立刻回你一个字母——"请乘 C 梯"。你走到 C 梯门口等着,轿厢里反而没有楼层按钮了。

这个动作改变的不是流程顺序,而是问题的性质。按传统的按法,电梯系统在你按下"上行"的那一刻只知道一件事:一层有个人,不知道要去哪。输入目的地之后,系统在你走进轿厢之前就知道你的一切。排队问题和派单问题,就差这一下输入。

有意思的是这条时间线:这个构想 1961 年就有人提出来了,第一套真正跑起来的系统 1990 年才落地。中间的 29 年,卡住它的不是想象力,是继电器。

先把另一条线讲完,因为那条线上有个更广为人知的事实。

# 一、SCAN 得管电梯叫一声祖师爷

学过操作系统的人都知道 SCAN:磁头沿着一个方向扫到底,沿途响应所有请求,到头再折返。它有个别名,就叫电梯算法(elevator algorithm)——名字的来历很直白,因为它复制的正是电梯的走法:一路向上,只停顺路的楼层,顶楼再回头。OSTEP 教材里那段解释写得很传神:想象你从 10 楼下到 1 楼,有人在 3 楼上了梯按了 4——如果电梯按"最近优先"跑,它真的会掉头上去。"最近请求优先"(SSTF)会让中间楼层的请求吃到最多服务,而两头挨饿;电梯的走法用"方向"代替"距离"做优先级,保证任何请求最多等一趟,不会饿死。

这条谱系里还藏着一个细节:这个算法最早的公开文献,出现在高德纳《计算机程序设计艺术》第一卷里。Knuth 用加州理工学院数学楼的一台电梯做模拟,讲的其实是协程和双向链表。电梯成了计算机科学的第一批教具。

更妙的是,现实中绝大多数电梯跑的确实是这套东西的近似版——集选控制:响应同方向的呼梯,方向上没有请求就掉头。把电梯换成磁头、楼层换成柱面,就是 LOOK。1970 年代磁盘工程师把电梯的运行方式写成磁盘调度算法,一点心理负担都没有,因为他们照抄的是一个已经稳定运行了几十年的系统。

然后反讽来了。磁盘那边把电梯算法养大、又看着它被 SSD 淘汰的时候,电梯那边自己先叛变了。今天新装的目的地派单系统,跑的已经不是 SCAN 的逻辑——它连"电梯要自己判断去哪"这个前提都拆掉了。

# 二、在线问题的死结

要理解电梯为什么叛变,得先看 SCAN 式控制的天花板在哪。

传统电梯是个在线系统:请求一个一个到达,每个请求到达时只带一个比特的信息——这个楼层有人在等,方向朝上。至于这个人最终去几层,电梯要等他进了轿厢才知道。这个信息缺口堵死了一切优化:系统不知道 8 点 52 分大堂里那 11 个人里有 6 个都去 12 层,只能让他们挤进第一辆到的车,然后看着轿厢在 12 层、9 层、15 层之间来回减速。

轿厢里的楼层面板:进梯之后才声明目的地,是所有低效的源头

早高峰上行(morning peak)是这个缺口杀伤力最大的场景。每一趟的停站数近似等于"轿厢里不同目的地的个数"——装 13 个人去 13 个楼层,就要开 13 次门;13 个人去 3 个楼层,只要开 3 次。同样的运输量,停站数可以差四倍,而每次停站的开销(开门、上下客、关门、重新加速)是刚性的。

硬件工程师当然也在拼命。纽约世贸中心双塔是硬件路线的极端作品:110 层的楼,如果按传统方式一层不落,低区一半的面积得让给电梯井。最终方案是把垂直交通做成了地铁:每座塔 99 部客梯,44 层和 78 层各设一个"天空大堂",23 部快梯每部能装 55 个人,以每分钟 1600 英尺(约 8.1 米/秒)直奔换乘层,再换区间的本地梯。用整个中间楼层换来了"少一半井道"。

天空大堂:把垂直交通做成地铁的硬件解法

另一头是物理极限。电梯靠钢缆吊着,缆绳自己有重量:单程提升到 500 米左右,"缆绳扛得住缆绳自己"就成了过不去的坎。哈利法塔 504 米的单程电梯至今保持着世界纪录,再往上必须中途换乘。2013 年通力推出碳纤维缆绳 UltraRope,给出的对比数字很能说明缆绳有多重:500 米提升距离下,钢缆系统的运动质量是 29 吨,碳纤维方案只要 12.8 吨;到 800 米,钢缆要 108.6 吨,碳纤维只要 13.9 吨。

机房里的缆绳和曳引轮:重量是竖向交通最古老的天花板

硬件的路很难走,而且每一米都要用钱和钢缆去堆。但"不知道乘客去哪"这个信息缺口,一分钱钢材都不用,补上它只需要在乘客进梯之前多问一句。

# 三、1961 年的想法,1990 年才有算力

"让乘客先报目的地"这个想法,1961 年悉尼的 Leo Port 就提出了。生不逢时:那个年代的电梯控制器是继电器搭的,一堆电磁开关连"记住所有等待者的目的地再统一分配"都做不到,更别提优化。构想被整整压了 29 年。

1985 年,Schindler 的工程师 Joris Schroeder 在《Elevator World》上发表了题为 Destination Dispatching 的文章,第一次系统地把这件事写成工程方案;1990 年他和 Paul Friedli 拿到专利,同年在汉堡一家电力公司的大楼里装下了第一套 Miconic 10。1992 年产品正式发布,1993 年装进美国印第安纳波利斯的 Ameritech 大楼。此后二十年,三菱 2002 年出了 DOAS,奥的斯 Compass 和通力 Polaris 在 2005 年前后跟进——今天所有大堂键盘,都是 Miconic 10 的后代。

派单系统做的事,拆开看就是把一个在线问题改造成离线问题:

  • 需求先于运输出现。所有目的地在乘客进梯之前就已声明,调度器拿到的是完整的请求集合,不再是逐个到达的盲盒。
  • 分组是显式的。去同一层的乘客被指派到同一部梯,轿厢的停站数从"人数"塌缩成"楼层数"。
  • 排队从一条变成 N 条。乘客不再挤在同一个大堂口,而是各自站在被指派的电梯门口。分配本身就是负载均衡。

顺带解决了一批旧毛病。有人替一屋子同事按一次电梯,系统只会当成一个人——老系统里这个动作会骗出好几部空车。乘客改变主意不去了,刷卡一取消,系统撤掉这次呼叫,不会派一部空梯去接一个已经走掉的人。

这些说法的实证部分,我决定自己跑一遍看看。

# 四、把两种算法放进同一栋楼

我写了一个离散时间步模拟(scripts/experiments/elevator-dispatch.mjs):一栋 1 层大堂加 20 层办公楼的建筑,4 部电梯,载客 13 人,轿厢速度 2.5 m/s,每次停站 1 秒加减速惩罚,开门 1.2 秒、关门 1.2 秒、每名乘客上下 0.6~0.8 秒。客流是经典早高峰:所有乘客从大堂上行,泊松到达,目的地四成流量集中在三个"整层租户"楼层,其余均匀分布。两种控制方式跑在同一份客流上:一边是集选控制(SCAN 式,共享一条大堂队列,先到先上),一边是目的地派单(进梯前分配,同层同车,各自在指定门口排队)。每组参数跑 5 个随机种子取均值。

结果最有意思的地方不是派单赢了,而是它在哪赢、在哪输:

到达率(人/分钟) 集选:平均等待 派单:平均等待 集选:每趟停站 派单:每趟停站
8 2.2 秒 7.0 秒 1.4 2.1
10 5.0 秒 14.7 秒 2.2 2.4
12 10.1 秒 24.0 秒 3.8 2.5
14 26.1 秒 35.3 秒 8.5 3.9
16 169.3 秒 46.4 秒 9.1 5.9
18 458.5 秒 65.6 秒 8.9 5.8
20 728.1 秒 285.4 秒 8.8 8.0

(表里略掉了 90 分位等待和平均乘梯时间,模拟脚本里都有。)

舒适区里(每分钟 8~10 个人,4 部梯毫无压力),派单反而更慢:它把你锁死在被指派的那部梯上,哪怕隔壁正好有一部空车开门。这是我一开始没预料到的,但细想很合理——指派剥夺了你"见梯就上"的自由,买来的是系统层面的秩序。到了每分钟 12 个人,形势反转:集选的轿厢开始被拼成一堆不同目的地的"站站乐",每趟停站冲到 3.8 次以上,平均乘梯时间涨到 77 秒;派单把同层的人拼进同一部车,每趟停站 2.5 次。

真正的分水岭在 14 到 16 人之间。每分钟 16 个人时,集选控制彻底塌方——平均等待 169 秒,90 分位 265 秒,系统进入"越忙越乱"的正反馈:乘客堆在大堂,车辆全被长队占死。同样的负载,派单的等待是 46 秒。每分钟 18 个人,是 458 秒对 66 秒,7 倍。集选的容量悬崖在 15 人上下,派单把它推到了 19 人左右——同样的 4 部梯、同样的井道,一栋楼没多砌一块砖,多扛了两成客流。

厂商标榜目的地派单"平均出行时间缩短最多 30%",我的模拟没跑出这么漂亮的普适数,跑出来的是另一个形状的结论:这套系统的价值不在平时,在峰值。平时它甚至收一点税;悬崖边上它是救命的。而电梯销售报告里最值钱的恰恰是峰值场景——业主按"早高峰多少分钟清空大堂"验收一栋楼。

当然要把丑话说在前面:这是玩具模型。没有层间串流,没有分区群控,没有"电梯避开满员楼层"这类真实产品里的技巧,到达分布也是理想化的。结论的形状(悬崖后移、峰值下差异被放大)比具体数字可信。

# 五、它拿走的东西

派单不是白拿的。

轿厢里没有楼层按钮,意味着轮椅使用者、儿童、赶时间的你,都不能临时改道;去错了楼层,只能等下一轮。每个乘客被绑在一张 RFID 卡上——你几点、去几层,系统记得清清楚楚,电梯从公共设施变成了带审计日志的固定资产。派单系统大量落地的地方之一,恰恰是门禁一体化的写字楼:那块键盘同时是考勤机。

还有一层更软的代价:排队的"公平感"变了。共享队列时代,先到先上是人人都看得懂的规则;指派制下,你可能眼睁睁看着一部空车关门上走,而屏幕告诉你你的车在 40 秒后到。系统整体更优了,个体视角里出现了无法申诉的不公平。这跟机场安检分"常客通道"是一类问题——效率的每一次提升,都在重新分配等待的权利。

# 六、不停止的,和不用绳的

把视野拉远一点,目的地派单只是垂直交通这两年革新的前菜,真正离谱的还在井道里。

环行轿厢链:永不停站的老派答案

欧洲至今留着一种反直觉的老设计:paternoster,无门小轿厢串成一条链,在大楼里永远循环,0.3 米每秒,不停站,乘客自己看着时机跳上跳下。名字来自主祷文开头两个词——轿厢像念珠一样绕着链子转。1868 年利物浦 Oriel Chambers 被认为装了最早的一套。它慢,但吞吐量惊人:没有任何一次开门等待,也没有任何调度,是"把等待时间降为零"的最暴力解。代价同样暴力:今天很多国家禁止新建,现存的大多在德国和捷克的老楼里,作为被祖父条款保护着的活化石。

而现代版的"不停站",走的是完全另一条路。2017 年 6 月,蒂森克虏伯在罗特魏尔 246 米的试验塔里公开了 MULTI:没有缆绳,轿厢靠直线电机在井道里运行,多个轿厢像地铁列车一样在同一组井道里循环,还能在换乘器上横着切进隔壁井道。按官方口径,运力最多比传统方案高五成,井道占地最多省一半。第一份订单签给了柏林的 East Side Tower,那栋楼 2023 年建成——但 MULTI 至今没有走出试验塔:公开资料里,至少到 2024 年,真实建筑中还没有装上一套。工程师们低估了让监管机构相信"没有缆绳的电梯不会掉"需要多少年。

井道里的地铁:无缆绳轿厢还在等它的第一栋真楼

无论哪条路线胜出,方向是同一个:电梯正在从"一个响应呼梯的箱子"变成"一套有全局视野的运输系统"。调度器进大堂,缆绳退出井道,paternoster 把"调度"彻底删掉——三个方向互相矛盾,但都在否定同一件事:那个 SCAN 时代的假设——电梯必须在请求到达后才开始猜。

下次你站在大堂键盘前输入楼层的那个瞬间,可以想一下自己提交了什么:不是一次呼叫,是一个带完整元数据的作业——目的地、身份、时间戳,全都有。系统收下它,给你分一个门。你不再是排队的人,你变成了调度器眼里的一个 job。