流程與成本優化
進階
流程與成本優化

用 OR-Tools 排班:把規則寫清楚,讓電腦找解

用 Google OR-Tools 的 CP-SAT 求解器排出符合人數、請假與輪班休息的班表,AI 負責把規則轉成程式。
1 小時
6 步
免費(開源)
編
AI 有解編輯部
最後更新 2026 年 11 月 5 日・CC BY 4.0
用到的工具
OR-Tools
Python
Claude
ChatGPT
排班和排程是組合問題,聊天 AI 直接排出來的表常常違反規則,因為它是在猜,不是在計算。正確的做法是請 AI 把規則寫成程式,再讓求解器真正算出符合規則的答案。
你需要準備
•
Python,並安裝 OR-Tools:pip install ortools
•
所有規則,並分成「一定要」和「最好能」
•
上個月實際的班表,用來對照
進度 0/6
1

把規則寫出來

文字
硬性規則(一定要符合): - 每天早班 2 人、晚班 1 人 - 每人一天最多一班,一週最多 5 班 - 晚班隔天不能接早班 - 請假的人當天不排班 軟性規則(盡量): - 每個人的班數平均
排班要先符合勞動法規。例如依勞動基準法,輪班更換班次原則上要有連續 11 小時休息,每 7 日應有例假與休息日,加班時數也有上限。實際適用的方式要請人資或勞工主管機關確認,部分行業有例外規定。
2

寫成模型

以下程式實測可以執行:
Python
from ortools.sat.python import cp_model people = ["阿明", "小華", "美玲", "志強", "雅婷"] days = 7 shifts = ["早", "晚"] need = {"早": 2, "晚": 1} off = {("美玲", 2), ("志強", 5)} # 請假,天數從 0 開始算 m = cp_model.CpModel() x = {(p, d, s): m.new_bool_var(f"{p}_{d}_{s}") for p in people for d in range(days) for s in shifts} for d in range(days): for s in shifts: m.add(sum(x[p, d, s] for p in people) == need[s]) # 每班人數 for p in people: m.add(sum(x[p, d, s] for s in shifts) <= 1) # 一天最多一班 for p in people: for d in range(days - 1): m.add(x[p, d, "晚"] + x[p, d + 1, "早"] <= 1) # 晚班隔天不接早班 for p, d in off: for s in shifts: m.add(x[p, d, s] == 0) total = {p: sum(x[p, d, s] for d in range(days) for s in shifts) for p in people} most = m.new_int_var(0, days, "most") least = m.new_int_var(0, days, "least") for p in people: m.add(total[p] <= 5) # 一週最多 5 班 m.add(total[p] <= most) m.add(total[p] >= least) m.minimize(most - least) # 班數越平均越好 solver = cp_model.CpSolver() solver.parameters.max_time_in_seconds = 10 status = solver.solve(m) print(solver.status_name(status)) if status in (cp_model.OPTIMAL, cp_model.FEASIBLE): for d in range(days): row = {s: [p for p in people if solver.value(x[p, d, s])] for s in shifts} print(f"第{d + 1}天", row)
每條規則都變成一行限制,電腦不會忘記其中任何一條。
3

解讀結果

•
OPTIMAL:找到最佳解
•
FEASIBLE:找到可行解,但時間內無法證明最好
•
INFEASIBLE:規則互相衝突,不可能同時滿足
遇到 INFEASIBLE 時,不要讓 AI 隨便刪規則。一次拿掉一條,找出是哪一條造成衝突,再由主管決定怎麼處理,例如增加人力或調整需求。
4

請 AI 協助修改規則

文字
這是我的排班程式。請新增一條規則: 新進人員阿明不能單獨上晚班,必須有資深人員同班。 只修改必要的地方,並說明新增的限制在做什麼。
規則增加之後,多測幾種情況。AI 可能寫出語法正確、邏輯錯誤的限制,所以要用另外一段程式檢查結果,例如逐日計算每班的人數。
5

讓人做最後調整

班表牽涉每個人的生活,先公布草案,讓大家提出換班需求。合理的需求可以轉成規則,下個月就不用再手動處理。
注意
不要把員工的健康、家庭等敏感資訊放進外部 AI 服務。可以用代號處理,規則寫成「代號 A 不排晚班」就好。
6

延伸到生產排程

同一個工具也能做機台排程:把每個工單要用的機器、加工時間和先後順序寫成限制,再讓求解器縮短總完工時間。OR-Tools 文件裡有 Job Shop 範例,可以請 AI 依你的資料修改。
你照著做成功了嗎?
成為第一個回報的人。你的回報會決定攻略排序與作者分潤。
下一步
•
想規劃庫存,看〈庫存與叫料預測:先打敗最簡單的方法〉。
•
想模擬產線改善效果,看〈用 Python 模擬產線:改線前先在電腦裡試〉。
收錄在學習路線
廣告版位
想讓正在用 AI 的人看到你的產品?了解廣告合作
問與答
卡住的地方、補充的做法都可以留在這裡
還沒有人留言。
更多「流程與成本優化」攻略