| name | problem-decomposer |
| description | 多子问题拆解与依赖分析。触发词: 子问题拆解、拆题、problem decomposition、依赖关系、求解顺序、时间分配、并行安排。 |
| argument-hint | ["competition-problem-or-problem-file"] |
| allowed-tools | Bash(*), Read, Write, Edit, Grep, Glob, Agent, mcp__codex__codex, mcp__codex__codex-reply |
多子问题拆解
执行描述: $ARGUMENTS
Constants
- DECOMPOSITION_FILE =
PROBLEM_DECOMPOSITION.md — 主输出文件,供 model-creator、solve-plan、paper-plan 使用。
- INPUT_ANALYSIS_FILE =
PROBLEM_ANALYSIS.md — 上游赛题分析报告,作为辅助上下文。
- DEFAULT_TOTAL_HOURS =
72 — 默认竞赛总时长,用于建议时间分配。
- MAX_MAIN_SUBPROBLEMS =
5 — 主子问题建议控制在 3-5 个,超过时需要合并或降级为支撑任务。
- MAX_CANDIDATE_TASKS =
8 — 候选任务超过 8 个时先做聚类合并,不直接写进主报告。
- DEPENDENCY_LEVELS =
independent|weak|strong — 依赖强度枚举。
- DIFFICULTY_LEVELS =
L1|L2|L3|L4 — 难度档位,从基础数据处理到复杂优化求解。
- REVIEWER_MODEL =
gpt-5.4 — Codex MCP 交叉验证模型。
- REASONING_EFFORT =
xhigh — 拆解复核时统一使用高推理强度。
- ARTIFACT_DIR =
artifacts/ — 存放中间结构化文件,避免只留下不可追溯的自然语言结果。
Workflow
Phase 1: 收集题面与上游分析
Input: $ARGUMENTS、PROBLEM_ANALYSIS.md、题面原文文件。
Output: artifacts/problem_scope.json 与标准化题面文本。
- 优先读取题面原文,不要只依赖
PROBLEM_ANALYSIS.md。
- 如果
$ARGUMENTS 是文件路径,读取全文。
- 如果
$ARGUMENTS 是题面摘要,再检查 PROBLEM_BRIEF.md、problem.txt、docs/ 目录中的题面文件。
- 读取
PROBLEM_ANALYSIS.md,提取上游识别出的题型、候选方法、数据范围、显式难点。
- 扫描题面中的显式问法锚点,如"问题一""第 2 问""(3)""Question C""Task 4"。
- 扫描隐式交付要求,如"进一步评价""提出建议""考虑不确定性""分析模型稳定性"。
- 把题面中的对象、时间范围、空间范围、评价标准、决策目标单独摘出。
- 标准化子问题编号格式为
Q1、Q2、Q3,同时保留原题面锚点。
- 如果题面只有一个大问题但包含多个动作动词,暂时先保留为候选任务,在后续阶段再合并。
- 记录输入来源,后续报告中要明确哪些判断来自题面,哪些来自上游分析。
from pathlib import Path
import json
import re
def load_problem_text(argument: str) -> str:
candidate = Path(argument)
if candidate.exists() and candidate.is_file():
return candidate.read_text(encoding="utf-8")
for fallback in ["PROBLEM_BRIEF.md", "problem.txt", "docs/problem.md"]:
path = Path(fallback)
if path.exists():
return path.read_text(encoding="utf-8")
return argument
text = load_problem_text("PROBLEM_BRIEF.md")
patterns = [
r"问题[一二三四五六七八九十]+",
r"第[一二三四五六七八九十]+问",
r"\(\d+\)",
r"Question\s+[A-Z]",
r"Task\s+\d+",
]
anchors = []
for pattern in patterns:
anchors.extend(re.findall(pattern, text, flags=re.IGNORECASE))
payload = {
"anchors": anchors,
"length": len(text),
"has_analysis_file": Path("PROBLEM_ANALYSIS.md").exists(),
}
Path("artifacts").mkdir(exist_ok=True)
Path("artifacts/problem_scope.json").write_text(
json.dumps(payload, ensure_ascii=False, indent=2),
encoding="utf-8",
)
print(payload)
Phase 2: 识别显式与隐式子问题
Input: 标准化题面文本、PROBLEM_ANALYSIS.md。
Output: artifacts/subproblem_candidates.json。
- 先做显式拆解,按题面编号、标题、列表结构切分自然子问题。
- 再做隐式拆解,从动词和交付物中识别"建模""预测""评价""优化""分类""策略建议"等任务。
- 合并规则遵守"同一输入、同一目标、同一输出"原则。
- 只要目标函数不同、评价指标不同或结果用途不同,就保留为不同子问题。
- 如果题面写"建立模型并回答以下问题",不要把"建模"误拆成一个独立主子问题。
- 为每个候选任务记录:
id、original_anchor、goal、deliverable、required_data、likely_method_family、upstream_results_needed。
- 每个候选任务必须归到四大主类型之一:
优化、预测、评价、分类。
- 可附加副标签:
仿真、估计、调度、鲁棒性、政策分析。
- 对 CUMCM 常见"第一问基础建模、第二问扩展、第三问优化、第四问综合建议"结构,要区分主子问题与收尾任务。
- 对 MCM 开放题,允许识别"指标构建""核心模型""方案比较""政策分析"四层结构,但主表尽量仍控制在 3-5 个。
Phase 3: 构建依赖关系图
Input: 候选子问题清单、题面中的依赖提示语。
Output: artifacts/problem_dependency_graph.json 与拓扑顺序。
- 依赖判断优先看输出耦合,而不是题面书写顺序。
independent 表示完全独立,可直接并行。
weak 表示共享数据、变量定义或指标体系,但可先并行预研。
strong 表示必须等待上游子问题的模型结构、参数或结果。
- 识别强依赖的常见信号:"利用前一问建立的模型""在上一问结果基础上""根据前述预测结果""沿用问题一的指标体系"
- 识别弱依赖的常见信号:共用清洗数据、共用特征工程、共用变量定义、共用同一机制解释
- 为每条依赖边写明原因,不能只画图不解释。
- 如果依赖图出现环,说明拆分过细或判断错误,必须回滚到 Phase 2 调整。
- 对独立或弱依赖问题,明确标注"可并行准备"的程度。
- 生成拓扑顺序后,为后续时间分配和团队分工服务。
Phase 4: 标注类型、难度与建议时间分配
Input: 子问题清单、依赖图、竞赛总时间。
Output: artifacts/problem_schedule.csv 与推荐顺序。
- 每个子问题同时标注主类型与难点来源,不要只写"难"或"容易"。
- 难度分为
L1、L2、L3、L4。
- 评估难度时考虑:数据清洗复杂度、数学模型陌生度、参数估计难度、计算资源需求、论文叙述复杂度。
- 建议时间分配必须总和为
100%。
- 若用户未指定赛时,按
72 小时折算小时数。
- 时间分配不做平均主义,主基础模型与综合决策通常占比更高。
- 对强依赖链条,上游子问题必须留缓冲。
- 对可并行子问题,要标明可提前准备的数据处理或验证动作。
- 推荐顺序通常遵循:先基础模型、再高收益扩展、再鲁棒性和综合建议。
- 如果题目最后要求"综合方案"或"政策建议",把它视为独立收尾任务并单列。
Phase 5: 使用 Codex MCP 交叉验证拆解结果
Input: 题面原文、候选子问题、依赖图、时间分配表。
Output: 修订建议与最终拆解确认。
- 使用
gpt-5.4 与 xhigh 推理强度做独立复盘。
- 提示词必须包含题面原文,而不是只给摘要。
- 明确要求外部模型检查:是否漏掉隐含子问题、是否把支撑任务误拆成主子问题、是否存在不必要的串行安排。
- 保存
threadId,如果你根据建议修改了拆解,再用 mcp__codex__codex-reply 做二次确认。
- 若交叉验证与你的判断冲突,以题面原文为最终裁决依据,并把原因写进报告。
mcp__codex__codex:
model: gpt-5.4
config: {"model_reasoning_effort": "xhigh"}
prompt: |
你是数学建模竞赛指导老师,请独立审查下面的赛题拆解是否合理。
赛题原文:
[粘贴题面全文]
当前拆解:
[粘贴子问题表、依赖表、推荐顺序、时间分配]
请逐项回答:
1. 是否遗漏了任何应单列的子问题或综合任务?
2. 哪些子问题可以并行,哪些必须串行?
3. 每个子问题的主类型判断是否准确:优化 / 预测 / 评价 / 分类?
4. 当前建议时间分配是否失衡?如果失衡,请给出更合理的比例。
5. 给出一个更稳妥的求解顺序,并说明原因。
Phase 6: Output
将最终结果写入 PROBLEM_DECOMPOSITION.md,必要时保留机器可读中间文件。
- 报告开头写 4-6 句总体摘要,交代主子问题数量、可并行部分、关键阻塞链。
- 主表必须覆盖:子问题编号、原题面锚点、任务目标、类型、难度、依赖、建议时间占比、推荐顺序。
- 追加一张"依赖关系说明表",每条边写明强度和原因。
- 追加一张"并行推进建议表",便于团队分工。
- 追加 "Open Questions" 区块,暴露仍未完全确定的拆分点。
- 用简短段落说明这个拆解对
model-creator 的约束条件。
Output files:
| 路径 | 必需 | 内容 | 说明 |
|---|
PROBLEM_DECOMPOSITION.md | Yes | 主报告 | 提供给 model-creator 与 solve-plan |
artifacts/problem_scope.json | Recommended | 题面标准化结果 | 保留题面锚点和长度信息 |
artifacts/subproblem_candidates.json | Recommended | 候选子问题列表 | 支持复查与再拆解 |
artifacts/problem_dependency_graph.json | Recommended | 依赖图 | 支持拓扑排序和并行安排 |
artifacts/problem_schedule.csv | Recommended | 时间分配表 | 支持排班与任务跟踪 |
Key Rules
- 大文件处理: If the Write tool fails due to file size, immediately retry using Bash (
cat << 'EOF' > file) to write in chunks. Do NOT ask the user for permission — just do it silently.
- 始终以题面原文为最高依据;
PROBLEM_ANALYSIS.md 只作辅助,不作唯一真相来源。
- 主子问题一般控制在 3-5 个;超过 5 个时必须说明哪些只是支撑任务。
- 依赖判断必须写出证据句;不要凭直觉把所有问题串成一条链。
- 时间分配必须总和严格为
100%,并体现难度与阻塞风险。
- 如果存在明显可并行任务,必须显式标注。
- 类型标签必须落到
优化 / 预测 / 评价 / 分类 四类之一。
- Codex MCP 交叉验证用于复核,不用于替代人工阅读题面。
- 报告中必须保留
Open Questions,为下游建模暴露边界条件。
Composing with Other Skills
problem-analysis
-> problem-decomposer
-> model-creator
-> feasibility-check
-> solve-plan
problem-decomposer
-> data-preprocessing
-> paper-plan