AI-For-Beginners 多智能体建模实战:用 NetLogo 改编 Virus 模型模拟 COVID-19 传播
AI-For-Beginners 多智能体建模实战:用 NetLogo 改编 Virus 模型模拟 COVID-19 传播
本篇文章对应 AI-For-Beginners 课程 第 23 课《多智能体系统》 的课后作业(作业原文)。核心任务是:从 NetLogo 内置模型库中选取一个现成模型,通过修改参数与规则使其尽可能真实地模拟一个现实场景——官方推荐的经典案例是改编 Alternative Visualizations 文件夹下的 Virus 模型,用于模拟 COVID-19 的传播。读完本文,你将掌握 NetLogo 模型库的打开与运行方式、Turtle/Patches/Observer 三种仿真角色的运作原理、把传染病模型改造成疫情模拟器的建模思路,以及"保存副本 + 制作视频演示"的完整交付流程。
作业目标:用多智能体仿真还原一个真实世界场景
多智能体系统(Multi-Agent Systems)是 AI 中一个独特的分支,其核心思想是涌现(emergent / synergetic):大量行为简单的个体(Agent)在局部规则驱动下相互交互,整体却呈现出更复杂、更"智能"的系统行为。本课作业正是这一思想的最佳实践载体——NetLogo 中的每个病毒、每只羊、每辆车都是一个独立智能体,而你不需要为整个系统编写全局算法,只需要为个体定义规则。
作业原文(lessons/6-Other/23-MultiagentSystems/assignment.md)要求:
- 从 NetLogo 模型库中选取一个模型;
- 用它尽可能精确地模拟一个真实生活场景;
- 给出的示范路径是:改编 "Alternative Visualizations" 文件夹中的 Virus 模型,展示其如何用于建模 COVID-19 的传播;
- 最终要回答一个挑战性问题:你能否构建一个模仿真实病毒传播的模型?
- 展示你的工作:保存一份模型副本,并制作一段视频演示,说明模型与现实场景之间的对应关系。
作业的核心评价维度不是"模型是否完美",而是"你是否清楚地说清了模型与现实之间的映射关系"——这恰恰是多智能体建模(以及一切科学建模)最重要的能力。
为什么选择 NetLogo:多智能体建模的入门利器
在动手之前,先理解 NetLogo 在本课中的地位。课程 README 指出,NetLogo 是一个基于 Logo 语言改良版的多智能体建模环境。它让你控制一个名为 turtle(海龟) 的智能体,可以移动并在身后留下轨迹,从而以非常直观的方式观察单个智能体的行为。
NetLogo 世界由三类对象构成(对应 README 中的 "Main Principles" 一节):
| 对象 | 角色 | 关键点 |
|---|---|---|
| Agents(turtles) | 在场地中移动并执行动作的智能体 | 用 ask turtles [...] 向全体智能体发指令,括号内代码以 turtle 模式并行执行 |
| Patches | 智能体所在的正方形区域 | 可 ask patches 改变颜色与属性,也可引用同一 patch 上的所有智能体 |
| Observer | 控制整个世界的唯一智能体 | 所有按钮处理器(Setup/Go)以 observer 模式执行 |
正是"turtle 模式与 patch 模式的代码由所有智能体同时并行执行"这一机制,使得你只需编写少量个体行为代码,就能让整个仿真系统涌现出复杂行为。这也是本作业的底层原理:COVID-19 的宏观传播曲线,是由成千上万个个体的微观移动与感染规则叠加而成的。
第一步:打开模型库并运行一个现成模型
从 File 菜单进入模型库
安装并启动 NetLogo 后,进入 File → Models Library(模型库)。模型库左侧按主题分类:Art(艺术)、Biology(生物)、Social Science(社会科学)、Alternative Visualizations(替代可视化)等;右侧展示选中模型的预览画面与功能说明。你可以在搜索栏中快速定位模型,点 Open 载入。
模型库截图来源:lessons/6-Other/23-MultiagentSystems/images/NetLogo-ModelLib.png
课程建议可以先打开 Biology → Flocking(鸟群聚集模型)感受多智能体的涌现行为。而作业目标模型 Virus 则位于 Alternative Visualizations(替代可视化)文件夹中——作业原文明确提到,正是该文件夹下的 Virus 模型最适合改编成 COVID-19 模拟器。
认识主界面:Interface、Info 与 Code
打开模型后进入主界面(如上图,示例为经典的狼-羊-草捕食模型),主要包含(对应 课程 README 的界面说明):
- Interface(界面)标签页:主显示区(所有智能体生存的场地)、各类控件(按钮、滑块等)、用于显示仿真参数的图表;
- Info 标签页:模型的说明文档,包含作者对模型与现实对应关系的解释——这是你写作业说明时最好的参照模板;
- Code(代码)标签页:NetLogo 程序编辑器。
绝大多数模型的界面上都有一个 Setup(初始化仿真状态)按钮和一个 Go(开始运行)按钮,它们在代码中由形如以下的处理器实现:
to go
...
end
运行前先点 Setup,再点 Go。你可以随时用滑块调整参数并重新 Setup,观察系统行为如何随参数变化。
第二步:理解 Virus 模型的多智能体机制
在动手改编前,先拆解病毒模型背后的智能体逻辑。虽然本作业不要求深入学习 NetLogo 语言(课程 README 明确说明,若想深入学习可查阅 NetLogo 官方的入门交互式词典),但理解以下几个语言构件足以支撑你完成改编:
create-turtles:创建指定数量的智能体。Virus 模型中,每个 turtle 代表一个"人",其健康状态(易感/感染/康复/死亡)通常用颜色等属性表示;ask turtles [...]:让全体智能体并行执行括号中的代码。模型中每一 tick(时间步)都会让每个"人"执行一次移动、接触、可能感染等动作;ask特定群体:只对满足条件的智能体发指令,例如只让"感染者"执行传播动作;breed [cats cat]:定义不同品种的智能体,作业中可能用来区分"已免疫者""重症者"等不同角色。
Virus 模型正是典型的多智能体系统:宏观上的感染人数曲线,完全由微观上每个个体的三条局部规则决定——移动(在 patch 之间随机游走)、接触感染(遇到感染者时按概率感染)、康复或死亡(感染持续一段时间后转变状态)。这与课程 README 中 Flocking 模型的原理完全一致:个体只看局部信息、只守简单规则,整体行为由交互自然涌现。
第三步:把 Virus 模型改造成 COVID-19 模拟器
作业建议的路线是"tweak"(微调),而非从零编写。改造思路建议按以下四步推进:
1. 梳理参数映射:把滑块对应到流行病学概念
打开 Virus 模型后,Interface 中通常有若干滑块与开关(具体以你打开的模型界面为准),改造的第一步是把每个控件映射到 COVID-19 的现实概念:
| 模型控件(示意) | 对应的现实流行病学含义 | 建议的 COVID-19 取值方向 |
|---|---|---|
| 初始感染人数 | 疫情输入病例数 / 首发病例 | 设为少量,观察指数传播阶段 |
| 人口数量 / 场地密度 | 城市人口密度 | 提高密度会加速传播 |
| 感染概率(transmission) | 有效接触传播率(与 R0 相关) | 上调模拟高传染性毒株 |
| 恢复/免疫概率 | 康复并获得免疫力 | 调节免疫时长观察二次感染 |
| 感染持续时间 | 潜伏期 + 病程 | 对照新冠的数天量级 |
| 死亡概率(若存在) | 病死率(IFR) | 按当时公开口径的量级设置 |
注意:不同版本的 Virus 模型控件名称不同。做作业时,先在 Info 标签页阅读模型自带的说明,确认每个滑块的语义,再在报告/视频中明确写出你的映射表——这正是作业要求的"模型与现实对应关系"。
2. 修改个体行为规则(Code 标签页)
要模拟 COVID-19 特有的传播特征,可能需要小幅修改 Code 中的行为规则,例如:
- 社交距离:减小智能体的移动步长(
forward数值)或减少相遇频率,模拟封锁/居家政策; - 无症状传播:为"感染者"增加一个"潜伏期"状态,潜伏期内不发病但仍可传播;
- 人口流动限制:把场地划分为若干区域并限制跨区移动,模拟封城后的空间隔离。
每改一处,都回到 Interface 重新 Setup 并运行,对比曲线变化。课程 README 提醒:个体规则修改后,全局行为可能完全出乎意料——这正是涌现系统的魅力,也是作业中值得在视频里重点讲解的部分。
3. 对照真实疫情曲线做验证
一个"尽可能精确"的 COVID-19 模型,其感染者/累计病例曲线应呈现疫情报道中常见的形态:初期指数增长、达到感染高峰后回落、最终趋于平稳(群体免疫或干预生效)。你可以通过以下实验验证模型的合理性:
- 把感染概率设为 0:疫情应立即终止,验证传播链路确实依赖该参数;
- 把移动范围/社交距离调到极小:曲线应明显变缓,验证干预措施的作用;
- 改变初始感染人数:观察流行拐点的时间变化。
这与 Flocking 模型的参数实验同构——课程 README 提到,把鸟群的视野范围调为 0 时所有鸟"失明"、聚集停止;同理,你的病毒模型也应能通过极端参数验证每条规则的必要性。
4. 课程中的其他模型可作为灵感来源
作业只要求选取"一个模型",Virus 只是官方推荐示例。课程 README 还列出了若干可参考的模型,它们同样可以成为你"现实场景"的起点:
- Art → Fireworks:烟花是个体火焰流集体行为的展现;
- Social Science → Traffic Basic / Traffic Grid:一维/二维城市交通模型,每辆车遵守"前方空则加速(限速内)、见障碍则刹车"的规则,可用来模拟交通管制对通行效率的影响;
- Social Science → Party:鸡尾酒会上人群如何聚集成群,可用来模拟人群聚集动力学。
无论选哪个模型,作业的逻辑完全一致:选模型 → 找现实映射 → 调参改规则 → 验证行为 → 交付演示。
第四步:保存副本并制作视频演示
作业的交付物有明确的两种形式,缺一不可:
1. 保存模型副本
在完成所有修改后,将模型另存为独立副本,保存你改动的代码、界面布局与参数预设。这样既证明工作过程可复现,也让评审者能亲手运行你的模型。
2. 制作视频演示
录制一段视频(可使用 NetLogo 界面自带的录制功能或系统屏幕录制工具),内容至少覆盖:
- 演示运行:Setup → Go,展示疫情曲线的完整演变过程;
- 参数对比:切换关键滑块(如社交距离、感染概率),展示不同政策下的疫情走向差异;
- 讲清映射:逐个说明模型中的智能体、patch、参数与现实世界(人群、社区、防控措施)的对应关系;
- 说明局限:诚实指出模型与现实的差距(例如忽略年龄结构、医疗资源、潜伏期不确定性等),这恰恰能体现建模素养。
验收清单:对照作业要求自查
完成作品后,逐条核对 作业原文 的要求:
- [ ] 是否从 NetLogo 模型库中选取了至少一个现成模型?
- [ ] 是否保存了模型副本(含你的全部修改)?
- [ ] 模型是否在模拟一个具体、可指认的现实场景(如 COVID-19 传播)?
- [ ] 是否清楚说明了每个关键参数/规则与现实概念之间的映射?
- [ ] 是否制作了视频演示,并在其中解释了模型与现实世界的联系?
- [ ] 是否通过参数实验验证了模型行为合理(极端参数下行为符合预期)?
结语
本作业是 AI-For-Beginners 课程 中第 23 课《多智能体系统》的收尾实践,也是整个课程中少有的"纯仿真、无训练"型作业——它考察的不是调参炼丹,而是把真实世界抽象为智能体规则的能力。正如课程 README 的结论所说:多智能体系统可以呈现非常多样的形态,但它们的共同点是聚焦于个体智能体的简单行为,通过协同效应(synergetic effect)实现系统整体的复杂行为。当你看到成千上万只 turtle 仅凭"移动 + 接触 + 概率传染"三条规则,就在屏幕上复现出一条与真实疫情曲线同构的传播弧线时,你就真正理解了这门课想传达的核心思想。
如果你想进一步深化,可以按课程 README 的 Review & Self Study 建议,调研多智能体系统在制造业或游戏行业的工业应用,把本作业中"个体规则 → 系统行为"的思路迁移到真实的生产与娱乐系统中。

