| name | comp-modeling |
| description | 数学建模竞赛核心建模与求解。建立数学模型、推导公式、设计算法。Use when user says "建模", "modeling", "模型建立". |
| argument-hint | ["problem-analysis-or-topic"] |
| allowed-tools | Bash(*), Read, Write, Edit, Grep, Glob, WebSearch, WebFetch, Agent |
竞赛建模求解
基于赛题分析进行数学建模与求解:$ARGUMENTS
常量
输入
-
PROBLEM_ANALYSIS.md — 赛题分析报告(必须存在)
-
user_data/ — 赛题附件数据
工作流程
Step 1: 读取分析报告 + 方法对照 + 防错审查
提取子问题列表、推荐方法、变量定义、数据特征。
⛔ 对照 PROBLEM_ANALYSIS.md 的推荐方法: 如果选择了不同于推荐的方法,必须在 MODELING_REPORT.md 中明确说明理由(为什么推荐方法不适用、替代方法的优势)。不能无声地忽略推荐方法。
⛔ 防错审查(必做): 读取 _references/error_prevention.md,根据本题涉及的题型(优化/微分方程/统计/评价/图论/几何/动态规划),对照对应章节的"必须做"和"禁止做"条目。在 MODELING_REPORT.md 末尾写一行:本题涉及题型:[X, Y, Z],已对照防错手册审查。
Step 2: 模型假设
每个假设必须有合理性说明。假设要合理且必要,不做不切实际的简化。
⛔ 假设参数化原则: 关键假设必须在代码层面做成可切换的参数,而不是硬编码到逻辑里。这样发现假设错误时,改一个参数就能修正,不需要重写整个求解逻辑。
在 MODELING_REPORT.md 中,每个假设旁边必须写明:
假设 1: [假设内容]
- 理由: [为什么这样假设,不能留空]
- 参数化: [对应代码中的哪个变量/开关]
- 替代假设: [如果这个假设不成立,替代方案是什么]
示例:
假设 3: 每类设备允许多台并行分担同一工序的工程量
- 理由: 题目说"各类设备须分别完成该工序对应的工程量","各类"指设备类型而非单台设备;且问题四增加预算购买设备才有意义
- 参数化: ALLOW_PARALLEL = True(代码中的开关变量)
- 替代假设: 每类设备只用 1 台(ALLOW_PARALLEL = False),但这会导致问题四退化为问题三
⛔ 如果某个假设写不出有力的理由,说明这个假设需要再推敲。 回到 PROBLEM_ANALYSIS.md 的假设预检结果重新审视。
Step 3: 逐子问题建模
每个子问题:
-
方法调研 — 用 WebSearch 搜索"[问题类型] 数学建模 方法"或"[problem type] optimization method",了解这类问题的主流求解方法。不要只凭训练知识选方法——同一类问题在不同规模下最优方法可能完全不同(如 TSP 小规模用精确求解,大规模用 LKH 启发式)
-
模型选择与理由 — 为什么选这个模型,与候选模型的优势对比,引用调研到的文献支撑
-
数学公式推导 — 完整严谨,使用 LaTeX 数学环境(目标函数+约束条件)
-
求解算法设计 — 伪代码或流程描述
方法选择参考 _references/methods_table.md。
Step 4: 符号说明表
确保所有公式中的符号都有定义:
| 符号 | 含义 | 单位 | 取值范围 | 首次出现 |
|------|------|------|----------|----------|
Step 5: 模型检验与灵敏度分析设计
-
模型检验:回代检验、交叉验证、残差分析
-
灵敏度分析:关键参数的变化范围和影响
-
鲁棒性检验:数据扰动下的稳定性
Step 5.5: ⛔ 合理性预验证 + 结果预期范围表(建模完成后必做)
核心原则:物理约束 > 数据忠实度 > 计算正确性
编码阶段是纯执行者,遇到"结果不对"只能按建模阶段的预案操作,不得自行发明修正方法。因此建模阶段必须把所有决策做完。
执行步骤:
-
对照防错手册审查模型:重新查阅 _references/error_prevention.md 中本题对应题型的"必须做"和"禁止做"条目,逐条确认模型是否满足。不满足的当场修改模型。
-
输出建模报告的 5 项必备内容(在 MODELING_REPORT.md 末尾,comp-code 必须对照执行):
① 结果约束清单(硬边界,超出即判定代码有误):
## 结果约束清单
- [变量名] ∈ [下界, 上界],物理含义:[为什么是这个范围]
- [变量名] 的符号/方向约束:[说明]
- [守恒量]:[应满足的恒等式或误差上限]
② 预期行为描述(定性描述合理结果的"形状"):
## 预期行为
- 时间尺度:系统应在 [X] 时间内达到 [什么状态]
- 稳态特征:[哪些量] 应趋于常数/周期/衰减
- 瞬态特征:[初始阶段应该看到什么现象]
- 单调性/对称性:[哪些量应该单调递增/对称/...]
③ 异常处理预案(每种异常只给一种修正方法,不留选择空间):
## 异常处理预案
若出现 [具体异常描述]:
→ 原因判断:[最可能的原因]
→ 唯一修正方法:[具体步骤]
→ 禁止:[不允许的替代方案]
④ 方法唯一性声明(每个计算步骤指定唯一方法,包括预处理/后处理/插值/滤波):
## 方法指定
步骤 N:[做什么]
方法:[唯一指定的方法名 + 关键参数]
输入:[从哪来]
输出:[到哪去]
禁止替代:[不允许用的方法,以及为什么不用]
⑤ 验证检查点(编码阶段必须执行的 pass/fail checklist):
## 验证检查点
□ [检查项]:[判定条件],若 fail → [跳转到哪个异常预案]
□ [检查项]:[判定条件],若 fail → [跳转到哪个异常预案]
□ 最终:所有输出量均在约束清单范围内
⛔⛔⛔ 建模阶段强制修复原则(不可跳过):
审查中发现任何问题,必须当场修复模型再继续,不能留给 comp-code 阶段:
⛔ 禁止的做法:
⛔ 检测到问题 = 必须修复。解释原因 ≠ 处理完毕。本步骤不允许带着已知问题输出 MODELING_REPORT.md。
Step 6: 输出
保存到 MODELING_REPORT.md:模型假设、符号说明、每个子问题的模型/公式/算法、检验方案、灵敏度分析方案、编程实现要点。
⛔ 必须将 PROBLEM_ANALYSIS.md 中的图表预规划带入 MODELING_REPORT.md。 在报告末尾附上图表预规划章节(从 PROBLEM_ANALYSIS.md 复制或更新),确保 paper-figure 能读到完整的图表清单。如果建模过程中发现需要额外的图表(如灵敏度分析曲线、模型对比热力图),在此处补充。
⛔ MANDATORY: 输出前自检(写完 MODELING_REPORT.md 后必须逐项检查):
echo "=== 建模报告自检 ==="
[ -f MODELING_REPORT.md ] || { echo "❌ MODELING_REPORT.md 不存在!"; exit 1; }
PROB_COUNT=$(grep -c '问题[一二三四五六七八九十0-9]' PROBLEM_ANALYSIS.md 2>/dev/null || echo 0)
MODEL_SECTIONS=$(grep -c '## .*问题[一二三四五六七八九十0-9]\|## .*Problem' MODELING_REPORT.md 2>/dev/null || echo 0)
echo "赛题子问题数: $PROB_COUNT, 建模报告覆盖: $MODEL_SECTIONS"
[ "$MODEL_SECTIONS" -lt "$PROB_COUNT" ] && echo "❌ 有子问题未建模!"
OBJ_COUNT=$(grep -c '目标函数\|min\|max\|最小化\|最大化\|objective\|模型公式\|数学模型' MODELING_REPORT.md 2>/dev/null || echo 0)
echo "目标函数/模型公式出现次数: $OBJ_COUNT"
[ "$OBJ_COUNT" -eq 0 ] && echo "❌ 未找到任何目标函数或模型公式!"
CONSTRAINT_COUNT=$(grep -c '约束\|s\.t\.\|subject to\|限制条件\|≤\|≥' MODELING_REPORT.md 2>/dev/null || echo 0)
echo "约束条件出现次数: $CONSTRAINT_COUNT"
grep -q '符号.*说明\|符号.*含义\|Symbol.*Description' MODELING_REPORT.md && echo "✅ 符号说明表存在" || echo "❌ 缺少符号说明表"
grep -qi '灵敏度\|sensitivity\|鲁棒性\|robustness\|稳健性' MODELING_REPORT.md && ||
grep -qi MODELING_REPORT.md && ||
grep -qi MODELING_REPORT.md && ||
PARAM_COUNT=$(grep -c MODELING_REPORT.md 2>/dev/null || 0)
[ -eq 0 ] &&
如果有 ❌ 项,必须补充后再结束本步骤。⚠ 项建议补充但不强制。
关键规则
-
公式必须严谨:每个变量定义,每个等式有推导依据
-
⛔ Markdown 中的 LaTeX 公式格式规范(确保前端能正确渲染):
-
块级公式:$$ 必须单独占一行,前后各空一行
-
行内公式:用 $...$,内部避免用 _ 做下标时与 markdown 斜体冲突,复杂公式用块级
-
\begin{aligned} 等多行环境必须放在 $$...$$ 块级公式中,不要放在行内 $...$ 中
-
避免在公式中使用 \text{} 包裹中文(KaTeX 对中文支持有限),中文说明放在公式外面
-
模型假设是评审重点:合理、必要、有说服力
-
符号说明表必须完整
-
灵敏度分析不能省(评审加分项)
-
编程实现要点要具体:算法、库、输入输出格式
-
⛔ 主输出文件:MODELING_REPORT.md。不要在根目录写额外报告
-
⛔ 本步骤只输出 MODELING_REPORT.md,不要写 Python/MATLAB 代码文件。 代码实现是下一步 comp-code 的任务。本步骤只需要在报告中描述算法伪代码、求解思路、编程实现要点即可。如果需要验证某个公式或做简单计算,可以用 Bash 内联 Python 一次性脚本,但不要创建 code/*.py 文件
-
⛔ 分段写入:每次 Bash heredoc < 150 行。 MODELING_REPORT.md 通常很长,必须分 3-4 段追加写入(cat << 'EOF' >> MODELING_REPORT.md),不要一次性写完整个文件
⛔⛔ 建模阶段通用禁止声明
详细条目见 _references/error_prevention.md,以下为最高优先级的两条硬性禁止:
-
禁止未声明的几何/物理简化 — 必须用实体完整几何作为约束判据,禁止降维简化(矩形→线段、实体→质心点)。若确需简化必须显式声明适用条件和误差上界。
-
禁止约束遗漏 — 题目中每个"不超过/至少/必须满足"都必须对应一个数学约束表达式。物理接触约束(不能穿透/重叠/超出边界)必须显式建模为不等式约束。