每名員工輸入 3 個指定休息日。指定日屬於每月 8 天休息日之內,可連續三天。Previous Shift / Streak 用於處理跨月 transition 及最多連續工作 6 天。
目前 Rest Day 排序偏好:保留 3 個指定日 → 優先把獨立指定日配成 RR → 優先休假人數較少的日子 → 打斷長工作期 → 再創造額外 RR → 避免系統主動形成不必要的 RRR / RRRR。
查看 v0.1 實際使用的計分權重Rule → Number
Rest candidate score 越高越好
| 新增一個 Preferred RR target | +100 |
| 新增一個 2-day RR block | +60 |
| 當日目前 0 / 1 / 2 / 3 / 4 人 R | +40 / +35 / +25 / +10 / −30 |
| 最大 work streak 每減少 1 日 | +40 |
| 安排到目前最少 R 的月段 | +15 |
| 加劇月段集中 | −8 |
| 系統主動造成 RRR / 更長 block | −30 / −50… |
同一候選日可同時取得多項分數。例如把指定的 15 日變成 14–15 RR,可能同時得到 Preferred RR +100 及 RR block +60。
Rest repair quality 越高越好
| Preferred RR targets achieved | ×1000 |
| 2-day RR blocks | ×80 |
| 5 個候選日的 staffing capacity | 逐日相加 |
| System long-rest penalty | 直接扣除 |
| Early/Mid/Late rest count range | ×−15 |
只有 greedy 產生的 8 個 R 會令最長連續工作超過 6 日時才啟動。它固定 3 個 Preferred R,窮舉可行的 5 個 System R 組合,再選 quality 最高者。
Hard constraints 不是分數
| 同日已有 5 人 R | 候選直接排除 |
| Repair 後 max work streak > 6 | 組合直接排除 |
| B→A / C→A / C→B | 人選直接 filter |
| A / B / C 任一 < 2 人 | distribution 不成立 |
| 最後 validator 發現違規 | Schedule Invalid |
Hard rule 不應靠「扣很多分」處理;它是 PASS / FAIL。這是 scoring optimization 與 constraint satisfaction 最重要的分別。
Shift assignment cost 越低越好
| 同一更 / R 後開始 | 0 |
| A→B、B→C | +5 cost |
| A→C | +10 cost |
| 新 C block 為 2–3 晚 | −8 cost |
| C block 超過 3 晚 | 每多 1 晚 +24 |
| C 更人數差距 range | ×52 |
| A / B 更人數差距 range | ×14 |
| C totals 平方和 | ×2.0 |
| A / B totals 平方和 | ×0.65 |
每日 A/B/C 人數的「imbalance」不是混入 cost,而是先作較高層的 lexicographic gate:先找最平衡而又可行的人數分布,再在該層中比較 cost。