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.

第十二章:配對與指派:把人與任務配成可執行的最佳安排

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

任務 Ready 之後,還差一個「誰來做」

流程排好了,真正開始做事之前,還有一個常被低估的問題:誰來做。就算某項任務已經 ready,如果現場沒有合適的人、或唯一合適的人已經被別的工作占住,這件事仍然做不下去。

這種問題可以轉成配對問題來看。左邊是一批已就緒任務,右邊是一組可用人員,只要某位人員符合某項任務的技能要求,就在兩者之間畫一條邊。接著我們想找的是最多能配成多少對,也就是最大配對。

為什麼 ready 任務不等於可執行任務

在專案管理工具裡,一張卡片出現在「待執行」欄位,不代表團隊已經真的能動手。常見阻塞包含:

  1. 任務需要特定技能,但團隊裡只有少數人符合資格。

  2. 同一位成員同時符合多項任務,卻只能先接其中一項。

  3. 某項任務看似簡單,實際上沒有任何合格人選。

所以在依賴排序之後,還需要再做一次「可接手性」檢查。

把人與任務轉成二分圖

這類問題最自然的模型是二分圖。圖的一側是任務,另一側是人。只有在人員技能覆蓋任務需求時,我們才連出一條邊。接著只要找出最大的互不衝突邊集合,就能知道目前最多可開工幾件事。

本章不追求最複雜的最佳化器,而是用容易理解、容易驗證的做法,讓讀者先掌握:

最大配對能回答什麼問題

最大配對不只是「配得起來」而已,它可以直接回答三個很實務的問題:

  1. 目前這批 ready 任務,最多能實際開工幾項?

  2. 哪些任務是因為技能缺口而被擱置?

  3. 哪些人目前仍閒置,可以拿來承接下一輪任務?

這對主管排班、專案協作與跨組支援都很有用,因為它把原本抽象的卡關點,轉成可觀察的缺口清單。

實作範例

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

from examples.ch12.assignment import summarize_assignments

ready_tasks = ["Task1", "Task2", "Task3"]
task_reqs = {
    "Task1": ["Python"],
    "Task2": ["Python", "SQL"],
    "Task3": ["Design"],
}
workers = {
    "Alice": ["Python", "SQL"],
    "Bob": ["Python"],
    "Charlie": ["Management"],
}

summary = summarize_assignments(ready_tasks, task_reqs, workers)
print("任務指派:")
for worker, task in summary["assignments"].items():
    print(f"- {worker} 負責 {task}")
# 任務指派:
# - Bob 負責 Task1
# - Alice 負責 Task2

print("未分配任務:", summary["unassigned_tasks"])
# 未分配任務: ['Task3']
print("閒置人員:", summary["idle_workers"])
# 閒置人員: ['Charlie']

示範流程包含: