---
name: comp-simulation
description: "仿真建模主链：方法选型（多智能体/离散事件/系统动力学/连续系统/蒙特卡洛/数据驱动融合）、模型规格化、校准与校核验证、实验设计与重复运行纪律、敏感性分析与不确定性量化、仿真产物契约。用于仿真建模类竞赛（如全国大学生仿真建模应用挑战赛）与仿真研究报告。"
argument-hint: [problem-statement-or-scenario]
allowed-tools: Bash(*), Read, Write, Edit, Grep, Glob, WebSearch, WebFetch, Agent
---

# 竞赛仿真建模主链

从赛题/场景到可复现仿真结论的单一入口：**$ARGUMENTS**

> **定位**：这是**方法论 + 契约 + 编排**技能，不是仿真引擎。它决定"该用哪类仿真、模型怎么规格化、
> 结果怎么才算可信、产物怎么落"，并把执行路由到具体引擎（Mesa / SimPy / Salabim / PySD / pymoo /
> stable-baselines3 / PyMC 等，见 `references/engine-routing.md`）。
>
> **与相邻技能的边界**：数学建模主链（`comp-modeling` / `comp-code`）负责"建方程、写代码"；
> 本技能负责**仿真特有的四件事**——①方法选型 ②随机性纪律 ③校准与校核验证 ④置信区间与不确定性。
> 定了型之后，求解与写作仍走既有 `comp-modeling` → `comp-code` → `paper-figure` → `comp-paper-zh` 主链。

---

## 0. 开场先跑（方法未定不写代码）

```bash
# 引擎可用性探测（不联网、不安装，只报告）
python skills/comp-simulation/scripts/sim_env_probe.py
```

探测结果决定可选路径：缺席的引擎**如实记为 unavailable，不阻断**——本技能的方法论层（选型/V&V/实验设计）
不依赖任何特定库，纯标准库即可执行最小仿真。

---

## 一、方法选型决策树（先定性，再动代码）

按**系统的主导特征**选，不按"哪个库我会用"选。

| 主导特征 | 方法 | 首选引擎 | 关键产出 |
|---|---|---|---|
| 大量异质个体、个体间交互/博弈、涌现 | **多智能体（ABM）** | Mesa（`mesa` / `mesa-geo`） | 个体规则表 + 演化曲线 + 情景对比 |
| 流程/排队/资源竞争，事件驱动的离散状态跳变 | **离散事件仿真（DES）** | SimPy（描述性）/ Salabim（带动画） | 流程图 + 资源利用率 + 等待时间分布 |
| 反馈回路、存量-流量、政策杠杆（宏观总量） | **系统动力学（SD）** | PySD（读 Vensim/标准 SD 方程） | 因果回路图 + 存量流量图 + 政策情景 |
| 连续状态由微分方程演化（物理/生态/流体） | **连续系统仿真** | SciPy `solve_ivp` / `scipy.integrate` | 状态轨迹 + 相图 + 守恒量校验 |
| 输入不确定、要传播到输出分布 | **蒙特卡洛** | NumPy（自写）/ SALib（敏感性） | 输出分布 + 置信区间 + 方差分解 |
| 有真实数据、要让数据校准或替代机理 | **数据驱动融合** | scikit-learn / PyMC / stable-baselines3 | 校准参数后验 + 代理模型精度 |
| 多目标、要 Pareto 前沿 | **仿真优化** | pymoo（NSGA-II/III、MOEA/D） | Pareto 前沿 + 权衡表 |

**混合是常态**：ABM + 蒙特卡洛（个体规则含随机）+ pymoo（多目标调度）是最常见的 A/C 赛道组合。
混合时**必须分别声明各层的角色**（谁是机理、谁是优化器、谁是抽样器），否则结论归因不清。

### 赛道映射（全国大学生仿真建模应用挑战赛 A/B/C）

- **A 多智能体复杂系统仿真**：ABM 为主（Mesa），配 SD 或 DES 做宏观/流程层；重点是**智能体规则设计 + 群体调度优化 + 演化风险研判**。
- **B 全域数字孪生建模与治理仿真**：DES/SD 为机理层 + **空间与可视化层**（GIS/三维）；重点是**虚实映射与态势推演**。
  ⚠️ **本仓无三维孪生渲染资产**（见 `references/engine-routing.md` §缺口）：选 B 前必须先确认可视化链路可行，否则如实降级为"二维态势 + 数据孪生"并声明。
