[數學建模]數學建模算法和模型(B站視頻)(七)
排隊論
模型背景
排隊論發源於上世紀初。當時美國貝爾電話公司發明了自動電話,以適應日益繁忙的工商業電話通訊需要。這個新發明帶來了一個新問題,即通話線路與電話用戶呼叫的數量關係應如何妥善解決,這個問題久久未能解決。
1909年,丹麥的哥本哈根電話公司A.K.埃爾浪(Erlang)在熱力學統計平衡概念的啓發下解決了這個問題。
排隊現象
到達顧客 | 服務內容 | 服務機構 |
---|---|---|
病人 | 診斷/手術 | 醫生/手術檯 |
進港的貨船 | 裝貨/卸貨 | 碼頭泊位 |
到港的飛機 | 降落 | 機場跑道 |
電話撥號 | 通話 | 交換臺 |
故障機器 | 修理 | 修理技工 |
修理技工 | 領取修配 | 零件倉庫管理員 |
上游河水 | 入庫 | 水閘管理員 |
模型介紹
(1)由於顧客到達和服務時間的隨機性,
現實中的排隊現象幾乎不可避免;
(2)排隊過程,通常是一個隨機過程,
排隊論又稱“隨機服務系統理論”;
排隊服務過程
排隊系統的要素
(1)顧客輸入過程;
(2)排隊結構與排隊規則;
(3)服務機構與服務規則;
顧客輸入過程
顧客源(總體):有限/無限;
顧客到達方式:逐個/逐批;(僅研究逐個情形)
顧客到達間隔:隨機型/確定型;
顧客前後到達是否獨立:相互獨立/相互關聯;
輸入過程是否平穩:平穩/非平穩;(僅研究平穩性)
排隊結構與排隊規則
顧客排隊方式:等待制/即時制(損失制);
排隊系統容量:有限制/無限制;
排隊隊列數目: 單列/多列;
是否中途退出: 允許/禁止;
是否列間轉移: 允許/禁止;
(僅研究禁止退出和轉移的情形)
服務機構與服務規則
服務檯(員)數目;單個/多個;
服務檯(員)排列形式;並列/串列/混合;
服務檯(員)服務方式;逐個/逐批;(研究逐個情形)
服務時間分佈;隨機型/確定型;
服務時間分佈是否平穩:平穩/非平穩;(研究平穩情形)
服務檯(員)爲顧客服務的順序:
a)先到先服務(FCFS);
b)後到先服務(LCFS);
c)隨機服務;
d)優先服務;
到達間隔和服務時間典型分佈
(1)泊松分佈M ;
(2)負指數分佈M ;
(3)k階愛爾朗分佈Ek;
(4)確定型分佈D;
(5)一般服務時間分佈G;
排隊模型示例
——M/M/1,M/D/1,M/ Ek /1;
——M/M/c,M/M/c/∞/m,
——M/M/c/N/∞,。。。
(一)系統運行狀態參數
系統狀態N(t)
——指排隊系統在時刻t時的全部顧客數N(t),包括“排隊顧客數”和“正被服務顧客數”;
系統狀態概率:
(1)瞬態概率Pn(t)
——表示時刻t系統狀態N(t)=n 的概率;
(2) 穩態概率Pn
——Pn=Pn(t);
——一般排隊系統運行了一定長的時
間後,系統狀態的概率分佈不再隨時間
t變化,即初始時刻(t=0)系統狀態的
概率分佈(Pn(0),n>>0)的影響將消失。
(二)系統運行指標參數
——評價排隊系統的優劣。
1、隊長與排隊長
(1)隊長: 系統中的顧客數(n)期望值記爲Ls ;
(2)排隊長: 系統中排隊等待服務的顧客數;
期望值記爲Lq
2、逗留時間與等待時間
(1)逗留時間:
——指一個顧客在系統中的全部停留時間;
期望值,記爲Ws
(2)等待時間:
——指一個顧客在系統中的排隊等待時間;
期望值,記爲Wq
Ws = Wq + E[服務時間]
3、其他相關指標
(1)忙期: 指從顧客到達空閒服務機構起到服務
機構再次空閒的時間長度;
(2)忙期服務量:指一個忙期內系統平均完成
服務的顧客數;
(3)損失率: 指顧客到達排隊系統,未接受服務
而離去的概率;
(4)服務強度:ρ= λ/sμ;
顧客到達時間間隔分佈
——————————————泊松流與泊松分佈
滿足條件
如果顧客到達滿足如下條件,則稱爲泊松流:
(1) 在不相互重疊的時間區間內,到達顧客數
相互獨立(無後效性).
(2) 對於充分小的時間間隔內,到達
1個顧客的概率與t無關,僅與時間間隔
成正比(平穩性):
(3) 對於充分小的時間間隔,2個及以
上顧客到達的概率可忽略不計(普通性)。
分佈方式
1.泊松流到達間隔服從負指數分佈
若顧客到達間隔T的概率密度爲
則稱T服從負指數分佈,分佈函數如下:
若顧客流是泊松流時,顧客到達的時間間隔
服從上述負指數分佈
E[T]=1/λ; Var[T]=1/λ2; σ[T]=1/λ
2.顧客服務時間分佈服從負指數分佈
(1) 對一個顧客的服務時間Ts,等價於相鄰兩個顧客離開排隊系統的時間間隔。若Ts服從負指數分佈,其概率密度和分佈函數分別爲
則E[Ts]=1/μ; Var[Ts]=1/ μ2; σ[Ts]=1/ μ
(2) E[Ts]=1/μ:每個顧客的平均(期望)服務時間;
μ:單位時間服務的顧客數,平均(期望)服務率;
3.單服務檯負指數分佈M/M/1排隊系統
模型的條件是:
1、輸入過程――顧客源是無限的,顧客到達完全是隨機的,單個到來,到達過程服從泊松分佈且是平穩的
2、排隊規則――單隊,且隊長沒有限制,先到先服務;
3、服務機構――單服務檯,服務時間的長短是隨機的,服從相同的指數分佈。
對於M/M/1模型有如下公式:
例題:
某醫院急診室同時只能診治一個病人,診治時間服從指數分佈,每個病人平均需要15分鐘。病人按泊松分佈到達,平均每小時到達3人。試對此排隊隊系統進行分析。
解:
對此排隊隊系統分析如下:
(1)先確定參數值:這是單服務檯系統,有:
故服務強度爲:
故服務強度爲:
計算穩態概率:
這就是急診室空閒的概率,也是病人不必等待立即就能就診的概率。而病人需要等待的概率則爲:
ρ =1− P0 = 0.75
這也是急診室繁忙的概率。
(2)計算系統主要工作指標。
急診室內外的病人平均數:
急診室外排隊等待的病人平均數:
病人在急診室內外平均逗留時間:
病人平均等候時間:
4.M/M/S模型
此模型與M/M/1模型不同之處在於有S個服務檯,各服務檯的工作相互獨立,服務率相等,如果顧客到達時,S個服務檯都忙着,則排成一隊等待,先到先服務的單隊模型。
整個系統的平均服務率爲sμ,ρ=λ/sμ,(ρ<1)爲該系統的服務強度。
狀態概率
主要運行指標
系統狀態N ≥S的概率
例題:
承接例1,假設醫院增強急診室的服務能力,使其同時能診治兩個病人,且平均服務率相同,試分析該系統工作情況。
解:
這相當於增加了一個服務檯,故有:
S=2,λ=3人/h,μ=4人/h
病人必須等候的概率,即系統狀態N≥2的概率:
代碼:(只需輸入μ和λ和s)
s=2;
mu=4;
lambda=3;
ro=lambda/mu;
ros=ro/s;
sum1=0;
for i=0:(s-1)
sum1=sum1+ro.^i/factorial(i);
end
sum2=ro.^s/factorial(s)/(1-ros);
p0=1/(sum1+sum2);
p=ro.^s.*p0/factorial(s)/(1-ros);
Lq=p.*ros/(1-ros);
L=Lq+ro;
W=L/lambda;
Wq=Lq/lambda;
fprintf('排隊等待的平均人數爲%5.2f人\n',Lq)
fprintf('系統內的平均人數爲%5.2f人\n',L)
fprintf('平均逗留時間爲%5.2f分鐘\n',W*60)
fprintf('平均等待時間爲%5.2f分種\n',Wq*60)
修改程序例題:
某醫院掛號室有三個窗口,就診者的到達服從泊松分佈,平均到達率爲每分鐘0.9人,掛號員服務時間服從指數分佈,平均服務率每分鐘0.4人,現假設就診者到達後排成一隊,依次向空閒的窗口掛號,顯然系統的容量和顧客源是不限的,屬於M/M/S型的排隊服務模型。求:該系統的運行指標 :
解:
將前三行代碼修改爲:
s=3;
mu=24;
lambda=54;
輸出結果:
排隊等待的平均人數爲 1.70人
系統內的平均人數爲 3.95人
平均逗留時間爲 4.39分鐘
平均等待時間爲 1.89分種
可得:
(1)整個掛號間空閒的概率
附件:MM1代碼:
clear
clc
%*****************************************
%初始化顧客源
%*****************************************
%總仿真時間
Total_time = 10;
%隊列最大長度
N = 10000000000;
%到達率與服務率
lambda = 10;
mu = 6;
%平均到達時間與平均服務時間
arr_mean = 1/lambda;
ser_mean = 1/mu;
arr_num = round(Total_time*lambda*2);
events = [];
%按負指數分佈產生各顧客達到時間間隔
events(1,:) = exprnd(arr_mean,1,arr_num);
%各顧客的到達時刻等於時間間隔的累積和
events(1,:) = cumsum(events(1,:));
%按負指數分佈產生各顧客服務時間
events(2,:) = exprnd(ser_mean,1,arr_num);
%計算仿真顧客個數,即到達時刻在仿真時間內的顧客數
len_sim = sum(events(1,:)<= Total_time);
%*****************************************
%計算第 1個顧客的信息
%*****************************************
%第 1個顧客進入系統後直接接受服務,無需等待
events(3,1) = 0;
%其離開時刻等於其到達時刻與服務時間之和
events(4,1) = events(1,1)+events(2,1);
%其肯定被系統接納,此時系統內共有
%1個顧客,故標誌位置1
events(5,1) = 1;
%其進入系統後,系統內已有成員序號爲 1
member = [1];
for i = 2:arr_num
%如果第 i個顧客的到達時間超過了仿真時間,則跳出循環
if events(1,i)>Total_time
break;
else
number = sum(events(4,member) > events(1,i));
%如果系統已滿,則系統拒絕第 i個顧客,其標誌位置 0
if number >= N+1
events(5,i) = 0;
%如果系統爲空,則第 i個顧客直接接受服務
else
if number == 0
%其等待時間爲 0
2009.1516
%PROGRAMLANGUAGEPROGRAMLANGUAGE
events(3,i) = 0;
%其離開時刻等於到達時刻與服務時間之和
events(4,i) = events(1,i)+events(2,i);
%其標誌位置 1
events(5,i) = 1;
member = [member,i];
%如果系統有顧客正在接受服務,且系統等待隊列未滿,則 第 i個顧客進入系統
else len_mem = length(member);
%其等待時間等於隊列中前一個顧客的離開時刻減去其到 達時刻
events(3,i)=events(4,member(len_mem))-events(1,i);
%其離開時刻等於隊列中前一個顧客的離開時刻加上其服
%務時間
events(4,i)=events(4,member(len_mem))+events(2,i);
%標識位表示其進入系統後,系統內共有的顧客數
events(5,i) = number+1;
member = [member,i];
end
end
end
end
%仿真結束時,進入系統的總顧客數
len_mem = length(member);
%*****************************************
%輸出結果
%*****************************************
%繪製在仿真時間內,進入系統的所有顧客的到達時刻和離
%開時刻曲線圖(stairs:繪製二維階梯圖)
stairs([0 events(1,member)],0:len_mem);
hold on;
stairs([0 events(4,member)],0:len_mem,'.-r');
legend('到達時間 ','離開時間 ');
hold off;
grid on;
%繪製在仿真時間內,進入系統的所有顧客的停留時間和等
%待時間曲線圖(plot:繪製二維線性圖)
figure;
plot(1:len_mem,events(3,member),'r-*',1: len_mem,events(2,member)+events(3,member),'k-');
legend('等待時間 ','停留時間 ');
grid on;