11排课系统(郑州市第十一中学高中排课)
本 skill 把排课规则固化为可重复执行的流水线,确保每次执行口径一致、格式统一、验收可查。
求解器主体为 solve11.py,故对外名「11排课系统」。
何时使用
- 用户要求排课 / 排课表 / 生成课表
- 用户给一份已有课表,要求调整 / 修局部冲突 / 核对规则(如某位老师代课导致撞课)
- 用户提到排课术语:主科连排、连排日对齐、教研禁格、首节主科、体育下午连排、机房限制
- 用户提供「课程分担.xlsx」或「课程表(正式).xlsx」
安装与分发(本 skill 可整体拷贝给他人使用)
- skill 是一个自包含目录:
SKILL.md+scripts/+references/,无外部依赖。 - 他人安装:把本目录(文件夹名
paike-11)整个拷贝到自己的
~/.workbuddy/skills/下(Windows 为C:\Users\<用户名>\.workbuddy\skills\),
重启 WorkBuddy 后即在技能列表中可见;也可通过技能设置页的导入入口导入 zip 包。 - 上架 SkillHub 后:他人可直接在 WorkBuddy 技能市场(专家·技能·连接器 → 技能 →
技能市场 → SkillHub)搜索「排课 / paike-11」一键安装,无需手动传文件。 - 分发打包:在 skill 目录的上级目录执行 skill-creator 自带的打包脚本
python package_skill.py <skill目录路径> <输出目录>,
产出paike-11.zip,zip 内顶层就是paike-11/,解压即用。 - 脚本默认在当前工作目录读写
input.json/raw_*.json;
换目录用环境变量PAIKE_DIR覆盖,无需改代码。
执行前必读(三份 reference)
按需加载,不要凭记忆执行:
| 文件 | 内容 | 何时读 |
|---|---|---|
references/rules.md |
唯一权威口径:统计口径、连排日公式 n=H-5、9 条硬约束、验收标准 |
任何排课任务,开工前必读 |
references/excel_format.md |
两种 Excel 格式判定、表头结构、输出路径、Python 环境说明 | 涉及读写 xlsx 时必读 |
references/lessons.md |
25 条踩坑教训(求解器/搜索/校验器/接手他人课表) | 改代码或调参数前必读 |
交付位置(重要)
- 交付到用户当次指定的位置(本地路径或云端资料库链接),不要擅自固定。
- 输入/输出路径全部由用户指定;脚本只在当前工作目录(或
PAIKE_DIR指定目录)
读写中间文件,换机器无需改代码。
工作流程
阶段 0:判定任务类型
是「从零排一份新课表」? → 走阶段 A
是「修/调已有课表局部冲突」? → 走阶段 B
阶段 A:从零排课
A0. 环境与前置检查
1. 确定工作目录(用户指定;脚本默认在当前目录读写中间文件)。
2. 导出正式 xlsx 前先备份/改名,不要直接覆盖既有交付件。
3. 确认新学期的「课程分担.xlsx」路径;新学期班数/教师/班型会变,
必须重跑 parse_staff.py,不要沿用旧 input.json。
A1. 生成输入
python scripts/parse_staff.py "<课程分担.xlsx>" [sheet名]
产出 input.json(classes / staff / tracks / track_of / recipes),写入当前目录。
A2. 核验可行性(必做,30 秒)
- 主科教师带班数 k 分布、连排日数是否 = H−5;
- 每班课时合计是否 = 35;
- 机房同时段容量是否够;
- k=3 教师是否有解(周一/周三上午仅 5 格,连排需 2k=6 格 ⇒ 不可解)。
A3. 求解
python scripts/solve11.py <seed> <秒数>
产出 raw_<seed>.json。多跑几个种子(如 21/22/23 并行),
按「硬错数 → 冲突数」择优。耗时经验:300~420 秒通常可收敛到硬错 0。
A4. 导出
<python-with-openpyxl> scripts/export.py raw_<seed>.json "<输出xlsx路径>"
A5. 独立校验(不可跳过)
<python-with-openpyxl> scripts/verify.py "<输出xlsx>"
必须 错误 0 项 才能交付。
A6. 汇报:硬错数、冲突数、连排跨中午 0 处、首节主科 N/110 + 第二节兜底 M。
阶段 B:修/调已有课表
B0. 判定格式(关键)
读总课表第 2 行第 2 列:
- 是班型文字(物化生/物化地/物化政/政史地)→ 格式 B,用 verify_lu.py
- 是数字 1~7 → 格式 A,用 verify.py
用错脚本会整表错位,报出一堆假错误。
B1. 扫描既存违规(必做,区分责任)
先跑对应校验脚本,记录原版已有的违规清单。
既存违规不主动修,先向用户说明,由他决定是否一并修。
B2. 向用户确认取舍
零余量课表下,「只动一两个老师且完全合规」数学上做不到
(详见 references/lessons.md 第 20 条)。必须让用户在下列方向中选择:
- A 彻底合规:改动 20+ 格、多位老师
- B 最小动作:仅消除指定冲突,接受部分既存不合规
- C 只修冲突:1~2 格,副作用最小
B3. 搜索最小改动
- 小改动优先用同班同天对调技巧(lessons.md 第 21 条),通常 1 次交换 2 格解决。
- 大改动用模拟退火:目标函数 =
指定违规*1000 + 结构破坏*500 + 新增教师冲突*2000 + 新增教研违规*1000 + 改动格数
两阶段:先找合规解,再最小化改动格数与涉及科目数。
- 约束必须包含教研禁格与跨班连排对齐,否则会引入新违规。
B4. 写回
另存新文件(原文件名 + 后缀),不覆盖原版,便于对比。
B5. 对比校验
原版与新版各跑一次校验,确认错误数未增加、且目标冲突已消除。
不可协商的验收标准
交付前必须全部满足:
1. hard_report() 硬错误 = 0
2. 教师冲突 CF = 0
3. verify.py 独立读回校验 错误 0 项
4. 连排跨中午 = 0 处
5. 汇报首节主科 N/110(理论上限 56/110,软约束)
关键常量(改动代码时以 references/rules.md 为准)
SUB = ['语','数','英','物','化','生','政','历','地','体','信','自']
MAIN3 = [语, 数, 英] # 主科
MINOR = [物, 化, 生, 政, 历, 地] # 副科(禁连排)
NODBL = set(MINOR) # ⚠️ 不得含「体」
DBL_START = (1, 2, 3, 4, 6) # 连排起始节,禁止 p=5(跨中午)
PE_DAYS = [周一, 周四, 周五]; PE_QUOTA = {周一:8, 周四:7, 周五:7}
MAX_IT = 2; IT_P = (3,4,5,6,7) # 机房同时段≤2班,信不在1-2节
RESEARCH = {周一: {数,物,化,生}, 周三: {语,英,政,历,地}} # 教研禁格
连排日 n = H - 5 # 与带班数无关
上午=1~5节, 下午=6~7节 # 禁 (5,6) 连排
脚本调用规范
所有脚本默认在当前工作目录读写 input.json / raw_*.json;
换目录用环境变量覆盖,勿改代码:
export PAIKE_DIR="<工作目录>"
# A1 生成输入(参数:课程分担.xlsx 路径、sheet 名,默认 Sheet1)
python scripts/parse_staff.py "<课程分担.xlsx>" Sheet1
# A3 求解(seed, 秒数)
python scripts/solve11.py <seed> <秒数>
# A4 导出(不传 raw 文件时自动取目录中最新的 raw_*.json)
<python-openpyxl> scripts/export.py raw_<seed>.json "<输出xlsx>"
# A5 校验(文件路径必传)
<python-openpyxl> scripts/verify.py "<输出xlsx>" # 格式A(无班型列)
<python-openpyxl> scripts/verify_lu.py "<输出xlsx>" # 格式B(有班型列)
Python 环境说明
solve11.py只依赖标准库,任意 Python 3.8+ 即可。parse_staff.py/export.py/verify.py/verify_lu.py需要 openpyxl:
pip install openpyxl后即可运行,无需专用虚拟环境。- 原作者机器上有两套解释器(裸解释器无 openpyxl、venv 有 openpyxl),
那是历史原因;他人安装时一套装了 openpyxl 的 Python 即可全程通用。
资源
scripts/
parse_staff.py— 「课程分担.xlsx」→「input.json」solve11.py— 排课求解器(构造 + 定向修复 + 模拟退火)export.py— 解文件 → 标准格式 xlsx(表头已固化)verify.py— 标准格式独立校验(读表回查全部规则)verify_lu.py— 带班型列格式的独立校验(通用版,含跨班连排对齐与教研禁格)
references/
rules.md— 规则口径(权威)excel_format.md— 表头格式与输出模板lessons.md— 踩坑教训(25 条)
> 全部脚本均已实测:solve11 可正常求解产出解,verify/verify_lu 可正确检出既存违规
> 且无误报。修改脚本后务必用真实课表文件回归验证。