TOPIC 27 · PHASE E

基于主体建模AGENT-BASED MODELING

结果之恶不需要动机之恶(Bad outcomes need no bad intentions)

2026-08-13 · 适应与演化

一条街用十年时间从混住变成泾渭分明。你挨家挨户去问为什么搬,没有一户会说"我不想跟他们住一起"——而且他们说的是真话。

你大概见过这种事:一个群刚建起来什么都聊,一年后只剩一个话题,别的人不知不觉都不说话了。没人被踢出去,也没人宣布过规矩。或者一间办公室,午饭时间的座位一开始是随机的,半年后固定成了几桌,谁也没组织过。

我们解释这类事情时有一个几乎不会去质疑的默认假设:结果的形状约等于动机的形状。极端的格局背后应该有极端的意愿,明显的界线背后应该有人想画那条线。这个假设有时候是对的。但有一整类系统里它错得非常彻底——温和到近乎无所谓的个人要求,可以稳定地长出极端的整体格局,而且中途没有任何一个人做过极端的选择。

上一期讲的是复杂适应系统(complex adaptive system):主体会学习、规则本身在变。这一期讲的是怎么把这类系统真的跑起来做一次实验——基于主体建模(agent-based modeling,缩写 ABM),以及这种实验最容易骗人的地方。它既是本站后面几期(适应性景观、演化博弈、集体智能)共用的工具,也是复杂性科学里最容易被滥用的那把刀。

01自下而上做一次实验(Experiments from the Bottom Up)

传统的建模是从整体入手的。讲传染病,你写下"有多少人还没得病、多少人正在传染、多少人已经好了",再写三条方程描述这三个数怎么互相转化——这就是第 24 期那个易感-感染-康复模型(susceptible–infectious–recovered,缩写 SIR)。你操作的对象自始至终是总量,个体在方程里不存在。

基于主体建模走的是相反的方向:你一个方程都不写,你只写"一个个体在什么情况下做什么",然后放几百上千个下去,让它们互相碰。整体会长成什么样,你不知道——那是跑出来的结果,不是你输进去的假设。

这个换向解锁了三件方程做不到的事。第一是异质性(heterogeneity):每个个体可以有不同的参数、不同的耐心、不同的信息。方程里的"平均个体"是一个不存在的人,而很多现象恰恰是被少数不平均的人推动的。第二是空间与网络:谁挨着谁、谁认识谁。第三是局部信息:每个个体只看得见身边那一小圈,没有人拥有全局视野——这一条尤其重要,因为现实里的人正是这样。

同一个问题,两个方向 自上而下 · 写整体方程 ① 先假设整体量服从什么方程 (易感者、感染者、康复者各多少) ② 解方程,得到整体量的轨迹 快、可分析、可求出阈值 代价:个体不存在,只有平均值 空间、差异、局部视野全被抹掉 自下而上 · 写个体规则 ① 只写:一个人在什么情况下做什么 ② 放几百个下去,让它们互相影响 ③ 整体格局是跑出来的,不是写进去的 左边把你想解释的东西放进了假设里;右边把它留在了输出端 — 差别全在这里
两条路都合法,但只有右边这条能回答「这个格局是怎么长出来的」。

这套做法的门槛低到危险:写几十行代码就能让一屏幕小方块动起来,看上去很像那么回事。所以它需要一条自己的纪律,而且这条纪律是整个方法的命门——你想解释的那个宏观现象,必须待在输出端,不许出现在输入端。元胞自动机 → 参考 · 元胞自动机 和鸟群模型 → 参考 · Boids 鸟群 是这条纪律最干净的两个例子:规则里没有"群"这个词,群是跑出来的。

🎯 决策线

拿到任何一个模拟(包括你自己写的),先去参数表里找一遍:有没有一个参数直接叫「隔离程度」「拥堵水平」「团队氛围」。如果有,这个模型不是在解释那个现象,是在换一种写法把它重述了一遍。把这类参数拆成个体层面的动作,拆不出来就说明你还没想清楚机制。

