| name | comp-prob-analysis |
| description | 数学建模竞赛赛题分析。拆解子问题、定义变量、拟定建模思路。Use when user says "赛题分析", "problem analysis", "分析题目". |
| argument-hint | ["competition-problem-text"] |
| allowed-tools | Bash(*), Read, Write, Edit, Grep, Glob, WebSearch, WebFetch, Agent |
竞赛赛题分析
对以下赛题进行深度分析:$ARGUMENTS
常量
输入
-
赛题文本($ARGUMENTS 或 user_data/ 中的 PDF/Word 文件)
-
附件数据(user_data/*.csv 等)
工作流程
Step 0: 读取赛题原文 + 上游规划
⛔ 赛题读取优先级(严格按此顺序,不要跳过):
echo "=== 检查赛题文本 ==="
for f in user_data/*_extracted.txt; do
[ -f "$f" ] || continue
echo "找到提取文本: $f"
head -3 "$f"
done
-
user_data/*_extracted.txt(最高优先级) — 系统已用 Vision AI 识别 PDF 生成,公式为 LaTeX 格式(如 $k = 2 \times 10^7$),直接 Read 读取
-
user_data/*.pdf — ⛔ 禁止直接用 Read 工具读 PDF! PDF 的数学公式会变成乱码(如 7210 实际是 $7 \times 10^2$)。如果没有 _extracted.txt,用下面的脚本提取
-
$ARGUMENTS 文本 — 用户在创建工作流时输入的文字
⛔ 绝对不要直接 Read PDF 文件。 PDF 中的上标、下标、数学符号无法正确提取,会导致参数值错误(如 $10^7$ 变成 "107")。必须读 _extracted.txt。
如果 TOPIC_PLAN.md 存在(统计建模选题规划),先读取它,确保分析方向与选题规划一致:
[ -f TOPIC_PLAN.md ] && echo "=== TOPIC_PLAN.md exists ===" && cat TOPIC_PLAN.md || echo "No TOPIC_PLAN.md (normal for math modeling competitions)"
只有在没有 _extracted.txt 时才尝试提取:PDF 用 pdftotext 或 PyPDF2,Word 用 python-docx。
Step 1: 赛题全文解读
提取:背景信息、核心问题、已知条件、评价标准。
⛔ 子问题数量识别规则(必须严格遵守):
-
只有赛题中明确编号的顶层问题才算子问题。常见格式:
-
不要把子问题内部的小问 (1)(2)(3) 或 a/b/c 当成独立子问题——它们是同一个子问题的不同部分
-
不要把背景描述、数据说明、提交要求当成子问题
-
如果赛题只有 2 个问题,就是 2 个,不要凑成 3-4 个
-
识别完后在报告开头明确写出:"本赛题共 X 个子问题"
Step 1.5: 假设敏感性预检(⛔ 必做,防止全盘方向错误)
核心原则:拿到题后先花时间做"假设预检",不要急着建模。一个关键假设选错,后续所有结果都会偏离题目设计意图。
1. 识别模糊表述,列出多种解释:
逐句读题目,找出所有可能有歧义的表述。对每个模糊点,列出至少两种合理解释:
模糊表述清单:
1. "[原文引用]"
- 解释A: ...
- 解释B: ...
- 初步倾向: A/B,理由: ...
2. "[原文引用]"
- 解释A: ...
- 解释B: ...
常见歧义类型:
-
数量歧义:"各类设备完成工程量"→ 每类 1 台 vs 每类多台并行?
-
范围歧义:"优化方案"→ 只优化顺序 vs 同时优化数量和顺序?
-
约束歧义:"不超过预算"→ 总预算 vs 每期预算?
-
时间歧义:"完成时间最短"→ 最后一个完成的时间 vs 所有任务总时间?
2. 对关键歧义做快速验算(两种解释都算一遍问题一):
对影响最大的 1-2 个歧义点,用最简单的方法(手算/Excel/10 行 Python)把两种解释都在问题一上算一遍:
假设预检结果:
- 解释A: 问题一结果 = XXX
- 解释B: 问题一结果 = YYY
- 选择: B,理由: [结果更合理 / 更符合后续问题递进设计 / ...]
3. 检查问题递进性(最关键的验证手段):
竞赛题的问题一般层层递进。在你选定的假设下,预判每个问题的结果应该如何变化:
问题递进性预判:
- 问题一(基础场景)→ 结果: 基准值
- 问题二(增加约束/扩大规模)→ 结果应该: 比问题一差/好,因为...
- 问题三(进一步变化)→ 结果应该: 比问题二有明显变化,因为...
- 问题四(花钱/加资源)→ 结果应该: 比问题三明显改善,因为...
⛔ 递进性退化检测: 如果在你的假设下,某个后续问题的结果和前一个问题几乎相同(新增的变量/资源对目标函数没有边际效益),说明你的假设大概率有问题。立刻回头检查基础假设,不要继续往下做。
4. 在 PROBLEM_ANALYSIS.md 中显式记录假设预检结果:
## 假设敏感性预检
### 模糊表述及解释
[列出每个歧义点和选择的解释]
### 快速验算对比
[两种解释在问题一上的结果对比]
### 问题递进性预判
[每个问题的预期结果变化方向]
### 最终假设选择及理由
[选择了哪种解释,为什么]
Step 2: 子问题拆解
每个子问题明确:
-
输入/输出
-
难度(简单/中等/困难)
-
建议方法
-
与其他子问题的关系(依赖/独立/递进)
Step 3: 数据探索
检查 user_data/ 中是否有附件数据。
有数据:分析数据规模、字段含义、数据质量、数据特征。
无数据(纯建模题):标注"本题无附件数据",在建模思路中说明需要自行构造参数/初始条件(如优化问题的约束参数、微分方程的初始值、蒙特卡洛的分布假设等)。
⛔ 数据探索的边界: 本步骤只做描述性统计和初步特征识别(数据规模、缺失率、分布形态、相关性矩阵、异常值检测),不要做建模求解。以下行为属于越界:
-
拟合模型(线性回归、周期函数拟合、移动平均预测等)→ 留给 comp-modeling
-
写独立的 .py 文件保存到 code/ 目录 → 留给 comp-code
-
优化求解(遗传算法、线性规划等)→ 留给 comp-code
-
如果需要用 Python 做简单的描述性统计(如 df.describe()、df.isnull().sum()),可以用 Bash 内联一次性脚本,但不要创建独立文件
Step 4: 变量定义与符号表
| 符号 | 含义 | 单位 | 类型 |
|------|------|------|------|
Step 5: 建模思路规划
每个子问题 1-2 种候选方法,标注推荐方案。
常用模型类型:优化类、预测类、评价类、分类/聚类、图论/网络、随机/统计、微分方程。
Step 5.5: 范例感知 + 图表预规划
在输出分析报告前,先读取参考资料了解可用的图表类型:
cat _utils/figure_exemplars.md 2>/dev/null || cat skills/shared-scripts/figure_exemplars.md
cat _utils/figure_style_guide.md 2>/dev/null || cat skills/shared-scripts/figure_style_guide.md
图表规划方法(按分析步骤推导,不要套模板):
先读 figure_exemplars.md 中的"按研究方法的图表套餐":
再读 figure_style_guide.md 的 "By data shape" 决策表,对每个分析步骤做推导:
| 分析步骤输出 | 数据形态 | 推荐图表 |
|------------|---------|---------|
| 多变量时间趋势 | 时间×值 | 折线图 basic #3 |
| 变量相关系数矩阵 | N×N 矩阵 | 聚类热力图 advanced #14 |
| 多模型多指标数值 | 方法×指标矩阵 | 分组柱状图 basic #1 或 方法对比热力图 advanced #16 |
| 系数±标准误 | 系数+CI | 森林图 empirical #1 |
| 正负方向效应值 | 正负差值 | 发散柱状图 advanced #20 |
| 多组分布形态 | 多组连续值 | Ridgeline advanced #23 或 Grouped Violin advanced #24 |
| 地理空间数据 | 地理×值 | 地图热力图 competition #7 |
| 排名数据 | 名称×单一数值 | 棒棒糖图 advanced #1 |
| 模块增量贡献 | 步骤×增量 | Waterfall advanced #6 |
⛔ 每张图必须写明配方编号和选择理由,格式:
fig_xxx — 发散柱状图 (advanced #20) — 效应分解有正有负,发散柱状图能直观展示方向 — 章节: 实证结果
⛔ 配方编号是必填项! 格式为 (类别 #编号),如 (advanced #1)、(basic #3)、(empirical #1)、(competition #7)。系统会根据配方编号自动注入对应的代码模板到 Claude 的 prompt 中。如果不写配方编号,Claude 将无法获得配方代码,只能从零写图表脚本,质量无法保证。如果图表类型不在配方库中,写 (custom) 标注。
配方库是"菜单"不是"菜谱"——知道有哪些图表可用,但根据你的数据和选题自主决定。如果你认为某种不在配方库里的图表更适合,也可以用。
硬规则(只有这几条必须遵守):
-
同一种图表类型不超过 3 次(如已有 3 个柱状图,下一个对比换别的类型)
-
每张图必须指定具体类型(不能写"对比图",要写"分组柱状图"或"发散柱状图"或"雷达图")
-
至少 1 张 DrawIO 技术路线图(放问题重述章节末尾 1_restatement.tex)
-
如果涉及空间数据,必须有空间分布可视化(地图热力图/LISA图)
-
如果涉及模型对比(≥3个模型),至少用 2 种不同的对比图表类型
-
如果涉及前后/分组对比,考虑发散柱状图、Back-to-Back Bar、配对点图等方向性图表
在 PROBLEM_ANALYSIS.md 中输出图表预规划清单:
## 图表预规划
### 数据图表清单
对每张图写明:文件名 — 具体图表类型 (配方编号) — 展示什么数据/传达什么信息 — 放在哪个章节
示例(根据实际选题自由发挥,每张图必须带配方编号):
- fig_xxx — 棒棒糖图 (advanced #1) — 方法排名对比 — 章节: 模型对比
- fig_yyy — 森林图 (empirical #1) — 回归系数及置信区间 — 章节: 实证结果
- fig_zzz — 可行域图 (competition #28) — 约束条件与最优解 — 章节: 模型求解
- TABLE_xxx — [表格描述] — [章节位置]
### DrawIO 架构图清单
对每张 DrawIO 图写明:编号 — 图类型 — 展示什么内容 — 放在哪个章节。
**⛔ 语言规则:DrawIO 图中的所有文字(节点标签、箭头标注、分组框标题)必须与论文语言一致。**
- 中文赛题(国赛/数维杯中文/MathorCup/长三角/五一/华为杯等)→ 图中文字用中文
- 英文赛题(MCM/ICM/APMCM/数维杯英文/认证杯英文等)→ 图中文字用英文
必须规划(所有赛题):
- DrawIO-1: 技术路线图 — 整体求解思路 → 问题重述章节末尾 (1_restatement.tex)
竞赛多问题赛题额外规划(每个子问题都需要求解流程图):
- DrawIO-2: 问题一求解流程图 → fig_flow_q1.drawio → 问题一章节开头
- DrawIO-3: 问题二求解流程图 → fig_flow_q2.drawio → 问题二章节开头
- DrawIO-4: 问题三求解流程图 → fig_flow_q3.drawio → 问题三章节开头
- ...(有几个子问题就规划几张,一一对应)
按需规划(根据赛题特征判断,写明理由):
- DrawIO-N: [模型架构图/变量关系图/算法流程图/Pipeline图/概念框架图] — [展示什么] → [章节位置] — 理由: [为什么需要这张图]
### 图表多样性检查
[列出每种图表类型的使用次数,确认无重复超过 3 次]
总计: ~X 数据图 + ~Y 表 + Z DrawIO + P TikZ + W GPT Image
GPT Image / DrawIO 图预规划
GPT Image 只用于场景示意图(物理/工程类赛题的问题背景图)。技术路线图、求解流程图、架构图等结构化图表使用 DrawIO。
GPT Image 场景示意图(按需,仅物理/工程类赛题):
DrawIO / TikZ / GPT Image 图类型与适用场景(按赛题特征选择):
| 图类型 | 推荐工具 | 适用场景 | 放置位置 | 是否必须 |
|--------|---------|---------|---------|---------|
| 技术路线图 | DrawIO | 所有赛题 | 问题重述章节末尾(1_restatement.tex),国赛/竞赛没有单独问题分析章节时放问题重述 | ✅ 必须(1张) |
| 子问题求解流程图 | DrawIO | 竞赛多问题赛题,每个子问题一张 | 各子问题章节开头 | ✅ 每个子问题必须 |
| 数据处理 Pipeline | DrawIO | 涉及多阶段数据清洗/特征工程 | 数据预处理章节 | 按需 |
| 概念框架图(简单分层) | DrawIO | 涉及理论模型/研究框架构建(无复杂连线) | 引言或理论分析章节 | 按需 |
| 指标体系层次图 | DrawIO | 涉及 AHP/熵权法/TOPSIS/模糊综合评价等评价类问题 | 模型构建章节 | 评价类必须 |
| 模型选择决策树 | DrawIO | 涉及多种候选模型需要对比选择 | 模型构建章节 | 按需(≥3候选模型时推荐) |
| 甘特图/调度方案图 | DrawIO | 涉及排程/调度/资源分配/时间规划 | 求解结果章节 | 调度类必须 |
| 网络拓扑图(≤15节点) | DrawIO | 涉及图论/物流网络/社交网络 | 问题描述或求解结果章节 | 图论类必须 |
| 方法对比矩阵图 | DrawIO | 涉及多方法优缺点对比 | 模型构建章节 | 按需 |
| 模型架构图 | TikZ | 涉及神经网络/深度学习/集成模型 | 模型构建章节 | 按需 |
| 变量关系/因果路径图 | TikZ | 涉及因果推断/中介效应/SEM | 理论框架或模型设定章节 | 按需 |
| 算法流程图(带公式) | TikZ | 涉及自定义算法/迭代优化/启发式搜索 | 算法描述章节 | 按需 |
| 几何示意图(2D 平面) | TikZ | 涉及平面几何关系(三角形、圆、角度标注、坐标系) | 问题描述章节 | 按需 |
| 几何示意图(3D 空间) | GPT Image | 涉及 3D 空间几何(圆柱体、球面、反射/折射、空间坐标系) | 问题描述章节 | 按需 |
| 概念框架图(复杂连线) | TikZ | 有跨层箭头+标注系数的理论框架 | 理论框架章节 | 按需 |
| 网络拓扑/路径图(>15节点或需标注路径) | TikZ/matplotlib | 节点多或需要精确标注最优路径+权重 | 求解结果章节 | 按需 |
| 场景示意图 | GPT Image | 涉及物理/工程空间场景(无人机/传感器/交通等) | 问题重述章节 | 按需(仅物理/工程类) |
速查:需要公式→TikZ,需要精确连线→TikZ,需要写实渲染→GPT Image,其余→DrawIO
⛔ TikZ vs GPT Image 判断(几何示意图必须过这条规则):
-
图中有圆柱体、球体、锥体、曲面等 3D 立体 → GPT Image(TikZ 画 3D 透视会变形、标注重叠)
-
图中有反射/折射光线在 3D 空间中传播 → GPT Image
-
图中只有 2D 平面元素(圆、三角形、直线、角度标注、坐标轴)→ TikZ
-
不确定时 → GPT Image(比 TikZ 画 3D 安全得多)
⛔ 按赛题特征自动判断(规划时必须逐条过一遍,符合条件的必须规划):
一、所有赛题必须:
二、按赛题类型触发(逐条检查,符合就加):
-
赛题有多个子问题 → 每个子问题都必须有一张求解流程图,放在对应章节开头。简单问题的流程图可以简化(3-4 个节点),但不能省略
-
赛题涉及评价/排名/打分(AHP/熵权法/TOPSIS/模糊综合评价/灰色关联) → 加指标体系层次图(目标层→准则层→指标层)
-
赛题涉及深度学习/集成学习/多模型融合 → 加模型架构图(TikZ)
-
赛题涉及因果推断/路径分析/中介效应/SEM → 加变量关系图(TikZ)
-
赛题涉及自定义迭代算法(遗传算法/模拟退火/强化学习/粒子群/蚁群) → 加算法流程图(TikZ,带公式)
-
赛题涉及复杂多阶段数据预处理(爬虫→清洗→特征工程→建模) → 加 Pipeline 图
-
赛题需要构建理论框架(经管/社科类,有假设推导) → 加概念框架图
-
赛题涉及图论/网络优化/物流配送/社交网络 → 加网络拓扑图或路径图
-
赛题涉及排程/调度/资源分配/生产计划 → 加甘特图
-
赛题涉及物理/工程空间场景(光学/无人机/传感器/交通/热传导) → 加场景示意图(GPT Image)或几何示意图(TikZ)
-
赛题有 ≥3 种候选模型需要对比选择 → 加模型选择决策树(展示选模型的逻辑)
-
赛题涉及空间数据/地理分布 → 加空间分布示意图(可用 matplotlib 地图热力图代替)
⛔ 每张 DrawIO 图必须在清单中写明文件名,格式为 fig_xxx.drawio,流程与架构图绘制 步骤会按此清单逐条生成并校验。
在 PROBLEM_ANALYSIS.md 中输出:
### GPT Image / DrawIO / TikZ 图清单
**语言: [中文/English]**(与论文语言一致,图中所有文字使用此语言)
DrawIO 图(技术路线图/流程图/Pipeline/指标体系/决策树/甘特图/网络图):
- DrawIO-1: 技术路线图 → fig_roadmap.drawio → 问题重述章节末尾 (1_restatement.tex) [必须]
- DrawIO-2: 问题一求解流程图 → fig_flow_q1.drawio → 问题一章节开头 [按需]
- DrawIO-3: 指标体系层次图 → fig_index_hierarchy.drawio → 模型构建章节 [评价类必须]
- DrawIO-4: 数据处理Pipeline → fig_pipeline.drawio → 数据预处理章节 [按需]
- DrawIO-5: 模型选择决策树 → fig_model_decision.drawio → 模型构建章节 [按需]
- DrawIO-6: 甘特图/调度方案 → fig_gantt.drawio → 求解结果章节 [调度类必须]
- DrawIO-7: 网络拓扑/路径图 → fig_network.drawio → 问题描述或结果章节 [图论类必须]
- DrawIO-8: 概念框架图 → fig_framework.drawio → 理论分析章节 [按需]
TikZ 图(模型架构图/变量关系图/算法流程图/几何示意图,需要精确连线或公式):
- TikZ-1: [图类型] → tikz_diagrams.tex → [章节位置] [按需]
GPT Image 场景示意图(仅物理/工程类赛题):
- GPTIMG-1: {场景名}示意图 → fig_scene.png → 问题重述章节 (1_restatement.tex) [按需]
总计: N 张 DrawIO + P 张 TikZ + M 张 GPT Image
Step 6: 输出
输出前自检:
保存到 PROBLEM_ANALYSIS.md:赛题概述、子问题拆解、数据探索摘要、变量定义、建模思路(含图表预规划)、工作计划。
⛔ 分段写入规则(防止输出截断导致空工具调用):
PROBLEM_ANALYSIS.md 通常很长(3000-8000 字),必须分段写入,每段 < 150 行:
cat << 'EOF' > PROBLEM_ANALYSIS.md
...
...
EOF
cat << 'EOF' >> PROBLEM_ANALYSIS.md
...
...
EOF
cat << 'EOF' >> PROBLEM_ANALYSIS.md
...
...
EOF
cat << 'EOF' >> PROBLEM_ANALYSIS.md
...
EOF
⛔ 禁止一次性用 Write 工具写完整个文件。 如果内容超过 150 行,必须用多次 cat << 'EOF' >> file 追加。一次性写太长会导致输出 token 截断,触发空工具调用循环。
关键规则
-
不要跳过数据探索
-
子问题间的逻辑关系很重要
-
建模思路要具体(不要只写"用机器学习")
-
时间紧迫,分析要高效
-
⛔ Markdown 中的 LaTeX 公式:$$ 块级公式单独成行且前后空行,行内用 $...$,\begin{aligned} 等多行环境用块级,避免 \text{} 包裹中文
-
⛔ 主输出文件:PROBLEM_ANALYSIS.md。不要在根目录写额外报告
-
⛔ 不要创建独立的 .py 文件。 本步骤只输出 PROBLEM_ANALYSIS.md。数据探索用 Bash 内联 Python 一次性脚本即可,不要保存为 code/*.py。建模求解和编程实现是后续步骤的职责
-
⛔ 分段写入:每次 Bash heredoc < 150 行。 不要一次性写完整个报告,分 3-4 段追加写入(>> 而非 >)