教師(Teacher) 課程(Course) 教室(Room) 時間段(TimeSlot)
------- ------- ------ ------------
id (PK) id (PK) id (PK) id (PK)
name name name day_of_week
department credits capacity start_time
max_hours_per_week teacher_id (FK) building end_time
course_id (FK)
teacher_id (FK)
room_id (FK)
排課結果(Schedule)
-------------
id (PK)
course_id (FK)
teacher_id (FK)
room_id (FK)
time_slot_id (FK)
semester
week_type (單/雙周)
| 算法 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 隨機生成 + 修復 | 簡單習作、課程少 | 實現簡單 | 極易陷入局部最優,難滿足所有硬約束 |
| 回溯/深度優先搜索 (DFS) | 中小規模、約束明確 | 能找到可行解 | 搜索空間大,需剪枝優化 |
| 遺傳算法 (GA) | 大規模、多目標優化 | 全局搜索能力強 | 參數調優複雜,不保證最優 |
| 模擬退火 (SA) | 大規模、單目標 | 易跳出局部最優 | 降溫策略影響效果 |
| 約束滿足問題 (CSP) + AC-3 | 學術研究、強約束 | 理論基礎扎實 | 實現複雜 |
ScheduleService,核心方法 generateSchedule()。for (course : courses) {
List<TimeSlot> availableSlots = findAvailableSlots(course);
if (availableSlots.isEmpty()) throw new RuntimeException("無可用時段");
TimeSlot chosen = randomPick(availableSlots);
saveSchedule(course, chosen);
}
自動排課是典型的 NP-Hard 問題。入門用貪心+隨機+回溯,工程落地建議接入 OptaPlanner,專注於約束建模而非算法細節。