基于智能体的建模
一、直观理解:让“异质个体”在环境中互动
基于智能体的建模(Agent-Based Modeling,ABM)把系统看作许多自主个体(agent) 的集合。每个智能体拥有自己的状态、感知、规则或目标,在环境中移动、交互、学习;宏观现象(隔离、羊群、分层、崩溃)由微观规则涌现出来。
与元胞自动机相比,ABM 中的个体通常可以:
- 移动(不绑死在固定格点属性上);
- 拥有异质参数(不同风险偏好、速度、财富);
- 具备记忆、策略切换甚至简单学习;
- 与网络邻居而非仅几何邻居交互。
典型故事:市场上的买卖双方按各自预期成交,价格波动来自互动而非外生噪声方程;校园疏散中每个行人避让与跟随,拥堵在瓶颈处自发形成。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 个体异质性关键;局部交互与自适应行为主导;网络结构影响传播;需要机制解释与情景政策实验;聚合方程难以写出。 |
| 核心优点 | 表达力强;便于纳入行为规则与制度细节;自然输出空间/网络分布;适合“如果改变规则会怎样”的反事实实验。 |
| 局限与缺点 | 参数多、易过拟合;校准与验证困难;计算成本高;结果对实现细节敏感;论文中规则必须写清楚否则不可复现。 |
使用前应确认:
- 是否真的需要个体层机制,而非聚合 SD/ODE 即可;
- 智能体类型、状态变量与决策规则能否被简明描述;
- 有哪些宏观数据用于校准(增长率、接触分布、价格矩等);
- 随机种子、人数、空间尺度的稳健性如何检验。
三、核心原理:环境 + 智能体 + 交互协议
1. 基本结构
- 智能体:状态 ,参数 ,决策函数 ;
- 环境:资源、价格、地理空间、公共信息;
- 调度:同步更新或随机异步更新;
- 观测:宏观统计量 。
一步典型循环:感知 → 决策 → 行动 → 环境更新 → 记录统计。
2. 与方程模型、CA、DES 的分工
| 方法 | 更擅长 |
|---|---|
| ODE/SD | 聚合反馈与长期趋势 |
| CA | 齐整格点上的局部空间规则 |
| DES | 事件驱动的服务/物流流程 |
| ABM | 异质行为、网络交互、制度规则 |
3. 校准思想
常用方式:选择宏观矩(均值、方差、分布分位数),调节规则参数使模拟矩接近数据;或用贝叶斯/ABC 在智能体模型上做推断。绝不能满足于“看起来像”。
四、关键建模决策
- 智能体粒度:人、家庭、企业、车辆?
- 空间/网络:连续平面、格点、小世界/无标度网络?
- 理性程度:固定启发规则 vs 优化 vs 学习;
- 随机性来源:初始条件、决策噪声、环境冲击;
- 终止与实验设计:多次重复、参数扫描、政策开关对照。
规则应尽量少而可解释:每增加一条行为,都要说明经验依据。
五、MATLAB 示例
示例:Schelling 隔离模型——个体若同类邻居比例过低则搬家,最终形成空间隔离。
%% Schelling 隔离模型(简化 ABM)
rng(8);
n = 40; % 网格
vacancy = 0.2; % 空位比例
tolerance = 0.35; % 同类邻居最低可接受比例
maxSteps = 50;
% 状态: 0 空位, 1 类型A, 2 类型B
cells = ones(n);
cells(rand(n) < 0.5) = 2;
emptyMask = rand(n) < vacancy;
cells(emptyMask) = 0;
similarity = zeros(maxSteps, 1);
for step = 1:maxSteps
% 计算每个占用格的同类邻居比例
unhappy = false(n);
for i = 1:n
for j = 1:n
if cells(i,j) == 0
continue;
end
nb = neighbors8(cells, i, j);
occ = nb(nb > 0);
if isempty(occ)
sim = 1;
else
sim = mean(occ == cells(i,j));
end
if sim < tolerance
unhappy(i,j) = true;
end
end
end
% 宏观隔离度:所有占用者的平均同类比例
sims = [];
for i = 1:n
for j = 1:n
if cells(i,j) == 0, continue; end
nb = neighbors8(cells, i, j);
occ = nb(nb > 0);
if ~isempty(occ)
sims(end+1) = mean(occ == cells(i,j)); %#ok<AGROW>
end
end
end
similarity(step) = mean(sims);
% 不满意者随机搬到空位
[ui, uj] = find(unhappy);
[ei, ej] = find(cells == 0);
if isempty(ui) || isempty(ei)
similarity(step:end) = similarity(step);
break;
end
ord = randperm(numel(ui));
for k = 1:numel(ui)
if isempty(ei), break; end
a = ord(k);
pick = randi(numel(ei));
cells(ei(pick), ej(pick)) = cells(ui(a), uj(a));
cells(ui(a), uj(a)) = 0;
ei(pick) = []; ej(pick) = [];
end
end
figure;
subplot(1,2,1);
imagesc(cells);
colormap([1 1 1; 0.2 0.4 0.9; 0.9 0.3 0.2]);
axis equal tight off;
title(sprintf("最终格局 (tolerance=%.2f)", tolerance));
subplot(1,2,2);
plot(1:maxSteps, similarity, "LineWidth", 1.5);
xlabel("时间步"); ylabel("平均同类邻居比例");
title("隔离度演化"); grid on;
function nb = neighbors8(gridMap, i, j)
n = size(gridMap, 1);
ii = max(1, i-1):min(n, i+1);
jj = max(1, j-1):min(n, j+1);
block = gridMap(ii, jj);
% 去掉中心元胞自身
ci = i - ii(1) + 1;
cj = j - jj(1) + 1;
block(ci, cj) = NaN;
nb = block(~isnan(block));
end
第二个更轻量的示例:二维随机游走智能体的聚集统计。
%% 多个智能体在方盒内随机游走
rng(11);
nAgent = 200;
box = 1;
pos = rand(nAgent, 2) * box;
steps = 100;
stepSize = 0.05;
centerDist = zeros(steps, 1);
for t = 1:steps
pos = pos + stepSize * randn(nAgent, 2);
pos = min(max(pos, 0), box); % 反射边界简化为裁剪
center = mean(pos, 1);
centerDist(t) = mean(sqrt(sum((pos - center).^2, 2)));
end
figure;
plot(centerDist, "LineWidth", 1.5);
xlabel("时间步"); ylabel("到群体中心的平均距离");
title("随机游走智能体的散布程度");
grid on;
六、如何解释结果
完整报告包括:
- 智能体类型、状态、感知范围与决策规则(可用伪代码);
- 环境与交互拓扑;
- 初始化、人数、时间尺度、随机种子;
- 宏观指标定义与基线/政策情景对比;
- 多次重复下的均值与变异;
- 敏感性:关键参数变化是否改变定性结论;
- 局限:未建模的行为、规模外推风险。
好的 ABM 论文让读者能按规则复现涌现机制,而不是只展示最终动画。
七、常见误区
1. 规则过于复杂导致不可识别
参数比数据还多时,任何宏观曲线都能被“调出来”,解释力反而下降。
2. 不做重复与稳健性检查
一次随机运行的图案可能是噪声实现。
3. 用 ABM 替代本可用解析/ODE 解决的问题
增加机制细节不是加分项,能简单则简单。
4. 校准缺失
“定性像那么回事”不等于模型正确。
5. 实现细节不写清
更新次序、边界、冲突解决方式都会改变结果,必须文档化。
八、小结
基于智能体的建模从异质个体的规则与交互出发,解释宏观涌现,适合行为、网络与空间机制并重的问题。它的优势是表达力,代价是校准与复现的高要求。
在数学建模中使用 ABM 的稳妥策略是:规则尽量少、指标可观测、情景可对照、结果可重复,并在可能时与方程模型或 CA 交叉验证。