離散事件系統仿真—理發店模型的MATLAB程式
1 離散事件系統介紹
離散事件系統是指系統的狀态僅在離散的時間點上發生變化的系統。而且這些離散的時間點一般是不确定的。這類系統中引起狀态變化的原因是事件。通常狀态變化與事件的發生是一一對應的。事件的發生沒有持續性。可以看作是在一個時間點上瞬間完成。事件發生的時間點是離散的。因而這類系統稱為離散事件系統。理發店、超市、銀行都是離散事件系統的例子。離散事件系統仿真的目的是産生接近實際的資料用于分析,為管理者決策提供幫助。例如對于理發店模型可以計算出顧客平均等待時間、平均服務時間等。
2 理發店模型介紹
理發店模型是單服務台單隊列服務系統的一個例子。假設一個小理發店隻有一個理發師。顧客到店後,如果有人正在理發就坐在一旁等候。理發師按照先來先服務的原則為顧客服務。而且隻要有顧客就不停歇。模組化目的是在假定顧客到達間隔和理發師花費時間服從一定機率分布時,考察理發師的忙閑情況。
說明:本文的程式為了友善,顧客到達間隔時間表和顧客服務時間表都是常數,不是随機生成的。
3主程式流程圖:
4 到達事件處理子程式的僞代碼解釋:
function BarbershopArrive()
全局變量聲明
到達顧客編号←下一顧客編号
if 理發師狀态 =‘忙’
排隊人數+1;
if 到達顧客編号<最大顧客編号
if 目前服務的結束時間<=下一個顧客的到達時間
下一事件←'服務結束';
下一顧客編号←服務顧客編号;
下一時間←目前服務的結束時間;
else
下一事件←'到達';
下一顧客編号←到達顧客編号+1;
下一時間←下一顧客到達時間;
end
Else % 當到達顧客編号=最大編号,不會再有顧客到達,下一事件隻能是'服務結束
下一事件←'服務結束';
下一顧客編号←服務顧客編号;
下一時間←目前服務的結束時間;
end
Else % 當理發師狀态 =‘閑’
下一事件←'開始服務';
下一顧客編号←到達顧客編号;
下一時間←目前時間;
End
螢幕輸出本次事件資訊。
記錄本次事件資訊到EventTable
到達顧客編号←到達顧客編号+1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 MATLAB程式源代碼:
% 程式名:BarbershopModel.m
% 理發店模型仿真程式
% <系統模組化與仿真>課程相關
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 參數說明
% t0 初始時間; barber 理發師狀态(忙/閑); time 目前時間; line 排隊人數;
% A 全體顧客的到達時間間隔表; S 全體顧客的服務時間表; EventTable 事件表;
% nextEvent 下一事件(A: 到達, S: 開始服務, E: 服務結束離開);
% nextNum 下一事件顧客編号; nextTime 下一事件時間; aflag 下個到達顧客編号;
% sflag 下個開始服務顧客編号;
% SBegin 全體顧客的開始服務時間表; SEnd 全體顧客的結束服務時間表;
% AA 全體顧客的到達時間表;
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function main()
% 初始化狀态
global t0; global barber; global time; global line;
% 模型參數取值
global A; global S; global EventTable; global nextEvent;
global nextNum; global nextTime; global aflag; global sflag;
global SBegin; global SEnd; global AA;
disp('------------------------------------------------')
BarbershopInit()
while sflag<=length(S)
time=nextTime;
if nextEvent=='A'
BarbershopArrive()
elseif nextEvent=='E'
BarbershopLeave()
elseif nextEvent=='S'
BarbershopService()
end
end
BarbershopReport()
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function BarbershopInit()
global t0; global barber; global time; global line;
global A; global S; global EventTable; global nextEvent;
global nextNum; global nextTime; global aflag; global sflag;
global SBegin; global SEnd; global AA;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 初始化狀态
t0=0;
barber=0;
time=t0;
line=0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 模型參數取值
A=[15 32 24 40 22 35 25 10 30 20];
AA=A;
for i=2:10
AA(i)=AA(i-1)+A(i);
end
S=[43 36 34 28 45 25 30 40 35 45];
EventTable=[];
nextEvent='A';
nextNum=1;
nextTime=A(1);
aflag=1;
sflag=1;
SBegin=[];
SEnd=[];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function BarbershopArrive()
global t0; global barber; global time; global line;
global A; global S; global EventTable; global nextEvent;
global nextNum; global nextTime; global aflag; global sflag;
global SBegin; global SEnd; global AA;
aflag=nextNum;
if barber==1
line=line+1;
if aflag<length(AA)
if SEnd(sflag)<=AA(aflag+1)
nextEvent='E';
nextNum=sflag;
nextTime=SEnd(sflag);
else
nextEvent='A';
nextNum=aflag+1;
nextTime=AA(aflag+1);
end
else
nextEvent='E';
nextNum=sflag;
nextTime=SEnd(sflag);
end
else
nextEvent='S';
nextNum=aflag;
nextTime=AA(aflag);
end
sbarber=['閑','忙'];
ss=[num2str(time), ' ',num2str(aflag), '号顧客 到達. ','理發師 ', sbarber(barber+1),' ', num2str(line), '人排隊. '];
disp(ss)
s=[time, aflag, 111111, barber, line]; % 111111表示到達
EventTable=[EventTable; s];
aflag=aflag+1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function BarbershopLeave()
global t0; global barber; global time; global line;
global A; global S; global EventTable; global nextEvent;
global nextNum; global nextTime; global aflag; global sflag;
global SBegin; global SEnd; global AA;
barber=0;
if line>0
nextEvent='S';
nextNum=sflag+1;
nextTime=time;
else
if (sflag<length(S))
nextEvent='A';
nextNum=aflag;
nextTime=AA(aflag);
else
nextEvent=' ';
nextNum=-1;
nextTime=-1;
end
end
sbarber=['閑','忙'];
ss=[num2str(time), ' ',num2str(sflag), '号顧客 結束服務離開. ','理發師 ', sbarber(barber+1),' ', num2str(line), '人排隊. '];
disp(ss);
s=[time, sflag, 333333, barber, line]; % 333333表示結束服務離開
EventTable=[EventTable; s];
sflag=sflag+1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function BarbershopService()
global t0; global barber; global time; global line;
global A; global S; global EventTable; global nextEvent;
global nextNum; global nextTime; global aflag; global sflag;
global SBegin; global SEnd; global AA;
if line>0 line=line-1; end
barber=1;
SBegin=[SBegin time];
SEnd=[SEnd time+S(sflag)];
if (sflag==length(S))
nextEvent='E';
nextNum=sflag;
nextTime=SEnd(sflag);
else if aflag>length(AA)
nextEvent='E';
nextNum=sflag;
nextTime=SEnd(sflag);
else if SEnd(sflag)<=AA(aflag)
nextEvent='E';
nextNum=sflag;
nextTime=SEnd(sflag);
else
nextEvent='A';
nextNum=aflag;
nextTime=AA(aflag);
end
end
end
sbarber=['閑','忙'];
ss=[num2str(time), ' ',num2str(sflag), '号顧客 開始服務. ','理發師 ', sbarber(barber+1),' ', num2str(line), '人排隊. '];
disp(ss);
s=[time, sflag, 222222, barber, line]; % 222222表示開始服務
EventTable=[EventTable; s];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function BarbershopReport()
global t0; global barber; global time; global line;
global A; global S; global EventTable; global nextEvent;
global nextNum; global nextTime; global aflag; global sflag;
global SBegin; global SEnd; global AA;
disp('---------------------------------------------------------------')
disp(EventTable)
disp('---------------------------------------------------------------')
end
6仿真程式運作結果
------------------------------------------------
15 1号顧客 到達. 理發師 閑 0人排隊.
15 1号顧客 開始服務. 理發師 忙 0人排隊.
47 2号顧客 到達. 理發師 忙 1人排隊.
58 1号顧客 結束服務離開. 理發師 閑 1人排隊.
58 2号顧客 開始服務. 理發師 忙 0人排隊.
71 3号顧客 到達. 理發師 忙 1人排隊.
94 2号顧客 結束服務離開. 理發師 閑 1人排隊.
94 3号顧客 開始服務. 理發師 忙 0人排隊.
111 4号顧客 到達. 理發師 忙 1人排隊.
128 3号顧客 結束服務離開. 理發師 閑 1人排隊.
128 4号顧客 開始服務. 理發師 忙 0人排隊.
133 5号顧客 到達. 理發師 忙 1人排隊.
156 4号顧客 結束服務離開. 理發師 閑 1人排隊.
156 5号顧客 開始服務. 理發師 忙 0人排隊.
168 6号顧客 到達. 理發師 忙 1人排隊.
193 7号顧客 到達. 理發師 忙 2人排隊.
201 5号顧客 結束服務離開. 理發師 閑 2人排隊.
201 6号顧客 開始服務. 理發師 忙 1人排隊.
203 8号顧客 到達. 理發師 忙 2人排隊.
226 6号顧客 結束服務離開. 理發師 閑 2人排隊.
226 7号顧客 開始服務. 理發師 忙 1人排隊.
233 9号顧客 到達. 理發師 忙 2人排隊.
253 10号顧客 到達. 理發師 忙 3人排隊.
256 7号顧客 結束服務離開. 理發師 閑 3人排隊.
256 8号顧客 開始服務. 理發師 忙 2人排隊.
296 8号顧客 結束服務離開. 理發師 閑 2人排隊.
296 9号顧客 開始服務. 理發師 忙 1人排隊.
331 9号顧客 結束服務離開. 理發師 閑 1人排隊.
331 10号顧客 開始服務. 理發師 忙 0人排隊.
376 10号顧客 結束服務離開. 理發師 閑 0人排隊.
本賬号專注數學思維和大學理工教育與科研。
如果對您有用。請關注作者。歡迎點贊評論收藏轉發。