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,每個結束時間視為 -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))

示範流程包含: