想象一下这个场景。代码终于跑完了队友问你“第二问最后用哪组结果我准备写进论文了。”你打开文件夹results_final/ results_final_v2/ results_这次真的是最终版/沉默了。AI 能写代码也能写论文但模型改了要重算重算之后要换图换完图还得检查摘要。忙到最后自己成了几个 AI 对话之间的“人肉传话筒”。所以我把一直在迭代的数模工作流整理成了一个开源项目CUMCM Autonomous Harness。它是面向全国大学生数学建模竞赛CUMCM本科组 A / B / C 题的工作流工具两个 Skill 指导建模和 Python 实现可选 Harness 管理运行与采用版本论文工具把结果接到 LaTeX 和 PDF。它建立在 Codex 等宿主上不是一个新的大模型。这篇文章不只介绍功能。我会带你跑一个公开小案例看清输入、执行命令、核对结果再把同一组数值放进论文。最后再讲怎么接入你自己的题目。GitHubCUMCM Autonomous Harness本文复现版本 v1.5.0· MIT 开源我的个人主页本文目录一、这个数学建模搭子适合接哪一段活二、先别急着相信介绍跑一个公开案例1. 输入是什么我们到底在算什么2. 获取固定版本准备 Python 环境3. 真正运行而不是只看示意图三、跑完以后怎样知道结果对不对四、把这组结果放进 LaTeX 论文实际长什么样编译你本次运行产生的文稿五、换成自己的题目怎样让 Codex 接着做六、已经有 Skill为什么还要 Harness七、另外几个常用入口不用每次重新想怎么问八、第一次用最容易卡住的几个地方最后欢迎带着一道题来也欢迎带着一个问题走一、这个数学建模搭子适合接哪一段活不必从头重来也不用走完全部流程。你手头有什么就从哪里接。你现在卡住的地方对应入口与交付题面读完了还是不知道从哪下手拆清各子问先跑通最简合理方案再比较值得改进的部分有模型但代码、参数和结果散在各处实现并实际运行 Python整理逐问结果和采用理由CSV 和图都有了不确定它们说明什么解释指标、样本差异、结论与适用范围结果已经确定准备写论文按采用结果组织 LaTeX 文稿、图表和 PDF论文看着完整又怕藏着大坑独立审查模型与论文给出具体证据、修复项和通过标准我想省掉的是反复搬运文件、对齐版本的时间。关键假设合不合理、结果该不该采用团队仍然要看懂、要判断。二、先别急着相信介绍跑一个公开案例先说明边界下面是仓库自带的合成资源配置演示不是历史赛题也不是获奖论文复现。这一段运行的是预写好的确定性 Python 程序不调用 Codex也不启动 Harness 的流程调度。它验证的是“计算 → 图表 → LaTeX → PDF”这条工具链在你自己的题目上让 AI 建模见第五节。1. 输入是什么我们到底在算什么假设有三个虚构服务站点总预算为16要决定每站配几台设备。站点单台费用单台供给需求上限最多设备数N35123E23104W47153费用和供给都是案例设定的假想单位。设备数必须是非负整数总费用不能超过预算供给超过站点需求的部分不再计入。程序还设置了三个情景括号依次对应 N、E、W 的产能乘数正常情景(1.00, 1.00, 1.00)。干旱情景(0.65, 0.85, 0.50)。N 站受损(0.25, 1.00, 1.00)。这些参数都在examples/synthetic/run.py的STATIONS、BUDGET和SCENARIOS中不需要另找附件。我们比较三种方案按正常情景收益费用比逐台添加设备的贪心基线让正常供给最大的名义精确解让三个情景中最低供给尽量高的情景稳健精确解。后两种用有限枚举求解输入和约束完全相同。2. 获取固定版本准备 Python 环境需要 Git 和 Python 3.10。下文假定python指向这个版本如果你的电脑用python3创建虚拟环境时换成python3即可。在一个还没有同名项目文件夹的位置执行gitclone--branchv1.5.0--depth1https://github.com/heisenberg0020/cumcm-autonomous-harness.gitcdcumcm-autonomous-harness python-mvenv .venvmacOS / Linux 激活环境source.venv/bin/activateWindows PowerShell 使用.venv\Scripts\Activate.ps1。如果系统策略不允许激活不必为此放宽安全设置可以直接使用.venv\Scripts\python.exe安装包和运行案例。随后在虚拟环境中安装python-mpipinstall-e.[paper,plot]这一步安装的是本地工具、绘图和 PDF 处理依赖不会替你安装 TeX也不需要填写模型 API Key。3. 真正运行而不是只看示意图在仓库根目录执行python examples/synthetic/run.py--outputexample-output输出目录里先看这些文件example-output/ ├── results.json # 本次输入、方案、结果与差值 └── paper/ ├── main.tex # 用本次结果生成的演示文稿 ├── results.json # 与文稿一起保存的结果副本 ├── scenario-comparison.pdf # 论文使用的矢量图 ├── scenario-comparison.svg # 矢量图的 SVG 版本 ├── scenario-comparison.png # 便于预览的图片 └── cumcm-project.json # 指定结果与图文件的校验记录图文件需要绘图依赖可用。终端中的figures_generated: true表示本次确实生成了图如果是false不能把“程序运行结束”当成“带图流程全部完成”。再次运行若提示输出已存在换一个目录例如--output example-output-2。默认拒绝覆盖是为了保护已有结果不要一看到提示就删文件。三、跑完以后怎样知道结果对不对在原始输入不变时你应该看到下面三组结果。配置顺序是(N, E, W)每一行是一种完整方案不是一次独立实验。方案设备配置总费用正常供给三个情景中的最低供给名义贪心基线(2, 1, 2)1627.0016.05名义精确解(2, 1, 2)1627.0016.05情景稳健精确解(2, 3, 1)1626.0017.65第一眼值得注意的反而是贪心基线没有输。在这个小例子里它恰好找到了与名义精确解相同的配置。不能因为“精确解”听起来高级就假装它带来了提升也不能据此说贪心法对其他问题都最优。再看稳健方案最低供给从16.05 提高到 17.65增加1.60但正常供给从27.00 降到 26.00减少1.00。这不是“稳健方案全面碾压”而是一笔明确的交换如果你重视这些设定情景中的保底供给就接受正常供给的一点损失如果只重视正常状态名义解更合适。还可以手算核对一次。稳健配置(2, 3, 1)的费用是2×3 3×2 1×4 16干旱情景下它的供给为min(12, 2×5×0.65) min(10, 3×3×0.85) min(15, 1×7×0.50) 6.50 7.65 3.50 17.65另外两个情景下是 26.00 和 18.50所以三者的最小值确实是 17.65。这组输入共有80 个上下界内的整数配置其中 49 个满足预算。终端的feasible_count应为49。程序在这些可行配置中比较目标值能支持这个小型有限模型内的最优性判断不能证明站点设定符合现实。三个情景也不是三个独立样本17.65 不是置信下界更不是“准确率”。你可以在results.json的methods中逐项核对配置、费用和情景供给差值在comparison中。JSON 里的差值可能显示为1.5999999999999979这是浮点表示按两位小数读作 1.60。不要只盯着一个“运行成功”。四、把这组结果放进 LaTeX 论文实际长什么样仓库公开了实际编译过的合成案例 PDF 第 2 页。表格、柱图和文字解释对应上一节的数值不是 AI 生成的效果图查看论文页面结果表情景对比图采用边界图中横轴是正常、干旱、N 站受损三个情景纵轴是合成供给单位。蓝灰色与青色分别是贪心和名义精确解橙色是稳健解。橙色只在干旱情景更高另外两组反而更低——这正是需要在论文里交代的取舍。编译你本次运行产生的文稿还需要系统安装XeLaTeX 和相应中文宏包。可从 TeX Live 官方安装说明 开始本例使用ctexart和 Fandol 中文字体。安装后确保当前终端能找到xelatex。先运行环境检查再编译和逐页渲染cumcm-tools doctor cumcm-tools paper build example-output/paper/main.tex--outputexample-output/build cumcm-tools paper inspect example-output/build/main.pdf--jsoncumcm-tools paper render example-output/build/main.pdf--outputexample-output/pages成功后应有example-output/build/main.pdfexample-output/pages/中有page-001.png、page-002.png。inspect检查页数、字体等信息逐页查看仍然不能省。没有 TeX 时前面的结果、图和.tex仍然可以生成但 PDF 这一步不能算完成。本次更新前我们在隔离目录复跑了 v1.5.0数值与上表一致仓库的 5 项示例测试通过实际编译并渲染得到 2 页 PDF逐页查看未发现缺字、裁切或重叠。复跑使用已有依赖环境不保证不同环境生成字节完全相同的文件。打开 PDF至少核对三件事结果表仍是(2,1,2)与(2,3,1)关键数值与本次 JSON 一致。中文和公式正常显示图的坐标、图例清楚没有明显裁切和重叠。正文没有把“最低供给提高 1.60”写成“所有情景都提高”也没有把合成案例写成真实比赛成绩。这里的结果文件与论文用图有 SHA-256 校验记录锁定资源发生变化时编译流程可以发现不一致。它不能代替阅读更不能保证正文中每一句解释都正确。改了输入应重新生成一组输出并检查不是单独换张图就算更新完论文。这个短示例的文稿由预写结构填入本次结果用来演示工具链它不是任意赛题论文的自动生成效果也不是固定章节模板。真正的竞赛论文仍要按题目逐问组织。 固定版本案例源码与完整说明五、换成自己的题目怎样让 Codex 接着做确认示例能跑再接入你自己的历史题。两个入口分别是cumcm-modeling-designer理解题意与附件建立模型先贯通全题再比较重要改进。cumcm-modeling2code实现并运行代码整理结果、验证和采用理由按需转入论文出口。在仓库根目录安装 Skillspython scripts/install.py --dry-run python scripts/install.py第一条预览安装计划第二条才实际安装。如果已有同名 Skill脚本会停止不会悄悄覆盖。先按安装说明确认已有版本再决定如何处理。重新加载 Codex 的 Skills在你的项目里发送使用 $cumcm-modeling-designer 和 $cumcm-modeling2code 读取 [项目路径] 里的题目、附件和已有成果。 先告诉我每个子问要回答什么、第一版准备怎么算 然后完成最简完整模型、Python 实现、实际运行和必要比较。 保留原始输入把逐问答案、图表和采用理由整理清楚。 本轮先做建模与代码暂不写正式论文。这一阶段重点看每问是否真的有答案、模型有没有违反题面条件、比较是否使用相同输入。先有一版完整可用的结果再改最值得改的地方。已有结果只想写论文直接用论文生成 Prompt填写项目路径、采用版本、写作预算和模板要求不用重做建模。论文出口围绕真实结果组织结构数值图优先用程序生成的矢量图LaTeX 编译后还要检查页面。需要队友用 Word 批注时可生成 DOCX 审阅副本。不靠规定图数、公式数和字数凑质量也不把尚未完成的实验写成已经验证。六、已经有 Skill为什么还要 Harness回到开头那三个“最终版”。你已经采用方案 A又跑了方案 BB 失败了。你需要保留 A也需要知道 B 的输入、错误和输出是什么不能只剩聊天里的一句“再试一次”。Skill 指导怎么研究Harness 管理运行记录、结果来源和交接状态。它把“最近运行”“有效结果”“当前采用”分开记录登记过的上游输入变化后可以标记受影响的旧结果。这层是可选的不要求第一次上手就配置全部流程。想单独看看它如何运转可以在前面安装好的虚拟环境中运行python scripts/harness_smoke.py这是另一个小型演示会创建临时项目实际求解、独立核验、生成报告并记录采用最后给出成果位置同样不调用大模型。它不是上一节的 PDF 案例两者不要混为一次运行。接入自己的程序时再看Harness 上手说明。其中run默认是预览真正执行需要显式加--execute。文件依赖需要登记Harness 不会自动理解所有代码和手写数字本地执行也不是安全沙箱。运行外来项目之前仍然要看清入口与权限。七、另外几个常用入口不用每次重新想怎么问仓库整理了八份完整 Prompt可以按当前阶段选择你想做什么对应 PromptA、B、C 都有方案最后写哪题横向选题比较别只夸我找找方案的漏洞独立红队审查看懂算法怎样一步步进入代码方案工程讲解从题面推进到实际结果自主建模结果确定开始写论文论文生成读懂结果表并判断是否理想结果解读与质量评价把模型和论文一起做最后检查独立终审继续改当前模型还是换条路线L3 → L4 路线评估 打开八个 Prompt 的完整导航L3、L4 是项目内部诊断术语不是官方奖项等级也不代表获奖概率。八、第一次用最容易卡住的几个地方遇到的情况先检查什么python找不到或版本过旧确认 Python 3.10macOS 上可能需要用python3创建虚拟环境图没有生成figures_generated是false确认当前环境安装了.[paper,plot]尤其是 Matplotlibcumcm-tools找不到确认已激活刚才安装包的虚拟环境未激活时使用该环境内的命令完整路径.tex有了却没有 PDF运行cumcm-tools doctor检查 XeLaTeX 和中文宏包安装 Python 包不等于安装 TeX提示生成文件已存在换一个新的--output目录确认需要更新时再了解--overwrite数值与上表不同先核对是否为 v1.5.0、输入是否修改、是否读取了另一轮输出本文命令与案例按v1.5.0核对。以后主分支更新可以先按固定版本复现再看新版本说明不要把不同版本的命令和输出混着用。最后欢迎带着一道题来也欢迎带着一个问题走我希望这套工具省下的是你在聊天记录、代码目录和论文之间来回搬运的时间。省下来的脑力可以花在更值得的地方假设是否合理差异有没有实际意义哪一问最值得继续改。仓库有公开验证记录但工具链测试不等于真实赛题能力评测更不是“安装即获奖”。真实 Codex 调用使用相应账号配额用于竞赛时请核对本届官方规则、格式、匿名及 AI 使用要求。感兴趣就先跑上面的案例。有用可以点个Star遇到问题欢迎把版本、运行命令、报错和必要环境信息带到Issues记得去掉密钥和私人数据。一个能复现的小问题比一句“运行不了”更容易推动项目改进。项目主页·下载 v1.5.0·反馈问题·我的个人主页感谢 math-modeling-skill 的启发以及 MathModelAgent 的展示参考。本文由 AI 辅助整理与撰写。功能说明依据公开版本演示数值来自合成案例的实际计算不包含获奖承诺或虚构的赛题实测成绩。