本章目標理解為什麼重疊或相接時段需要先合併,才能做正確的容量估算
用 Python 建立可重現的區間整併與尖峰占用分析流程
把會議室、設備借用與班表占用轉成可驗證的資源規劃問題
情境與限制情境:你要看某個資源在一天內被占用多久、哪些時段黏在一起,以及同一時間最多有多少人或設備同時被使用
輸入:每個時段的名稱、開始時間與結束時間
輸出:合併後的區段清單,以及尖峰同時使用量和對應區間
限制:時段可能未排序,可能互相重疊,也可能首尾相接
可重現規則本章程式碼位置:
examples/ch10/本章核心模組:
examples/ch10/capacity.py測試:
pytest -q tests/test_ch10_interval_merging_and_capacity.py典型用途:會議室排程、設備借用、人力班表、服務窗口容量評估
零碎時段為何要先合併再分析¶
當你面對的是一堆零碎時段,第一個常見錯誤就是直接把它們分開看。這會讓你誤以為占用很多段、很複雜,但實際上其中有些時段只是彼此重疊或緊接在一起,應該視為同一段連續占用。
因此本章先處理「區間合併」。只要時段互相重疊,或結束時間剛好接上下一段開始時間,就把它們整併成一段連續區間。這樣你才有機會正確估算某個資源真正被占用多久。
合併之後,才談容量尖峰¶
第二個問題則是容量。管理上很常被問的不是「今天總共用了幾小時」,而是「同一時間最多有多少個需求一起發生」。這和第九章的峰值監控相近,但這次單位不是數值序列,而是區間事件。
做法通常是把每個開始時間視為 +1,每個結束時間視為 -1,再沿著時間掃過去。這樣就能知道哪一段區間同時存在最多占用。
為什麼首尾相接也值得合併¶
在很多行政與營運情境裡,兩段時段如果剛好接在一起,通常代表資源幾乎沒有空檔。例如會議室 10 點結束、下一場 10 點開始,對管理者來說,它實際上就是連續占用。
所以本章的合併規則會把「重疊」和「首尾相接」都視為可整併。這樣做的好處是,後續報表更貼近現場感受,也更容易拿來做容量與空檔規劃。
實作範例¶
請參考 examples/ch10/capacity.py。請在專案根目錄執行程式,以確保路徑正確。
from examples.ch10.capacity import merge_time_blocks, peak_concurrent_usage
blocks = [
{"name": "Team A", "start": 9, "end": 11},
{"name": "Team B", "start": 10, "end": 12},
{"name": "Team C", "start": 13, "end": 15},
]
merged = merge_time_blocks(blocks)
print("合併後區段:")
for m in merged:
print(f"- {m['name']}: {m['start']} ~ {m['end']}")
# 合併後區段:
# - Team A + Team B: 9 ~ 12
# - Team C: 13 ~ 15
peak_usage, peak_range = peak_concurrent_usage(blocks)
print(f"最大同時使用量: {peak_usage} (時段 {peak_range})")
# 最大同時使用量: 2 (時段 (10, 11))示範流程包含:
驗證時段資料是否合法
合併所有重疊或相接的占用區段
計算同時使用量最高的尖峰值
回傳尖峰發生在哪一段時間區間