Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

第六章:排程與資源分配:把撞期工作排成可執行的一天

本章目標
情境與限制
可重現規則

從撞期任務到可執行安排

本章會把「今天事情很多,但時間不夠」這類問題轉成區間排程。第一步先用貪婪法找出一組互不衝突、數量最多且可重現的任務安排。

但真實工作裡,不是每件事的重要性都一樣。有些會議可以改期,有些拜訪卻直接影響成交或簽核。因此本章再往前走一步,加入加權排程,讓任務除了時間之外,還能帶有效益值,最後求出總效益最高的一組可行安排。

另外,我們也保留衝突檢查函式,讓你在排程之前就能知道哪些任務彼此重疊,方便做人工協調或規則調整。

什麼時候用哪一種排程

實務上,很多人會直接問:「到底要排最多件,還是排最重要的事情?」這其實就是在選模型。

情境較適合的方法理由
你想在一天內塞進最多個短任務貪婪區間排程目標是最大化可安排數量,規則簡單、速度快,也容易解釋
任務的重要性差很多,例如高價值客戶拜訪比內部例會更重要加權排程目標改成最大化總效益,而不是單純多排幾件
你需要先快速估一版可行清單,再和同事協調先做貪婪排程,再看衝突清單先用簡單規則拿到初稿,比較容易在會議中討論
你要向主管說明為什麼某些時段被保留給少數任務加權排程可以清楚說明取捨依據是效益總和,而不是個人偏好

可以把它想成兩層問題:

  1. 先問自己目標是不是「排最多件」。

  2. 如果不是,再明確定義每件事的價值,改用加權排程。

這個差別很重要,因為貪婪排程很適合當成第一版決策工具,但只要任務價值差異開始擴大,模型就應該跟著升級,否則你可能會得到一份很滿的行程表,卻不是最值得執行的一天。

實作範例

請參考 examples/ch06/scheduling.py。請在專案根目錄執行程式,以確保路徑正確。

from examples.ch06.scheduling import select_non_overlapping_tasks, select_highest_value_tasks

tasks = [
    {"name": "Team A Meeting", "start": 9, "end": 11, "value": 30},
    {"name": "Client Call", "start": 10, "end": 12, "value": 50},
    {"name": "Sync Up", "start": 11, "end": 13, "value": 20},
    {"name": "Project Review", "start": 13, "end": 15, "value": 40},
]

# 1. 貪婪法:排最多件
most_tasks = select_non_overlapping_tasks(tasks)
print("最多件安排:", [t["name"] for t in most_tasks])
# 最多件安排: ['Team A Meeting', 'Sync Up', 'Project Review']

# 2. 加權排程:總效益最高
best_value, best_tasks = select_highest_value_tasks(tasks)
print(f"最高效益 ({best_value}):", [t["name"] for t in best_tasks])
# 最高效益 (90): ['Client Call', 'Project Review']

示範流程包含: