# Capacity — 服務量能工作台

[開啟工作台](https://miiduoa.github.io/tools/capacity/) · [模型](core.mjs) · [測試](core.test.mjs)

如果每小時到達 24 位顧客，每件平均需要六分鐘，該安排幾個服務席？**「平均處理量大於到達量」還不夠**，還要看尖峰和等候超時的風險。

此工具以 M/M/c 排隊模型（Erlang C）估計：

- 目前使用率、需要等待的機率、平均排隊時間和超過自訂分鐘數的機率。
- 服務量增加時的曲線，以及達到 P(等候 > 目標分鐘) ≤ 10% 的最少席數。
- 尖峰倍率下的需求差異、附近席數比較、JSON 報告下載。

## 本機使用

~~~sh
python3 -m http.server 8080
# http://localhost:8080/tools/capacity/
node --test tools/capacity/core.test.mjs
~~~

純瀏覽器 ES modules、原生 SVG 和 Node.js 內建測試，無 API 金鑰、資料上傳或套件安裝。

## 模型與數值方法

λ 是到達量（件／小時）；μ = 60 / 平均服務分鐘 是每席的服務率；c 是席數。使用率 ρ = λ/(cμ)。當 ρ ≥ 1，系統不存在有限穩態平均等待，結果明確標示超載。

其餘時候先以 Erlang B 遞迴，避開 a^c / c! 容易發生的溢位（其中 a = λ/μ）：

~~~text
B(0) = 1
B(n) = a · B(n−1) / (n + a · B(n−1))
C = B(c) / (1 − ρ + ρ · B(c))
平均等待（分鐘） = 60 · C / (cμ − λ)
P(等待 > t 分鐘) = C · exp(−(cμ−λ) · t / 60)
~~~

C 是 Erlang C 等待機率。每次尋找最少滿足超標機率 ≤ 10% 的席數，最多掃描到 120 席；超過則標示為超出搜尋範圍。

測試涵蓋已知解析值、零到達率、剛好滿載、負載上升、最少席數條件以及輸入邊界。畫面展示穩態解析結果，不是模擬跑出來的觀測資料。

## 適用範圍

這是 Poisson 隨機到達、處理時間服從指數分布、服務席獨立同速、FIFO、等候室無限且無顧客離隊的**穩態**模型。不能直接套用在具預約、服務分級、輪班、尖峰時變動到達率、回撥、放棄排隊或服務時間接近固定的場所。席次最佳化只考慮等待 SLA，**不包含人力成本**。

真實部署前應先用歷史到達與處理時間驗證假設，並在不同時段重新估計參數。
