| name | skill-autosolver |
| description | AutoSolver 总入口 skill,统筹 loop、strategies、evaluate 三个分 skill,用于理解项目结构、自主迭代候选求解器、选择策略方向并执行本地评估。 |
| user-invocable | true |
| allowed-tools | ["Read","Write","Bash","Glob","Grep","Agent"] |
AutoSolver 总入口
这个 skill 是 AutoSolver 项目的总调度入口。它不替代三个分 skill,而是说明什么时候、按什么顺序使用它们:
loop/SKILL.md:完整迭代闭环,负责“检查日志 → 选策略 → 实现候选 → 评估 → 记录 → 决策”。
strategies/SKILL.md:策略方向目录,负责根据已有基线和失败记录选择下一轮可检验假设。
evaluate/SKILL.md:本地评估流程,负责统一计算 data/*.txt 的平均 Penalty、逐 case Penalty 和合法性检查。
当用户要求“继续优化 AutoSolver”“自动迭代”“找更好 solver”时,优先使用 loop。当用户只问“下一步试什么策略”或“分析方向”时,使用 strategies。当用户只要求“评估某个候选文件”时,使用 evaluate。
项目结构
AutoSolver 项目根目录应同时包含:
candidate_solvers/
data/
docs/
examples/
logs/
skill-autosolver/
tools/
关键文件含义:
| 路径 | 用途 |
|---|
docs/AutoSolver.md | 题面、输出约束、目标函数逆向说明和历史策略记录 |
tools/recovered_objective.py | 本地 Penalty 计算、输入解析和分组工具 |
tools/evaluate_solver.py | 标准本地评估入口,输出均分、逐 case、合法性和耗时 |
tools/strategy.py | 已有贪心策略回放代码,可作为候选实现参考 |
logs/solver_log.md | 当前最优、逐 case 结果、失败方向和迭代历史 |
candidate_solvers/solver_<strategy_name>.py | 迭代阶段候选求解器 |
examples/example_solution.py | 简单贪心 solver 示例 |
data/*.txt | 本地评估数据集 |
data/provided/ | 原始输入文件副本,只作留档参考 |
最终提交用的 solver.py 放在项目根目录;在迭代阶段不要用它替代候选文件,除非用户明确要求评估或生成最终输出。
基本任务模型
求解器必须定义:
def solve(input_text: str) -> list:
...
输入是制表符分隔的候选派单表:
task_id_list courier_id total_score willingness
输出格式:
[
("T0001", ["C001", "C009"]),
("T0002,T0005", ["C003"]),
]
必须满足:
- 同一个
courier_id 在所有输出分组中最多出现一次。
- 同一个订单不能跨多个输出分组重复覆盖。
- 同一完整
task_id_list 允许多个备选骑手,但必须合并到同一个输出项的 courier_ids 列表中。
- 输出中的每个
(task_id_list, courier_id) 必须精确存在于输入候选池,不能混用单单和合单的 score 或 willingness。
目标是最小化总 Penalty。根据项目内逆向结果,Penalty 由未覆盖订单惩罚和每个输出分组的期望惩罚组成;详见 docs/AutoSolver.md 和 tools/recovered_objective.py。
使用顺序
1. 定位项目根目录
执行任何操作前先确认 PROJECT_ROOT。优先级:
- 用户明确给出的路径。
- 当前目录本身同时存在
data/、candidate_solvers/、tools/recovered_objective.py。
- 当前目录下的
AutoSolver/ 子目录。
- 常见 workspace 路径中的
AutoSolver 目录。
后续所有相对路径都以 PROJECT_ROOT 为基准。
2. 读当前状态
先读:
README.md
logs/solver_log.md
- 必要时读
docs/AutoSolver.md
当前真实官方最好记录是 candidate_solvers/solver_round37_adaptive_topn.py,官方均分 724.07,完成 10/10。当前根目录 solver.py 是 38 轮可测结构上的 low-timeout 修复版,备份为 candidate_solvers/solver_round38_lowtimeout.py;本地均分 687.94,目标是让官方 low_willingness 不再超时后回到约 723.x。如果日志被更新,以最新日志为准。
3. 选择分 skill
按任务选择一个或多个分 skill:
| 场景 | 使用 |
|---|
| 用户要求完整自动优化或继续迭代 | 先读 loop/SKILL.md,再按其中流程调用 strategies 和 evaluate |
| 用户要求选择下一轮策略方向 | 读 strategies/SKILL.md,结合 logs/solver_log.md 判断 |
| 用户指定候选 solver 要评估 | 读 evaluate/SKILL.md,使用统一合法性检查和 Penalty 口径 |
用户要求生成最终 solver.py | 先用 loop 确认终止条件,再整理当前最优候选为自包含文件 |
4. 实现候选策略
候选策略写入:
candidate_solvers/solver_<strategy_name>.py
候选文件必须提供 solve(input_text: str) -> list。迭代阶段可以参考或复用项目工具;最终 solver.py 必须自包含,只依赖 Python 标准库。
优先从 strategies/SKILL.md 的方向中选择:
- 多骑手扩展,例如
MULTI_ADAPTIVE_K、MULTI_TOP_K_SEARCH
- 期望值贪心,例如
EV_GREEDY、EV_MARGIN
- 合单补覆盖,例如
SINGLE_FIRST_BUNDLE_BACKFILL
- 两阶段或分场景策略
- 在连续失败后再尝试局部搜索、beam search、受限 ILP 或目录外新假设
5. 评估和记录
每个候选都必须使用 evaluate/SKILL.md 的统一流程评估:
- 使用同一批
data/*.txt
- 使用同一个
tools/recovered_objective.py
- 优先运行
python tools\evaluate_solver.py <candidate>
- 输出平均 Penalty
- 输出每个 case 的 Penalty、覆盖数和耗时
- 先做合法性检查,出现格式错误、重复骑手、重复覆盖或无效候选对时标记为
format_error
评估后把结果写入 logs/solver_log.md,记录策略文件、参数、平均 Penalty、与当前最优差值、逐 case 明细、状态和下一步判断。
如果评估使用的是额外合成的样例数据,还要把样例构造方式、结果摘要和策略启发同步记录到 strategies/SKILL.md 的对应策略段落中;真实 data/*.txt 的正式对比结果仍以 logs/solver_log.md 为准。
6. 迭代决策
- 如果平均 Penalty 低于当前最优,更新日志中的“当前最优”,并沿成功方向继续微调。
- 如果没有改善,记录失败原因,换方向或引入新变量,避免重复尝试已失败且无新变量的策略。
- 如果均值改善但
scarce_couriers、low_willingness 等关键 case 退化,要优先考虑分场景策略。
- 连续多轮无改善时,按
loop/SKILL.md 的阶梯切换到组合策略、高级策略或目录外新假设。
分 skill 目录
本总 skill 目录应保持如下结构:
skill-autosolver/
SKILL.md
loop/
SKILL.md
strategies/
SKILL.md
evaluate/
SKILL.md
三个分 skill 是具体操作手册。使用时先读本文件确定入口,再打开对应分 skill 的 SKILL.md 执行详细流程。
注意事项
- 不要修改
data/provided/,它是原始输入留档。
- 不要把迭代候选直接写成根目录
solver.py,除非已经进入最终整理阶段。
- 不要只看平均 Penalty,必须检查逐 case 退化和覆盖数。
- 不要用不合法输出取得的虚低 Penalty 更新最优。
- 39 轮之后出现过平台前端
Cannot read properties of undefined (reading 'slice'),后续提交优先沿 38 轮可测结构小步修改:保持顶层 def solve(input_text: str) -> list,避免大规模入口重构、强制映射表和平台不熟悉的提交形态。
- 不要在
skill-autosolver/ 目录下创建候选策略、日志或最终 solver。