本章目標理解為什麼任務已經 ready,不代表現場就一定有人可接
用 Python 把人員技能與任務需求轉成可重現的配對問題
學會用最大配對找出最多可落地的任務指派,並盤點技能缺口
情境與限制情境:上一章已經排出哪些任務現在可以做,但你還要決定這些工作該交給誰
輸入:一批已就緒任務、每項任務所需技能,以及每位成員目前具備的技能
輸出:一份任務對人員的指派結果,以及尚未被接走的任務清單
限制:同一位成員一次只能接一項互斥任務,有些任務可能完全找不到合格人選
可重現規則本章程式碼位置:
examples/ch12/本章核心模組:
examples/ch12/assignment.py測試:
pytest -q tests/test_ch12_matching_and_assignment.py典型用途:客服案件分流、面試官指派、審稿安排、跨部門 ready 任務認領
任務 Ready 之後,還差一個「誰來做」¶
流程排好了,真正開始做事之前,還有一個常被低估的問題:誰來做。就算某項任務已經 ready,如果現場沒有合適的人、或唯一合適的人已經被別的工作占住,這件事仍然做不下去。
這種問題可以轉成配對問題來看。左邊是一批已就緒任務,右邊是一組可用人員,只要某位人員符合某項任務的技能要求,就在兩者之間畫一條邊。接著我們想找的是最多能配成多少對,也就是最大配對。
為什麼 ready 任務不等於可執行任務¶
在專案管理工具裡,一張卡片出現在「待執行」欄位,不代表團隊已經真的能動手。常見阻塞包含:
任務需要特定技能,但團隊裡只有少數人符合資格。
同一位成員同時符合多項任務,卻只能先接其中一項。
某項任務看似簡單,實際上沒有任何合格人選。
所以在依賴排序之後,還需要再做一次「可接手性」檢查。
把人與任務轉成二分圖¶
這類問題最自然的模型是二分圖。圖的一側是任務,另一側是人。只有在人員技能覆蓋任務需求時,我們才連出一條邊。接著只要找出最大的互不衝突邊集合,就能知道目前最多可開工幾件事。
本章不追求最複雜的最佳化器,而是用容易理解、容易驗證的做法,讓讀者先掌握:
如何穩定找出一組可重現的指派結果
如何在多人都能接同一任務時維持決定性順序
如何列出未分配任務與閒置人力,協助後續補位
最大配對能回答什麼問題¶
最大配對不只是「配得起來」而已,它可以直接回答三個很實務的問題:
目前這批 ready 任務,最多能實際開工幾項?
哪些任務是因為技能缺口而被擱置?
哪些人目前仍閒置,可以拿來承接下一輪任務?
這對主管排班、專案協作與跨組支援都很有用,因為它把原本抽象的卡關點,轉成可觀察的缺口清單。
實作範例¶
請參考 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']示範流程包含:
根據技能需求建立人員與任務之間的可行邊
用最大配對找出最多可完成的 ready 任務
列出仍未分配出去的任務
彙整閒置人員,方便安排下一輪支援