排隊論入門學習 (for 數學建模)
文字部分引用了很多浙大數學建模排隊論ppt中的內容,本人做個總結和代碼實現
爲什麼研究排隊論?
研究排隊問題,就是要把排隊的時間控制到一定的程度內,在服務質量的提高和成本的降低之間取得平衡,找到最適當的解。
排隊系統的組成:
1.輸入過程: 輸入過程是說明顧客按照怎樣的規律到達系統,分爲三個方面:
顧客總數:有限與無限
顧客到達的方式:單個或者成批
- 顧客相繼到達的時間間隔:確定型或者隨機型
2.排隊規則與服務規則:
- 排隊規則:損失制、等待制、混合制
- 服務規則:先到先服務、後到先服務、隨機服務、有優先權的服務
3.服務機構:
- 服務檯數量及結構形式:數量上服務檯有單臺和多臺之分,結構形式上服務檯有單隊-單服務檯式、多隊-多服務並列式、單隊-多服務檯並列式、單隊-多服務檯串列式、多服務混合式
- 服務方式:單個服務和成批服務
- 服務時間:確定型和隨機型
排隊模型的分類
記X:顧客到達的時間間隔分佈;Y:服務時間的分佈;Z:服務檯數。
則排隊模型爲:X/Y/Z。
常用的記號:M—負指數分佈;D—確定型;Ek—k階Erlang分佈;GI—一般相互獨立的隨機分佈;G—一般隨機分佈。這裏主要討論M/M/1,/M/M/C。
泊松流與指數分佈
設x(t)爲時間[0,t]內流事件發生的次數。例如[0,t]時間內到來的顧客數,[0,t]時間內服務檯收到呼叫的此時。那麼我們一般假定x(t)滿足泊松過程,也稱爲poisson流或最簡單流,表示[0,t]時間內事件發生次數爲k次的概率服從泊松分佈:
\(P( x(t)=k ) = \frac{(\lambda k)^k}{k!}e^{-\lambda t} \)
其中參數\(\lambda\)表示單位時間內事件發生次數的平均數。
當流過程爲泊松過程時,設流發生的時刻依次爲t1,t2,…tn,發生時間的間隔記爲dn=tn - tn-1 (n=1,2,…),其中t0=0。
定理: 事件流x(t)爲泊松流的充要條件是x(t)流發生的時間間隔dn相互獨立,且服從相同的負指數分佈,即
(負)指數分佈滿足以下性質:
\(P(T<=t0+x | T>=t0)=P(T<=x) \)
如果把T解釋爲壽命,上式表名:如果已知年齡大於t0歲,則再活x年的概率與以前的t0無關。所以有時又風趣地稱指數分佈是“永遠年輕”。
請看下面例題(來自另一份ppt):
排隊系統的運行指標:
絕對通過能力A:單位時間內被服務被服務顧客的數學期望
相對通過能力Q:被服務顧客的顧客數與請求服務顧客的顧客數的比值
系統損失概率\(P_損\):服務系統滿員的概率
隊長\(L_系\):系統內顧客數量的數學期望值
排隊長\(L_隊\):系統內排隊顧客數的數學期望值
逗留時間\(W_系\):顧客在系統內逗留時間的數學期望值
排隊時間\(W_隊\):系統內顧客排隊等待服務時間的數學期望
損失制排隊模型
- 多通道損失制系統
- 單通道損失制系統
下面以多通道損失制系統爲例
設系統內有n個服務員,顧客來到服務系統時如果服務員正在忙,顧客不能立即得到服務,則顧客離去。
案例1:
某電話總機有3條中繼線,平均每分鐘有0.8次呼喚。如果每次通話時間平均爲1.5分鐘,試求:系統狀態的極限概率;絕對通過能力和相對通過能力;損失概率和佔用通道的平均數。
原理分析:
解釋一下,這裏\(\mu\)是1.5的倒數。
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 1007;
double jc(int k) { //階乘
double ans = 1;
for (int i = 2; i <= k; i++) {
ans *= i;
}
return ans;
}
int main() {
double n = 3, lamda = 0.8, u = 0.667;
double miu = lamda / u;
double p0 = 1, cur = 0;
for (int i = 0; i <= n; i++) {
cur += pow(miu, i) / jc(i);
}
p0 /= cur;
double p_sun = pow(miu, n) * p0 / jc(n);
double Q = 1 - p_sun;
double A = lamda * Q;
double K = miu * (1 - p_sun);
double zyl = K / n;
cout<<"-----輸入各項參數:-----\n";
cout<<"服務員個數:"<<n<<endl;
cout<<"顧客流強度:"<<lamda<<endl;
cout<<"服務檯能力:"<<u<<endl;
cout<<"-----系統效率指標:-----\n";
cout<<"損失概率= "<<p_sun<<endl;
cout<<"系統的相對通過能力= "<<Q<<endl;
cout<<"系統的絕對通過能力= "<<A<<endl;
cout<<"佔用服務員的平均數= "<<K<<endl;
cout<<"通道佔用率= "<<zyl<<endl;
return 0;
}
運行結果
-----輸入各項參數:-----
服務員個數:3
顧客流強度:0.8
服務檯能力:0.667
-----系統效率指標:-----
損失概率= 0.08969
系統的相對通過能力= 0.91031
系統的絕對通過能力= 0.728248
佔用服務員的平均數= 1.09183
通道佔用率= 0.363942
對於單通道損失制系統,只需將上面程序的n改成1即可。
等待制排隊模型
- 多通道等待制模型
- 單通道等待制模型
下面以多通道等待制模型爲例
設本系統顧客到達流爲泊松流,其強度爲\(\lambda\)。系統內有n個服務員,服務員具有相同服務時間且服從指數分佈,其強度爲\(\mu\)。當顧客到達時,如果服務員忙着,顧客排隊等待服務,一直等到有服務員爲他服務爲止。
對於多通道等待制系統有:
\(p_0=1-\lambda\) (此處ppt上沒說清楚,這個p0是猜測,待驗證)
對於單通道等待制系統有:
案例2:
某臨時假設的公路簡便橋,橋上不容許同時又兩輛汽車通過。若汽車到達流爲泊松流,其強度爲\(\lambda\)=2.1輛/分鐘。通過時間爲指數分佈,平均每輛的通過時間爲0.4分鐘,試求系統的效率指標。
#include <cmath>
#include <iostream>
using namespace std;
const int maxn = 1007;
double jc(int k) { //階乘
double ans = 1;
for (int i = 2; i <= k; i++) {
ans *= i;
}
return ans;
}
int main() {
double n = 1, lamda = 2.1, u = 2.5;
double miu = lamda / u;
double p0 = 1-miu;
double p_sun = 0;
double Q = 1 - p_sun;
double A = lamda * Q;
double L_dui = pow(miu, n + 1) *p0 / (n * jc(n)) ;
L_dui /= (1 - miu / n) * (1 - miu / n);
double W_dui = L_dui / lamda;
double K = miu * (1 - p_sun);
double L_xi = L_dui + miu;
double W_xi = L_xi/lamda;
cout << "-----輸入各項參數:-----\n";
cout << "服務員個數:" << n << endl;
cout << "顧客流強度:" << lamda << endl;
cout << "服務檯能力:" << u << endl;
cout << "-----系統效率指標:-----\n";
cout << "損失概率= " << p_sun << endl;
cout << "系統的相對通過能力= " << Q << endl;
cout << "系統的絕對通過能力= " << A << endl;
cout << "系統內排隊顧客的平均數= " << L_dui << endl;
cout << "顧客的平均排隊時間= " << W_dui << endl;
cout << "佔用服務員的平均數= " << K << endl;
cout << "系統內顧客的平均數= " << L_xi << endl;
cout << "顧客在系統中平均逗留時間= " << W_xi << endl;
return 0;
}
運行結果如下:
-----輸入各項參數:-----
服務員個數:1
顧客流強度:2.1
服務檯能力:2.5
-----系統效率指標:-----
損失概率= 0
系統的相對通過能力= 1
系統的絕對通過能力= 2.1
系統內排隊顧客的平均數= 4.41
顧客的平均排隊時間= 2.1
佔用服務員的平均數= 0.84
系統內顧客的平均數= 5.25
顧客在系統中平均逗留時間= 2.5