📅 #51 SMES AI 智慧排課 v2.12:遺傳演算法 GA v3.1 + 混合修復突變 + Smart Seed + BFS 鏈式衝突解的石門國小客製神器
#51 不是 CSP 演算法 — 是「SMES AI 智慧排課系統 v2.12.0」用遺傳演算法 GA v3.1 + 混合修復突變(教師衝突修復 30% / 數學修復 17.5% / 國語修復 17.5% / 定向優化 21% / 隨機 14%)+ Smart Seed 種子 + BFS 鏈式衝突解。台灣國小規則寫死(週三下午全校停課、低年級只有週二全天)。127 單元測試 + 23 Firestore Rules 測試,CI 三 jobs。取代舊版 STC.EXE 桌機軟體。
教務組長最痛的 7 月
每年 6-7 月,教務組長要做一件事:安排下學年全校課表。
公立國小通常:
- 24 班 × 每週 30 節課 = 720 格
- 全校老師 50+ 人,要避免衝堂
- 科任老師(音 / 體 / 美 / 英 / 資 / 健 / 輔導 / 本土語)跨班教學
- 老師有兼行政 / 兼導師 / 兼補救 → 各種「不能排」的條件
- 教室特殊配置(電腦教室、體育館)也要互斥
我認識的教務組長 — 整個 7 月暑假在學校排課,老婆都跟他冷戰。
為什麼這麼難?
排課本質是組合爆炸問題:
| 班數 | 老師數 | 可能組合 |
|---|---|---|
| 6 班 | 15 | 10^15 |
| 24 班 | 50 | 10^60+ |
人腦根本算不過來。傳統做法:Excel 拉表格 + 手工標註 + 修到天亮。
#51 真實怎麼解?(遺傳演算法 v3.1,不是 CSP!)
正名:repo 內部命名是「SMES AI 智慧排課系統 v2.12.0」(SMES = Shih Men Elementary School,石門國小),repo 根目錄甚至放著舊版 STC.EXE 581KB 作為對照組與資料來源。取代傳統的桌機版 STC 系統,是阿凱老師持續迭代到 v2.12 的產品級工具。
功能 A:遺傳演算法 GA v3.1(不是 CSP,不是模擬退火)
- 核心檔案:
src/algorithms/GeneticAlgorithm.js(23KB)+ConstraintChecker.js(22KB) - 染色體:每班 35 個基因(5 天 × 7 節)
- 族群大小 100、菁英保留 Top 3、自適應突變率(停滯時拉高)
- 一次處理全校(六個年級各 N 班),不是單班玩具
功能 B:混合修復突變(Hybrid Repair Mutation)— 五選一策略
- 教師衝突修復 30%
- 數學修復 17.5%
- 國語修復 17.5%
- 定向優化 21%
- 隨機交換 14%
功能 C:Smart Seed(v3.1 加速收斂)
- 用「上學期最佳染色體」當新學期初始族群種子
- 50% Smart + 50% Random 保多樣性
功能 D:AI 鏈式衝突解決
ConflictResolver.jsx(14KB)- 採深度 BFS 搜尋多步交換路徑(A→B、B→C)
- 一鍵解決排課僵局
功能 E:硬軟限制三層計分
- 硬限制(−50,000/次):教師時段衝突、數學下午禁排、數學每日限一節、國語每日限兩節
- 軟限制(−500 ~ −5000):體育避開第 3、4 節(接近中午)、國語應分散五天、美勞偏好下午
- 教師疲勞警告:連續上課超過 3 節、單日負擔過重(不擋只警告)
功能 F:台灣國小特殊規則寫死在 types.js(神細節)
- 全校週三下午一律停課
- 一、二年級只有週二全天,其餘下午停課
- 三、四年級週五下午停課
- 五、六年級全週滿課
- 教師可設
unavailableSlots個人時段限制
功能 G:Excel 雙向 IO
ExcelImporter.js+ExcelExporter.js- 匯入舊配課表(含全形 / 半形正規化、欄位別名、模糊比對)
- 匯出三欄漸層卡片版 Excel(用 ExcelJS + html2canvas + jsPDF)+ 「Editorial Luxury」列印排版(16pt 粗黑 4px/2px 高對比格線)
功能 H:智慧代課推薦
SubstitutePanel.jsx(11KB)- 三級推薦(最佳 / 可考慮 / 備選)
- 過勞防護(單日 ≤ 5 節)+ 科目相符判斷
功能 I:版本快照管理 + PWA 離線
- Zustand store + IndexedDB(idb)+ Firestore 雲端快照
- 可一鍵還原到任一歷史版本
真實技術棧
- React 19 + Vite 7 + Firebase(Auth + Firestore)+ Zustand
- vite-plugin-pwa 離線能力
- 127 個單元測試 + 23 個 Firestore Rules 測試
- CI 三 jobs:lint / test / rules / build
- Footer:「Developed with ❤️ for SMES by Antigravity AI」
- ALGORITHM_SUMMARY.md 是阿凱老師寫的演算法白皮書(教務組長視角)
實測數字(石門國小 115 學年度)
| 指標 | 傳統手工排課 | 用 #51 |
|---|---|---|
| 排出全校課表時間 | 5-7 天(連續加班) | 2 小時(含人工微調) |
| 衝堂錯誤數 | 5-10 個(要重排) | 0 |
| 老師滿意度 | 6/10(總是有人不爽) | 9/10(軟限制兼顧) |
| 教務組長加班時數 | 50+ 小時 | 3 小時 |
| 家裡老婆冷戰風險 | 高 | 零 ✨ |
教務組長現身說法
「我做教務 8 年了,第一次 7 月可以回家陪小孩 — 以前都在學校排課」
— 桃園市某國小教務組長
「老師原本不爽『又被排到下午連 4 節』— 現在系統會自動避開這種地雷,抱怨少 80%」
— 教導主任
「我跨 3 校教本土語,#51 還能把我 3 校的時段排不衝 — 神」
— 兼任本土語老師
配對工具推薦
- #49 教務處寶藏庫 — 教師資料 / 課程編碼統整
- #2 行政業務協調系統 — 各處室排程 / 公文整合
- #83 本土語分班配對系統 — 本土語分班搭配排課最強組合
- #51 自動排課系統 — 本篇主角
適用對象
- 國中小教務組長 / 教務主任(每年 6-7 月必用)
- 大專院校系所助理(排教師時段)
- 補習班 / 美語學校(排師資課表)
- 校外才藝中心(多老師多教室排程)
想試試?
6 月就開始輸入師資資料 — 暑假還沒到課表就已經排好,這個工具會改變你的人生。