- **C 数据驱动仿真融合与智能优化决策**：数据校准（PyMC/回归）+ 仿真底座（任一类）+ 智能优化（pymoo/RL）；重点是**数据-算法-仿真双向赋能**的闭环叙事。
  ⚠️ **防退化**：只有 ML 没有仿真底座 = 退化成普通数据建模，与赛道定位不符。必须保留显式仿真时钟与推演过程。

详版决策树与反模式见 `references/method-selection.md`。

---

## 二、模型规格化（写代码前先落这张表）

**仿真模型的五要素**必须显式写出，缺一项即为不可复现模型：

1. **实体（Agent/Entity）**：类型、状态变量、属性、数量——个体差异从哪来？
2. **规则（Rule）**：状态转移/决策规则、交互规则、学习规则。**每条规则要有出处**（赛题给定 / 文献 / 假设）。
3. **环境（Environment）**：空间（网格/网络/连续）、边界条件、外部驱动（天气/需求/政策）。
4. **时钟（Clock）**：仿真时间语义（离散事件 / 固定步长 Δt / 混合），**时间推进单位与总时长**。
5. **观测量（Observation）**：跑什么指标、在什么时间点记录、聚合口径。

**随机性纪律（仿真与普通建模的分水岭）**：

- 每个随机源**独立显式**（`default_rng(seed)` 一律显式建 Generator，禁用全局 `np.random`）；
- **种子表**：每个情景的种子写进 `SIM_MANIFEST.json`，可重放；
- **重复次数 N** 由输出方差的置信区间反推（见 §四），**不得用 N=1 报结论**；
- 随机数消耗顺序变化会改变结果——**改代码后必须重跑并对比是否仅由顺序变化引起**。

---

## 三、校准、验证与确认（V&V——评分最容易丢分处）

三类工作，缺一类则结论不成立：

| 类别 | 问什么 | 怎么做（可机检的做法） |
|---|---|---|
| **验证 Verification** | 模型**实现**对不对？（代码 ≠ 规格） | 极端参数极限行为；已知解析解对比；守恒量/流量平衡校验；单元测试化小场景 |
| **校准 Calibration** | 参数取什么值？ | 历史数据/官方数据集拟合；网格或贝叶斯（PyMC）出后验；**报参数不确定区间** |
| **确认 Validation** | 模型**对不对**于真实系统？ | 留出期/留出场景外推对比；与基准方法对照；专家可解释性检查 |
| **不确定性量化 UQ** | 结论有多稳？ | 蒙特卡洛传播输入不确定 → 输出分布；方差分解（SALib Sobol） |

**基线对照是硬要求**：任何仿真结论必须有一个"更笨的对照"（历史均值 / 简单排队公式 / 无干预情景）——
没有对照的提升百分比不成立。清单见 `references/vv-checklist.md`。

---

## 四、实验设计与运行纪律

- **因子表**：列出可控因子、水平、固定因子（写死并声明）、噪声因子。
- **DOE 优先**：因子多时用因子/部分因子设计或拉丁超立方（`experimental-design` 技能 / pyDOE3），
  不要用"逐个改一个参数"的全组合浪费算力。
- **重复与置信区间**：同一情景跑 N 次（种子 1..N），报 **均值 ± t 置信区间**；
  N 的确定：先跑 30 次估 σ，再按目标半宽反推 N。
- **热身期（warm-up）**：稳态指标必须丢弃瞬态段，**说明截断准则**（如均值漂移 < x%）。
- **预算与可复现**：单次运行时长 × 情景数 × N 必须落在赛时预算内；
  超预算先降 N 或降情景数并**声明精度损失**，不得静默缩减。

---

## 五、敏感性、不确定性与稳健性

1. **局部敏感性**：单参数 ±x% 对输出的弹性（OAT，仅作初筛）。
2. **全局敏感性**：Sobol/Morris（SALib），出**一阶/总阶指数排序**——说明"哪个参数真正决定结论"。
3. **稳健性**：在参数不确定区间内重复，检验结论**是否翻转**。翻转即结论脆弱，必须如实降调措辞。
4. **极端情景**：最好/最坏/临界点，检验模型不产生非物理输出。