🌀 历史与军事 · 普鲁士的兵棋 1824 年,一位叫 Georg Heinrich von Reisswitz 的中尉把一套桌上推演交给了普鲁士总参谋部;参谋总长 von Müffling 看完那句评价流传至今——"这不是游戏,这是一所战争学校"。它的核心设计正是自下而上:不算双方总兵力之比,而是让每个单位按规则动、由裁判逐条判定结果。所以兵棋从来就不是用来预测谁赢的——它是用来暴露"我方计划里那个没人负责的环节"的,而这种东西在任何总量估算里都看不见。

EN Equation-based modelling starts from aggregates: how many susceptible, how many infected. Agent-based modelling writes no aggregate equation at all — only what one individual does under what local conditions — and lets the macro pattern come out as an output. That buys heterogeneity, space and local information, at the price of a discipline: whatever you want to explain must never appear among the inputs.

02谢林的棋盘(Schelling's Checkerboard)

1971 年,托马斯·谢林(Thomas Schelling,2005 年诺贝尔经济学奖得主)发表了一篇论文,用的"计算机"是一张棋盘和一把硬币。他手推的那个模型,后来成了整个方法的招牌。→ 参考 · 谢林隔离模型

规则简单到可以一句话说完:棋盘上住着两种人,每个人环视自己周围的八格,只要求同类邻居的比例不低于某个数;低于了就搬到一个空格去,不低于就待着不动。就这样。

我把它跑了一遍,参数摆在明处:16×16 的格子,两种人各约四成五,剩下约一成是空位,阈值定成 30%。请留意这个数字有多温和——它的意思是"我周围七成的邻居跟我不是一类,我也不走"。这在现实里几乎算得上宽容。

同一条规则,同一批人 — 温和的要求长出极端的格局 ① 起点 · 随机混合 同类邻居 50% 40 人不满意 ② 3 轮之后 同类邻居 67% 14 人不满意 ③ 稳定 · 第 23 轮 同类邻居 78% 0 人不满意 每个人的要求只有一条:邻居里同类不少于 30%(也就是「七成是异类我也不走」) 没有人要求隔离,也没有人搬进一个更同质的地方 — 每次搬家只是为了不低于那 30%
起点是随机撒的,最终格局是跑出来的。中间没有任何一步是「想要隔离」。

起点是随机撒的,同类邻居比例 50%——随机混合本来就该是这个数。跑到第 23 轮,所有人都满意了,没有人再想动。此时同类邻居比例是 78%

值得停一下想清楚这中间发生了什么,因为它比"隔离出现了"更要紧:整个过程里没有任何一个人追求过同质。每个人只做了一件事——当同类邻居掉到三成以下时挪个地方,挪到刚好不低于三成为止。终局那个 78%,是每个人都没要过、也没有人在任何一步选择过的东西。它从个体的账本里查不出来。

这就是"结果之恶不需要动机之恶"的确切含义。但这句话极容易被滑向另一个说法,那个说法是错的,必须在这儿把线划清楚。

它跟阿伦特的"平庸之恶"不是一回事。汉娜·阿伦特(Hannah Arendt)1963 年在《艾希曼在耶路撒冷》里提出的是关于主体的诊断:一个人放弃了思考、把判断交给流程和上级,于是参与了巨大的恶。谢林说的是关于结构的事实:即使每个人都在思考、都无恶意、每一步都为自己作出了合理的选择,那个格局照样会出现。两者的落点正好相反——阿伦特要求恢复个人的判断力(问题出在人放弃了判断),谢林指出判断力全部在线也不够(问题出在规则和空间)。

把两者混起来,会导出一个双方都不同意的结论:"既然是结构,那就没人有责任。"阿伦特恰恰是在追究责任——她主张艾希曼应当被处死;谢林也从没说过隔离无人负责。一个说的是"别拿体制替自己开脱",另一个说的是"别以为动机清白就保证结果清白"。这是两条互补的要求,不是一条。(顺带一提:Bettina Stangneth 2014 年基于阿根廷时期档案的研究让"平庸"作为对艾希曼本人的描述受到了严重质疑——他远比阿伦特设想的更有意识形态自觉。这不影响那个概念作为一种类型的价值,但引用时该说清楚。)

🎯 决策线

遇到一个"没人想要却稳定存在"的格局,先做一次最低动机检验:把每个人的偏好调到你认为最温和、最说得过去的程度,看这个格局还出不出得来。出得来,就停掉"揪出是谁想要这个"的调查——那条线索的信息量接近于零。把同样的时间花在两件事上:谁挨着谁(空间与网络),以及不满意时人能做什么动作(可选项)。

🌀 生物 · 细胞的自动分层 把两种胚胎细胞打散混在一起,它们会自己重新分成清清楚楚的两层。Steinberg 1960 年代的差异黏附假说给出的解释里没有任何"指挥":仅仅因为同类细胞之间的黏附力略强,混合体就会像油和水一样分开,黏得松的那群最后包住黏得紧的那群。同一个机制、同一个数量级的温和差异。于是可以反推出一条并不显然的判据:看到一条清晰的分界线,不能推出两边存在强烈的排斥——界线的锐利程度由重排的自由度决定,不由偏好的强度决定。

EN Schelling's 1971 checkerboard: agents demand only that a modest share of their eight neighbours be like them. Run here with a 30% threshold on a 16×16 board, the board froze after 23 rounds with 78% like-neighbours — a figure nobody asked for and nobody chose at any step. This is a claim about structure, and it is not Arendt's banality of evil, which is a claim about a subject who stopped thinking; conflating them yields "structure, therefore nobody is responsible", which neither author would accept.

03温和为什么会放大(Why Mild Demands Amplify)

"个体温和、整体极端"听上去像个悖论。它不是。中间有三个可以拆开看的机制,一个接一个。

一,搬走这个动作不只关系到自己。一个人离开,同时也把留下来的每一个同类邻居的比例拉低了。所以一次移动会制造下一批不满意的人——他们本来是满意的。这就是级联:不满意的人在被别人的动作生产出来。

一个人走,把原本满意的邻居推下阈值 ① 三个人都满意 G F H F / G / H 各有 3 个同类邻居 3 / 8 = 37.5% ≥ 30% ✓ ② 左上角那位走了 G F H F 和 G 什么都没做,却跌了下去 2 / 7 = 28.6% < 30% ✗ ③ F 也走 → 轮到 H G H H 本来一直是满意的 现在也 28.6% ✗ — 队伍在变长 阈值 30%,八个邻居;虚线格 = 刚空出来的位置。每一次搬走都在生产下一个要搬走的人
不满意的人不是天生的,是被别人的动作制造出来的 — 这就是温和偏好能级联的原因。

二,这个过程带棘轮。搬家的人只会落在让自己满意的位置上,也就是同类比较多的地方。所以平均而言每一次移动都在提高整体的同质度,而相反方向的移动——主动搬进一个同类更少的地方——在规则下根本不会发生。棘轮只往一个方向转。

三,终局自己锁死。跑完之后,没有一个人不满意,因此没有一个人有单方面改变的动机。这个格局是稳定的——但请注意"稳定"这个词在这里的含义窄得可怕:它只表示没有人能靠自己一个人的动作变得更好。它不表示大家满意,不表示这是好结果,更不表示有谁选了它。稳定、最优、有人想要,是三件完全不同的事,日常语言把它们混成了一团。

🎯 决策线

面对一个锁死的坏格局,一对一的说服必然失败——因为对每个人来说,单独改变确实更糟,你说服的是一个正确的判断。有效的干预只有两类:让一批人的处境同时改变(凑够临界质量再一起动,而不是逐个动员),或者改变"搬家"这个动作本身的成本与可见性。具体到会议上:别再单独找人问"你怎么看",改成让所有人同时写下判断再一起亮出来。

🌀 经济与制度 · 2021 年英国的加油站 一则关于卡车司机短缺的报道之后,英国各地加油站排起长队、真的断供了——而油本身并不短缺。跑的正是本节这条机制:每个人只是"提前加一点"(温和),但这个动作让别人的处境变差(油枪前的队伍变长),于是下一批人也去加。所以官方那句"油是够的"注定没用:人担心的从来不是油够不够,是别人会不会去加。能起作用的干预只在动作层——限量、限时、按车牌分流,也就是改变搬家的成本,而不是改变信息。

EN Three mechanisms turn mild into extreme. One departure lowers the like-share of everyone it leaves behind, so unhappiness is manufactured by other people's moves. Movers only land where they are satisfied, so every move ratchets homogeneity upward and the reverse move never happens. And the frozen state is stable only in the narrow sense that no single agent can improve alone — stable, optimal, and wanted are three different things.

04建模的诚实(The Honesty of a Model)

现在说这套方法的问题,而且要说得比它的好处更长——因为基于主体建模最大的毛病恰恰是它太好用了。

你手上有四个旋钮:规则、参数、初始条件、随机种子。四个旋钮一起转,你几乎总能调出一张你想看的图。所以"我的模型复现了这个现象"这句话,作为证据,价值接近于零。任何足够灵活的机器都能复现任何东西。

第一条纪律:跑一批,不是跑一次。上面那张棋盘图是一次运行的结果。我把同一条规则换了 30 个随机种子重跑,最终的同类邻居比例落在 0.65 到 0.85 之间,均值 0.75。也就是说,上面那个"78%"不是一个结论,它是分布里的一个点,而且是偏中上的一个点。只报一个数、不报这条带子,报的其实是运气。

同一条规则跑 30 次(只换随机种子) 0.5 0.6 0.7 0.8 0.9 最终同类邻居比例 → 起点 0.50 均值 0.75 上图那一次 0.78 最低 0.65 最高 0.85 单次结果是分布里的一个点,不是「结论」。报一个数而不报这条带,就是在报运气。
一次运行不是结论。同一条规则换 30 个种子,结果散在这条带子里。

第二条纪律:说清楚你扫过哪些参数。阈值改成 37.5% 会怎样?空位从一成变成一成四会怎样?如果一篇结论只在阈值恰好等于 0.3、空位恰好等于 0.1 时成立,那它讲的是这两个数字,不是讲机制。

第三条纪律,也是最容易被跳过的:问这个模型禁止什么。一个只会生成、不会禁止的模型,没有被推翻的可能,因而也没有被支持的可能。谢林模型在这一点上其实很克制——它给出的是一个存在性证明(proof of existence):极端的隔离不需要极端的偏好作为前提。存在性证明只干一件事,就是推翻一个"必要条件"的说法。它不指认原因。说"隔离可以在没有恶意的情况下产生",和说"现实中的隔离是这么产生的",中间隔着一整个实证研究领域。

说到这儿,我该交代一次自己的失败,因为它比上面三条纪律更能说明问题。

我把规则改成"每个人都严格偏好 50 对 50 的完美融合"——同类比例离一半越远越不舒服——然后跑了 30 次。隔离没有出现,同类邻居比例稳稳停在 0.48 到 0.50。可是 Pancs 与 Vriend 2007 年在《Journal of Public Economics》上报告的结果正好相反:在最优响应动态(best-response dynamics,每个人搬到当前可得的最优位置)下,即使所有人都严格偏好完美融合,隔离照样出现;他们还顺带指出,谢林模型的一维版本和二维版本其实是两个性质不同的模型。

两边都不是算错了。差别在效用函数的具体形状、邻域怎么定义、以及"搬去哪儿"这条规则怎么写——我那个版本是"搬到一个随机的、比现在好的空位",他们那个是"搬到全场最优"。结论挂在了这些细节上。而在通俗转述里,这些细节从来不会被提到。下次你读到"模拟表明……",要问的第一句话就是:搬去哪儿这条规则是怎么写的。

🎯 决策线

看到任何基于模拟的结论,先问三句:跑了多少次?参数扫过没有?这个模型禁止什么?三句里有一句答不上来,就把这个结论降级——它可以进你的"可能性清单",不能进决策依据。这条对你自己写的模拟同样有效,而且尤其有效。

🌀 天文学史 · 本轮 托勒密体系用"圆上套圆"描述行星轨迹,只要肯加,本轮可以把任意复杂的观测轨迹拟合到任意精度。它错在哪儿?不错在拟合得不好——它拟合得很好。它错在没有任何一种观测结果是它生成不出来的,因而没有任何一种观测能推翻它。这正是本节那条纪律的最老版本:一个模型的力量不在它能画出什么,在它画不出什么。基于主体建模的旋钮比本轮还多,所以这一问要问得更凶。

EN Four knobs — rules, parameters, initial conditions, random seed — mean almost any pattern can be produced, so "my model reproduces the phenomenon" is nearly zero evidence. Report the distribution over seeds, report the parameter sweep, and ask what the model forbids. Schelling's contribution is a proof of existence: extreme segregation needs no extreme preference. That refutes a claimed necessary condition; it names no cause.

05这套说法在哪儿不成立(Where This Breaks Down)

这一节最要紧,因为本期的机制是本站到目前为止最容易被拿去当挡箭牌的一个。

第一,"不需要恶意"绝不等于"没有恶意"。这是最常见也最有害的误读。美国的居住隔离有大量蓄意的、制度化的成因:1930 年代起房主贷款公司(HOLC)绘制的分级地图把黑人聚居区整片划成拒贷区(这就是"红线"redlining 一词的来历);房契里写着不得转售给特定族裔的种族限制性条款,直到 1948 年 Shelley v. Kraemer 一案才判定法院不得强制执行;此外还有中介的"撬盘"(blockbusting)、贷款与保险的差别定价。谢林模型说的是"即使这些统统不存在,隔离也可能出现"。它没有、也不可能说这些不存在。存在性证明只点亮成因空间里的一块,它不熄灭别的块。

现实中一个格局的成因空间 同类偏好的自组织 谢林模型点亮的 就是这一块 制度性歧视 红线、限制性条款 收入与房价 买得起哪儿 中介行为 带你去看哪套房 模型证明的是:光靠蓝色这一块,格局也出得来。 它没有证明另外三块不存在,更没有测量过它们各占多少。 方块大小是排版,不是比例 — 各块的实际占比要靠实证研究去量,模型量不出来
存在性证明的边界:点亮一块,不熄灭别的块,也不称量任何一块。

第二,模型和证据之间还隔着很远。好消息是这段距离有人在走。Card、Mas 与 Rothstein 2008 年用 1970–2000 年的普查数据做了一件很直接的事:他们在大多数城市找到了临界点式的行为——某个街区的少数族裔比例一旦越过某个门槛,白人的外迁速度会明显跳一下。各城市的门槛落在 5% 到 20% 之间。这既支持了"阈值"这个核心结构,也立刻把它拉回地面:更宽容的城市,门槛更高。阈值不是一个万能常数,它是被真实的态度决定的量。所以"改变偏好没用"这句话说过了头——偏好挪不动格局的形状,但它挪得动那个门槛。

第三,这一行的复制情况不好。照着一篇论文的文字重新实现它的模型,跑不出同样结果是常事——因为"搬去哪儿""谁先动""边界怎么处理"这类决定往往没写在纸上。生态学界 2006 年提出 ODD 描述规范(Overview, Design concepts, Details)正是为了治这个病,而它至今没被治好。上面我自己那次没能复现的"偏好融合仍然隔离",就是这个病的一个标本。

第四,别让结构性解释变成万能钥匙。有些格局就是有人要的,去给它编一套自组织的故事既不诚实也不聪明。判据其实很好用:如果存在明确的强制、明文的规则或可查的定价差别,先解释这些;只有在找不到这些、而一组温和的个体规则就能生成这个格局时,自组织的解释才是该优先的那个。顺序错了,模型就从工具变成了修辞。

🎯 决策线

凡是用"不需要恶意也能产生 X"来论证的场合,必须同时说出现实中的 X 有多少来自蓄意——哪怕只能给出一个粗糙的量级和它的来源。给不出这个数,这条论证就只能用于"理解机制",不能用于"判定责任"。这两个用途之间的那条线,是本期唯一不能跨的线。

🌀 法律 · 过失与责任的分层 侵权法几百年前就不再把责任建立在"有没有恶意"上了:故意、过失、严格责任是三层,越往下越不问动机。产品责任更极端——厂商可以没有任何害人的意图,只要产品有缺陷、损害发生了,责任照样成立。这恰好是本期机制在制度上的镜像:法律早就承认了后果不需要动机。所以谢林式的解释非但不是免责声明,它还指出了责任该落在哪儿——从"谁想要这个结果"转到"谁在维持这套规则、谁有能力改它"。

EN Four limits. "Needs no malice" is not "there was no malice": redlining, racial covenants and blockbusting were deliberate and documented. Card, Mas & Rothstein (2008) found real tipping points between 5% and 20% minority share — and higher tipping points in more tolerant cities, so preferences move the threshold even if they cannot change the shape. Agent-based results replicate poorly because the unwritten choices matter. And a structural story must not be the first story when explicit rules, force or pricing are on the table.

🎒 场景 · BigCat

  1. 带团队与组织招人时打的那个"文化契合度"分数,就是一个 30% 阈值:每个面试官只是想"至少能聊得来",没有人在挑同类。可几轮之后团队的来路会窄得惊人,而复盘时你翻遍每一份评估都找不到那个决定。具体动作:把"文化契合"这一栏拆成两三条可以写出来的行为要求(能不能在会上推翻上级的判断、交接文档写不写),拆不出来就删掉这一栏;看的指标从"团队氛围评分"换成过去四个季度新人来源渠道的分布——那才是能看出棘轮有没有在转的那张表。
  2. 工程与系统设计做容量预案时,几乎所有人都在用一个自上而下的模型:预估总请求量、除以单机容量、乘个余量。这个模型里没有个体,于是它结构性地看不见重试风暴——因为雪崩恰恰来自"每个客户端按自己那条重试规则行动",而不是来自总量。具体动作:预案评审里加一项主体级模拟,把真实的重试次数、退避策略、超时时间放进去跑一遍;并且停掉用平均请求速率反推容量这个动作——要留的余量应该按"所有客户端同时重试"那一档来定。
  3. 修行与心性每次被谁惹到之后,复盘时脑子里第一句话通常是"他是不是故意的"。这句问话本身就把结果的解释锁死在了动机上——问出来只有两个答案,一个让你更气,一个让你憋着。具体动作:把这句话换成"这个结果需要有人故意吗?如果不需要,是什么让它反复发生"。前一句指向一个人,后一句指向一个可以改的安排:谁在什么时间点拿到什么信息、谁必须先开口。停掉的动作是在心里给对方定性——那是最占地方、也最没有产出的一项。

🌀 越界 · 跨学科的联想(Crossings)

深入思考(Going Deeper)

如果格局是结构性的,那"改变偏好"的教育和倡议还有意义吗?

有,但作用点跟直觉不同。Card 他们的数据显示,更宽容的城市临界点更高——偏好改变不了"越过门槛就翻转"这个形状,但它把门槛往上推了。所以倡议的效果应该按"门槛移动了多少"来衡量,而不是按"隔离有没有消失"。用错了尺子,一个真实有效的干预会被判成无效。

棋盘上没有钱。把房价加进去,结论会变吗?

会变得更复杂,也更真实:价格本身就是一个反馈——搬走的人多了价格就跌,跌了又吸引另一类人进来。这可能加速隔离,也可能在某些参数下阻止它。值得注意的是,加进价格之后模型的旋钮又多了几个,于是第四节那三条纪律的要求也随之提高:新增的解释力必须大于新增的自由度,否则你只是拟合得更好看了。

什么时候该相信一个基于主体的模拟?

一个可用的判据:当它预言了一件你没有拿来调参的事,而那件事后来被观察到了。仅仅"能复现已知现象"是最弱的证据等级——因为你是照着那个现象调的。存在性证明是第二等:它推翻某个"必须有 X 才会有 Y"的说法。预言新现象才是第一等,而在社会系统里这一等相当罕见。

阈值 30% 这个数字本身有意义吗?

作为一个具体数值,几乎没有——它是一个演示用的设定,换成 25% 或 37.5% 结论的方向不变。有意义的是"阈值"这个形状:反应不是随比例平滑变化的,而是在某处突然跳。真正的经验工作是去测那个跳变点在哪儿(Card 等人做的正是这件事),而不是去论证 0.3 这个数对不对。把演示参数当成经验发现,是读模型时最常见的一类错误。

延伸阅读(Further Reading)