之前写过两个 ABM(Agent-Based Model)。网格上的 agents 随机配对,玩一局博弈,然后更新 action。唯一的变量是"看什么"——这一步的得分,还是历史上所有博弈的总分。微分方程我不会推(平均场近似抄的文献),但 ODE 的阶数我还是看得懂的:一个是一阶,一个是二阶。速度与加速度,无记忆与有惯性。微观设定只是一念之差。
但那两个模型共享一个暗含的前提:支付矩阵是铁板一块。囚徒困境永远是囚徒困境。鹰鸽博弈永远是鹰鸽博弈。
草不会疼。
Weitz et al.(2016)让草活了过来——策略改变环境,环境重写收益结构,收益结构反过来重塑策略。闭环一旦形成,系统就开始呼吸。
我想做的事更简单:不给环境开一个连续的反馈通道,只是给网格一个胃。
给网格一个胃
在原来的 ABM 里加一个资源状态变量,初始值设为 $A$。每一步 agents 在网格上博弈,消耗 $1$ 单位资源。资源从 $A$ 一路降到 $0$,再隔固定步数,重置回 $A$。
设 $b=1$,资源存量 $a \in \{0, 1, 2, 3, 4\}$。支付矩阵为:
$$ \begin{matrix} & C & D \\\\ \hline C & a/2 & 0 \\\\ D & a & (a-1)/2 \end{matrix} $$$a=4$,桌子是这样的:
$$ \begin{matrix} & C & D \\\\ \hline C & 2 & 0 \\\\ D & 4 & 1.5 \end{matrix} $$纯正的囚徒困境。$D$ 严格占优 $C$——不管对方选什么,背叛都比合作赚得多。Replicator dynamics 告诉你:关门,放背叛者,全图沦陷。
$a=2$:
$$ \begin{matrix} & C & D \\\\ \hline C & 1 & 0 \\\\ D & 2 & 0.5 \end{matrix} $$仍然是囚徒困境。但合作与背叛之间的裂隙在收窄。
$a=1$:
$$ \begin{matrix} & C & D \\\\ \hline C & 0.5 & 0 \\\\ D & 1 & 0 \end{matrix} $$临界。当对手背叛时,选合作和选背叛打成平手。囚徒困境的结构开始松动。
$a=0$:
$$ \begin{matrix} & C & D \\\\ \hline C & 0 & 0 \\\\ D & 0 & -0.5 \end{matrix} $$桌子翻了。相互背叛跌入负数——唯一不亏的选择是合作。这不是雪堆博弈(Snowdrift Game)的标准矩阵,但它和雪堆博弈共享同一段基因:背叛不再占优。
一张桌子,五种摆法。从 $a=4$ 滑到 $a=0$,博弈的底层从囚徒困境一路褪成鹰鸽博弈。
资源越少,合作越不是"傻"。
呼吸
现在加入重置。
每隔固定步数——比如 $10$ 步——资源弹回 $A=4$。于是:
资源充裕 → 囚徒困境 → 背叛扩张 → 资源消耗 → 博弈松动 → 合作抬头 → 重置触发 → 囚徒困境再度降临。
一呼,一吸。一收,一张。
和 Weitz 的区别只在于反馈的形式:他用连续的微分方程耦合环境和策略,我用离散的资源预算 + 周期重置。但底层是同一种逻辑——博弈的结构不再是常数,是资源存量的函数。策略咬资源,资源咬矩阵,矩阵咬策略。闭环。
振荡不是 bug,是设计。
模型一的预言:临界密度
以上假设全图同步——所有格子同时降 $a$、同时重置。平均场近似在这个假设上跑得很顺。
但 ABM 不是平均场。Agents 在网格上局部移动,配对发生在邻域。不同格子、不同时刻、agents 撞见的 $a$ 值不同。
这就多了一层。
假设某一步,相当比例的格子滑到了 $a=0$——鹰鸽博弈区域,合作者的当期回报反超,$C$ 不再吃亏。但一个 agent 要从 $D$ 变成 $C$,他需要在邻域里真的撞见一只 $C$,并且这只 $C$ 的当前得分比他高——然后才可能切换。
如果种群中 $C$ 的比例太低——比如只剩 $5\%$——大多数 agents 的邻域里根本看不到 $C$。他们只能看到其他 $D$。而在 $a=0$ 的支付矩阵里,$D$-$D$ 遭遇得 $-0.5$——确实比 $C$-$C$ 的 $0$ 差。但问题是:agent 不知道 $C$-$C$ 会得多少,因为他没见过 $C$。他的比较只发生在"他看到的人"之间。
转向需要临界密度。低于某个阈值,种群被锁在 $D$ 里——不是因为囚徒困境还在(支付矩阵已经变了),而是因为没有足够的示范者。
这就引出一个 $N$——重置步数——的真正角色。
$N$ 不只是决定了振荡的相位长度。它是合作在 $a$ 低谷里滚雪球所需的窗口宽度。
$N$ 短——比如三五步——窗口只够零星几个 agents 顺着当期收益转成 $C$。密度远未达到链式反应的阈值。重置一来,$a$ 跳回 $4$,囚徒困境的桌子重新摆好,$D$ 的当期优势一口一个地把剩下的 $C$ 吞干净——连下一只 $C$ 都繁殖不出来。
$N$ 长——比如二十步、三十步——窗口够宽。早期转向的 $C$ 有足够步数通过局部邻域感染旁人。雪球一旦滚起来,加速就快。重置只能压扁雪球的一部分,核还在。
反过来考虑。即便 $N$ 足够长,如果重置时全网格还有大片 $a$ 值较高的区域——囚徒困境的"高地"——那么这些区域的背叛者仍然是 $C$ 扩散的屏障。一个在 $a$ 低谷区刚变成 $C$ 的 agent,下一步走到高 $a$ 区,立刻被囚徒困境惩罚——对方选 $D$,自己得 $0$。他的邻居看到他一轮掉到谷底,谁还学他?
空间格局在这里和 $N$ 的长度共同起作用:$a$ 低谷不仅需要持续得够久,还需要覆盖得够广,广到 $C$ 的扩散不会刚出保护区就撞进 $D$ 的优势战场。
所以模型一的预言有一根看不见的弦:$N$ 必须越过某个临界值,该区域的 $C$ 密度才能从"零星"质变成"自持"。过了这根弦,锯齿振荡才真正发生——旗才会随风飘。没过,$x$ 在低谷里纹丝不动,被紧接着的囚徒困境若无其事地吞掉。
这根弦在哪?取决于种群密度、初始 $C$ 比例、agents 的移动速度、$a$ 的空间分布——纸面上的微分方程给不了。得写代码。
模型二的预言:惯性的两张面孔
模型二比较累计得分。$U_A(t) = \int_0^t \pi_A d\tau$。有惯性。
前面的分析里,我默认了 $N$ 很短——短到 $a=0$ 的阶段不够 $C$ 在累计账面上翻盘。那个场景里,adaptive lag 是纯粹的负担。这没错。
但如果 $N$ 够长,事情反转。
长 $N$ 意味着 $a=0$(或 $a=1$)的状态持续数十步。每一步,$C$ 的相对收益高于 $D$。每一步都在 $U_C$ 的账户里存钱。量不大,但架不住步数多。
设 $a=0$ 状态持续 $T$ 步,种群中 $x$ 比例的 $C$。$C$ 的每步收益是 $0$。$D$ 的每步期望收益是 $0 \cdot x + (-0.5) \cdot (1-x) = -0.5(1-x)$。每一步,$U_C - U_D$ 拉开 $0.5(1-x)$ 的差距。
$T$ 步下来,$U_C$ 比 $U_D$ 多出 $0.5(1-x) \cdot T$。$T$ 足够大,这个积少成多的差距就能填平 $D$ 在囚徒困境时期累积的历史优势——还能反超。
反超一旦发生,性质就变了。
agents 开始批量从 $D$ 转向 $C$。每多一个 $C$,$(1-x)$ 缩小,$D$-$D$ 遭遇变多——$D$ 的期望收益 $-0.5(1-x)$ 进一步变负。$U_D$ 加速贬值。$U_C$ 不变(总是 $0$),但相对 $U_D$ 加速上升。正反馈。
当重置来临——$a$ 跳回 $4$,囚徒困境重新张开——$C$ 已经在自己名下存了一笔累计分数。在 $a=4$ 里,$D$ 的当期收益碾压 $C$:$D$ 对 $C$ 得 $4$,$C$ 对 $D$ 得 $0$。每一步都在磨损 $C$ 的累计家底。但家底够厚,就磨得慢。
这就是合作惯性。
$C$ 在鹰鸽窗口里攒下的累计分数,成了它们在囚徒困境窗口里的护盾。agents 比较的是累计——而累计的账面上,$C$ 还领先着。需要很多步 $D$ 的当期碾压,才能把账面翻回来。而这"很多步"之间,$C$ 还在——种群没有塌成纯 $D$。
同一个机制,两张面孔。$N$ 是开关:
短 $N$:$D$ 在囚徒困境阶段攒的历史优势 → 惯性拖住了合作的反扑 → 重置再来 → $D$ 优势更深。这是前面分析的"历史沙袋"——惯性只压合作。
长 $N$:$C$ 在鹰鸽窗口攒的历史优势 → 惯性拖住了 $D$ 在重置后的反扑 → $C$ 扛过了囚徒困境的冲击。惯性反过来保护了合作。
更微妙的是空间维度。如果 $a=0$ 的区域在空间上连成片——一个"合作飞地"——$C$ 在那里面互相配对,$U_C$ 稳定不降。$D$ 闯入飞地,遇到的大多是 $C$,收益也被锁在 $0$(而不是负分),所以 $U_D$ 不降——飞地的惯性只在"内部"影响 $C$。但如果 $a=0$ 的区域零散破碎、$C$ 和 $D$ 混居,$D$-$D$ 遭遇频繁,$U_D$ 加速下降,合作惯性反而建得更快。
(这个逻辑有点反直觉:合作飞地太"安全",反而让 $D$ 不受惩罚,不利于合作在累计账面上拉开差距。碎片化的 $a$ 低谷——让 $D$ 互相咬——才是 $C$ 建惯性的捷径。)
短 $N$:背叛的惯性压扁合作。模型二是所有可能性中最不利于 $C$ 的。
长 $N$:合作的惯性对抗重置。模型二可能比模型一更能维持 $C$——因为模型一的合作者没有记忆,重置一来就被 $D$ 卷走;模型二的合作者有家底撑着,能扛到下一次 $a$ 低谷。
翻译成另一种语言
前一篇博文把两个模型翻译成了"即时筛选"和"历史筛选"。当时说,我们不知道自然选择到底在看什么——是一步的 fitness,还是累计的 fitness。
在这个带资源节律的版本里,区别不止"变慢了"。区别有了一张脸的反面和正面。
即时筛选的短板不再是"短视"——而是一个在有限种群里才能体现的问题:abiotic 条件变了,biotic 反应却因为缺乏示范者而没跟上。支付矩阵已经调成了鹰鸽博弈,但密度不够,$D$ 被原地锁死。这是平均场方程永远看不出来的东西——平均场假设无穷种群充分混合,密度从来不是变量。
历史筛选的情况则取决于环境波动的时长——也就是 $N$。
短 $N$ 端:历史筛选是背叛的帮凶。$D$ 在囚徒困境阶段积累的累计优势拖住了所有转向的努力。$C$ 还没捱到 $a$ 低谷追平旧账,重置就来了。历史不是记忆,是包袱。
长 $N$ 端:历史筛选是合作的盔甲。$C$ 在足够漫长的鹰鸽窗口里攒够了家底——不是当期的一步两步,是累计的几十步。重置重新打开了囚徒困境,但 $C$ 的累计优势扛住了 $D$ 的第一波反扑——给种群一个"考虑考虑"的宽限期。
同一个机制。两种命运。开关是 $N$。
这让我想起生物里很现实的一个问题:环境的波动周期有多长?一个季节?一年?十年?如果资源的低谷足够深、足够久——比如一场持续数年的旱季——那么自然选择的累计记账会让合作者在雨季重新来临时仍然有立足之地。如果低谷只是一闪而过——一场只持续几天的骤寒——累计记账反而拖后腿:合作者还没来得及从历史得分里受益,环境就回暖了。
adaptive lag 不是绝对值。是记忆窗口和环境节律的相位差。
即时筛选在剧烈波动的环境里会 overfit——一次偶然的 $a$ 低谷就骗它转向合作,一次偶然的 $a$ 高峰又骗它转回去。
历史筛选在缓慢漂移的环境里会 underfit——旧信息太重,死活不肯跟着新信号走。
但如果波动周期的长度刚好落在记忆窗口之内——那么历史筛选既不欠拟合也不过拟合。它做了一件事:用低频惯性过滤高频噪声。它没有被 $a$ 的每一次抖动牵着鼻子走,也没有完全忽略 $a$ 的趋势性变化。
自然选择也许不看一步,也不看全部历史。也许是某种滑动窗口——最近 $n$ 步的加权累积。窗口的宽度,大概就是演化对"当下"的定义。
窗口太窄,噪声就是一切。窗口太宽,信号就淹在旧账里。
而在这个带呼吸的网格上,窗口的宽度就是 $N$。$N$ 够长,合作的惯性就能建起来——不是因为合作"更好",只是因为这一次的鹰鸽窗口终于长得足够让历史开口说了另一番话。
代码的事
以上还是纸面上的推演。平均场近似给了一阶 ODE 的预言,二阶 ODE 也给了方向。但 ABM 里的局部配对、空间斑块、有限种群——这些才是真正决定故事走向的变量。
模型一的临界密度到底在哪里。模型二的惯性从"压合作"翻转到"保合作"的那个 $N$,大概是多少。$a$ 低谷的空间碎片化,是帮合作建惯性还是拆合作筑飞地。重置步数从 $3$ 拉到 $30$,合作关系是单调上升还是会在某处拐弯。
也许下一篇文章里会有图。
也许把代码写完,发现以上全错。(这也不是第一次了。)
参考文献
Weitz, A. (2016). An oscillating tragedy of the commons in replicator dynamics with game-environment feedback. PNAS.