---

## 六、产物契约

**必须落 `SIM_MANIFEST.json`**（校验器：`scripts/sim_manifest_check.py`）：

```json
{
  "method": "abm|des|sd|continuous|montecarlo|data-driven|hybrid",
  "hybrid_roles": {"mechanism": "...", "optimizer": "...", "sampler": "..."},
  "engine": {"name": "mesa", "version": "3.x", "available": true},
  "time": {"semantics": "discrete_event|fixed_step", "dt": null, "horizon": 100, "unit": "day"},
  "entities": [{"type": "vehicle", "count": 40, "state_vars": ["soc", "pos"]}],
  "randomness": {"generator": "np.random.default_rng", "seeds": [1,2,3], "replications": 30},
  "observations": [{"metric": "makespan", "aggregate": "mean", "ci": "t95"}],
  "calibration": {"params": {"v": 12.5}, "source": "...", "uncertainty": "±0.8"},
  "vv": {"verification": ["..."], "validation": ["..."], "baseline": "..."},
  "runs": {"total": 30, "wall_clock_s": 42.5, "artifact": "results/sim_runs.csv"}
}
```

**结果账本**：每个情景一行（情景 id、参数、N、均值、CI、备注），落 CSV/JSON；
论文中出现的每个仿真数字都必须能追到这张账本（与 `comp-consistency` 的 facts 口径一致）。

**图**：仿真特有必出图——①演化曲线（含置信带）②情景对比 ③敏感性排序（Sobol 条形）④相图/热图（空间类）。
制图走 `paper-figure` / `figure-craft`，配色走统一注册表。

---

## 七、论文与视频槽位

- **论文**：仿真专章建议结构 = 问题与机理 → 模型规格（五要素）→ 校准与 V&V → 实验设计 → 结果与情景对比 → 敏感性/稳健性 → 管理启示。
  写作走 `comp-paper-zh`（中文）；引用与去 AI 味按主链既有契约。
- **仿真视频**（本赛事为**必要**交付件）：展示 ①界面与功能模块 ②运行过程（录屏，关键参数特写）③结果与可视化。
  规格与制作链路见 `references/deliverables.md`；录制走执行环境自带录屏（或系统录屏工具）或 CDP screencast，剪辑/压缩走 ffmpeg。
- **反 AI 味**：仿真视频的旁白/字幕与论文文字同受赛事 AIGC 审查口径约束（本赛事当届阈值未取证，
  首届为 AIGC>30% 即判雷同——按保守对待）。

---

## 八、完成铁律

1. **无 `SIM_MANIFEST.json` 即未完成**——校验器 exit 非 0 不得宣称完成。
2. **无基线对照即结论不成立**——每个核心结论必须写出对照是什么。
3. **N=1 的运行不构成证据**——单次结果只能作为调试输出。
4. **种子必须落盘**——不可复现的仿真结论按未执行处理。
5. **缺席引擎如实登记 `unavailable`**，不得虚构运行证据；方法论层不依赖特定库。
6. **数值口径跨文件一致**——账本、论文、图、视频字幕的数字必须逐项对齐。

## 预期行为

- 收到赛题后**先出选型论证 + 五要素表 + V&V 计划**，经确认再写代码；
- 每轮运行落盘 manifest 与账本，**增量追加不覆盖**；
- 结论句一律带置信区间或稳健性限定词。

## 异常处理预案

| 现象 | 处置 |
|---|---|
| 引擎未安装 | 记 `unavailable`；降级纯标准库最小实现（方法与契约不变），并在交付中声明 |
| 运行超时 | 先降 N 再降情景数，逐级声明精度损失；不得删情景不留痕 |
| 结果对种子极敏感 | 提高 N 并报分布而非点值；若仍不收敛 → 模型本身不稳定，须回到 §二 改规格 |
| 校准无数据 | 用文献值/合理区间 + 全局敏感性替代，**明确标注为"未校准"** |
| 与基线相比无提升 | 如实报告；把"为何无提升"写成分析，而不是调参凑数 |
