MMN排队系统建模与仿真.docx
《MMN排队系统建模与仿真.docx》由会员分享,可在线阅读,更多相关《MMN排队系统建模与仿真.docx(31页珍藏版)》请在冰点文库上搜索。
MMN排队系统建模与仿真
M/M/N排队系统的模拟仿真
摘要
排队是在日常生活中经常遇到的事,由于顾客到达和服务时间的随机性,使得排队不可避免。
因此,本文建立标准的M/M/N模型,并运用Matlab软件,对M/M/N排队系统就行了仿真,从而更好地深入研究排队问题。
问题一,基于顾客到达时间服从泊松分布和服务时间服从负指数分布,建立了标准的M/M/N模型。
运用Matlab软件编程,通过输入服务台数量、泊松分布参数以及负指数分布参数,求解出平均队长、服务利用率、平均等待时间以及平均排队长等重要指标。
然后,分析了输入参数与输出结果之间的关系。
得出当服务台数增加时,几个参数都会变小的结论。
问题二,为了更加清晰地反映出实际排队过程。
本文通过运用Matlab软件编程,制作了M/M/1排队过程的动画仿真,通过输入泊松分布参数以及负指数分布参数来模拟不同情况下的排队过程。
通过仿真动画,可以看到明显的等待和排队过程。
问题三,为了清晰地展示程序执行的效果以及程序功能的使用方法。
本文特意制作了程序运行指南,并做了程序运行实例分析。
通过详细地介绍,使读者能更好地理解M/M/N模型以及如何使用该仿真程序。
最后,对建立的M/M/N模型做了评价,并提出了一些改进的思路。
同时,指出了程序实现的难点等问题。
关键词:
M/M/N排队系统泊松分布负指数分布动画模拟仿真
1.问题分析
排队论(QueuingTheory)也称随机服务系统理论,就是为解决有关排队问题而发展的一门学科。
它研究的容有下列三部分:
1.性态问题,即研究各种排队系统的概率规律性,主要是研究队长分布、等待时间分布和忙期分布等,包括了瞬态和稳态两种情形。
2.最优化问题,又分静态最优和动态最优,前者指最优设计。
后者指现有排队系统的最优运营。
3.排队系统的统计推断,即判断一个给定的排队系统符合于哪种模型,以便根据排队理论进行分析研究。
其过程如下图:
本文需要解决的问题:
1.建立顾客到达时间服从泊松分布、服务时间服从负指数分布的M/M/N排队模型,并利用Matlab软件实现输入参数的键入以及输出参数的显示。
2.运用Matlab软件编程制作M/M/1排队系统的动态仿真模拟动画,并拥有输入参数的键入功能。
3.制作程序运行指南,并结合程序运行实例对程序功能作深入分析。
4.对本文建立的标准M/M/N排队模型作评价。
2.模型假设
针对本问题,建立如下合理的假设:
1.顾客源是无穷的;
2.排队长度没有限制;
3.到达系统的顾客按先到先服务原则依次进入服务;
4.服务员在仿真过程中没有休假;
5.顾客到达时排成一队,当有服务台空闲时进入服务状态;
6.单位时间到达的顾客数量服从泊松分布;
7.顾客所需的服务时间服从负指数分布;
8.各服务台工作是相互独立且平均服务时间相同。
3.符号说明
符号
说明
单位
顾客到达时间参数
人数/分
顾客服务时间参数
人数/分
出现某种状态的概率
\
服务利用率
\
平均排队长
人
平均队长
人
平均逗留时间
分钟
平均等待时间
分钟
4.模型准备
4.1排队系统的组成和特征
一般的排队过程都由输入过程、排队规则、服务过程三部分组成,现分述如下:
4.1.1输入过程
输入过程是指顾客到来时间的规律性,可能有下列不同情况:
1.顾客的组成可能是有限的,也可能是无限的。
2.顾客到达的方式可能是一个—个的,也可能是成批的。
3.顾客到达可以是相互独立的,即以前的到达情况对以后的到达没有影响,否则是相关的。
4.输入过程可以是平稳的,即相继到达的间隔时间分布及其数学期望、方差等数字特征都与时间无关,否则是非平稳的。
4.1.2排队规则
排队规则指到达排队系统的顾客按怎样的规则排队等待,可分为损失制,等待制和混合制三种。
1.损失制(消失制)。
当顾客到达时,所有的服务台均被占用,顾客随即离去。
2.等待制。
当顾客到达时,所有的服务台均被占用,顾客就排队等待,直接受完服务才离去。
例如出故障的机器排队等待维修就是这种情况。
3.混合制。
介于损失制和等待制之间的是混合制,即既有等待又有损失。
有队列长度有限和排队等待时间有限两种情况,在限度以就排队等待,超过一定限度就离去。
排队方式还分为单列、多列和循环队列。
4.1.3服务过程
1.服务机构。
主要有以下几种类型:
单服务台;多服务台并联(每个服务台同时为不同顾客服务);多服务台串联(多服务台依次为同一顾客服务);混合型。
2.服务规则。
按为顾客服务的次序采用以下几种规则:
1)先到先服务,这是通常的情形。
2)后到先服务,如情报系统中,最后到的情报信息往往最有价值,因而常被优先处理。
3)随机服务,服务台从等待的顾客中随机地取其一进行服务,而不管到达的先后。
4)优先服务,如医疗系统对病情严重的病人给予优先治疗。
4.1.4排队系统的主要指标
1.平均队长:
指系统顾客数(包括正被服务的顾客与排队等待服务的顾客)的数学期望。
2.平均排队长:
指系统等待服务的顾客数的数学期望。
3.平均逗留时间:
顾客在系统逗留时间(包括排队等待的时间和接受服务的时间)的数学期望。
4.平均等待时间:
指一个顾客在排队系统中排队等待时间的数学期望。
5.平均忙期:
指服务机构连续繁忙时间(顾客到达空闲服务机构起,到服务机构再次空闲止的时间)长度的数学期望。
4.2输入过程与服务时间的分布
排队系统中的事件流包括顾客到达流和服务时间流。
由于顾客到达的间隔时间和服务时间不可能是负值,因此,它的分布是非负随机变量的分布。
最常用的分布有泊松分布、确定型分布,指数分布和爱尔朗分布。
由于本文只用到了泊松分布和负指数分布,因此只对这两种分布加以说明。
4.2.1负指数分布
指数分布是单参数
的非对称分布,记作
,概率密度函数为:
它的数学期望为
,方差为
。
指数分布是唯一具有无记忆性的连续型随机变量,即有
,在排队论、可靠性分析中有广泛应用。
本文将用负指数分布来产生顾客的服务时间。
4.2.2泊松分布
泊松分布与指数分布有密切的关系。
当顾客平均到达率为常数
的到达间隔服从指数分布时,单位时间到达的顾客数K服从泊松分布,即单位时间到达k位顾客的概率为
记作Poisson(λ)。
泊松分布在排队服务、产品检验、生物与医学统计、天文、物理等领域都有广泛应用。
本文将用泊松分布来产生单位时间到达的顾客数目。
4.3生灭过程
在排队论中,如果
表示时刻
系统中的顾客数,则
就构成了一个随机过程。
如果用“生”表示顾客的到达,“灭”表示顾客的离去,则对许多排队过程来说,
就是一类特殊的随机过程-生灭过程。
定义1设
为一个随机过程。
若
的概率分布具有以下性质:
1.假设
,则从时刻
起到下一个顾客到达时刻止的时间服从参数为
的负指数分布,
。
2.假设
,则从时刻
起到下一个顾客离去时刻止的时间服从参数为
的负指数分别,
。
3.同一时刻只有一个顾客到达或离去。
则称
为一个生灭过程。
当系统运行相当时间而到达平衡状态后,对任一状态
,即
其中
表示系统中一共有
名顾客,单位时间进入该状态的平均次数和单位时间离开该状态的平均次数应该相等,这就是系统在统计平衡下的“流入=流出”原理。
根据这一原理,可得到任一状态下的平衡方程如下:
有上述平衡方程,可求得
因此,记
则平稳状态的分布为
由概率分布的要求
可以得到
即系统空闲状态的概率。
注意只有当级数
收敛时才有意义。
5.标准M/M/N模型
5.1多服务台模型准备
设顾客单个到达,相继到达时间间隔服从参数为
的负指数分布,系统中共有
个服务台,每个服务台的服务时间相互独立,且服从参数为
的负指数分布。
当顾客到达时,若有空闲的服务台则马上接受服务,否则便排成一个队列等待,等待时间为无限。
记
为系统达到平稳状态后的队长N的概率分布,注意到对个数为s的多服务台系统,有
和
记服务强度
,
,则当
时,由式(3)、(4)、(5)、(6),可以得到
故
其中
为系统空闲的概率。
因此,系统中有任意多个顾客的概率都可以由式(11)和式(12)得到。
从而,就可以计算出反映该系统性能的各种重要指标。
5.2多服务台模型建立
5.2.1服务利用率
在本文中,简单的把服务利用率定义为系统处于非空闲状态的概率。
因此,由公式(12),可以得到服务利用率为
5.2.2平均排队长
对于多服务台排队系统,由公式(11)和公式(12)可以得到系统到达平稳状态的平均排队长
。
5.2.3平均队长
对于到达平稳状态的多服务台排队系统,平均队长
等于平均排队长与正在接受服务的顾客的平均数之和,即
记系统中正在接受服务的顾客的平均数为
,则
因此,平均队长
5.2.4平均等待时间
对于顾客在系统中平均等待时间的建模,可以先计算顾客在系统中的逗留时间,然后再减去顾客在系统中的服务时间,这样就可以得到顾客的平均等待时间。
顾客在系统中的逗留时间可以看作一个服从
的负指数分布,即
因此,平均逗留时间
又因为顾客在系统中的逗留时间
等于等待时间
与接受服务的时间
之和,即
故平均等待时间
6.程序设计
6.1动画流程图
YES
6.2M/M/N流程图
开始
输入参数
判断输入是否正确?
NO
代入公式计算,并显示结果
YES
结束?
END
YES
NO
7.程序运行实例介绍
7.1动画实例讲解
当运行程序时就会出现下面的窗口:
如果要观看M/M/1排队系统的仿真动画,可以现在左下角输入每分钟到达人数和每分钟服务人数。
然后,点击“观看动画”按钮,就可以观看仿真动画。
例如,设每分钟到达人数为0.35、每分钟服务人数为0.4.
程序运行一段时间后,我们可以看到如下的画面:
由上图,可以得到等待人数、总接待人数以及离开人数。
如果要重新设置参数,可以按左下角的“重置”键。
当“重置”键按下后,我们可以看到如下画面:
然后,重新设置每分钟到达人数以及每分钟服务人数,并点击“观看动画”。
7.2M/M/N排队系统实例讲解
在窗口的“请设置参数”下方,可以设置服务台数、每分钟到达人数以及每分钟服务人数。
然后,点击“开始”按钮,在“模型仿真结果”下方就可以得到平均队长、服务利用率、平均等待时间以及平均排队长度。
如果要重新设置参数,可以点击开始键旁边“重置”,点击后可得到如下画面:
可以看见“M/M/N排队系统计算”下面所有的框都被置为0。
如果输入参数出错时,程序会弹出窗口自动提示,如下图:
并且在切换到提示时,并不会影响前面动画的执行。
因此,不必担心输入参数出错而影响其他程序的运行。
点击“返回”即可回到前一画面,并且可以看见“M/M/N排队系统计算”所有的框都被置为0。
点击后的画面如下图:
注:
本程序在执行时是以一秒钟代替一分钟
8.程序实现难点和模型评价
8.1程序实现难点
1.本段程序的主要难点在制作动画中,在制作动画时不是很容易把泊松分布和负指数分布产生的数据和实际的时间联系起来。
最后,利用了clock函数解决了问题。
2.在GUI设计时,切换画面时总是会有一定的闪动,此问题暂时还没有解决。
8.2模型评价
本文建立的是标准的M/M/N排队系统模型,而在实际生活中并不是这样的。
在实际的生活中往往是一种有损失制的排队系统,当人们在排队的时候看见排队的人数很多就会部分人就会离开,而从模型并没有考虑此情况。
因此,模型还有待改进。
9.参考文献
[1]《运筹学》教材编写组, 运筹学(第三版),:
清华大学[M],2005
[2]齐欢王小平系,统建模与仿真:
清华大学[M],2004。
[3]启源金星,数学模型(第三版),:
高等教育[M],2003。
[4],MATLAB与控制系统仿真实践,:
航空航天大学[M],2009
[5]施晓红周佳,精通GUI图形界面编程,:
大学[M],2003
10.附录
10.1动画实现的核心程序
functionMypush_Callback(hObject,eventdata,handles)
%hObjecthandletoMypush(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
axes(handles.Myaxe);
N=10000;
%geta=str2double(get(findobj('tag','MYGETA'),'String'));
%serveb=str2double(get(findobj('tag','MYSERVEB'),'String'));
geta=str2double(get(handles.MYGETA,'String'));
serveb=str2double(get(handles.MYSERVEB,'String'));
geta=1/geta;
serveb=1/serveb;
reset=0;%动画标志
nownum=0;%初始人数
servenum=0;%接受服务的总人数
outnum=0;
%state=0;%0服务台无人,1有人
gettime0=ceil(poissrnd(geta,1,N));%%产生到达时间
gettime=cumsum(gettime0(1,:
));
servetime0=ceil(exprnd(serveb,1,N));%%产生服务时间
servetime=cumsum(servetime0(1,:
));
leavetime
(1)=gettime
(1)+servetime0
(1);
forj=2:
N
leavetime(j)=leavetime(j-1)+servetime0(j);%等于前一个离开时间加其服务时间
end
waittime
(1)=0;
forj=2:
N
waittime(j)=-gettime(j)+leavetime(j-1);%等待时间
end
x=10;
y=0;
h=plot(x,y,'.');
holdon
x0=10;
y0=8;
h1=plot(x0,y0,'.');
holdon
xl=10;
yl=16;
h2=plot(xl,yl,'.');
holdon
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%服务台
x1=[812128];%指定x坐标的值
y1=[15151717];%指定y坐标的值
X1=[x1x1
(1)];%首尾相连
Y1=[y1y1
(1)];%首尾相连
plot(X1,Y1);
fill(X1,Y1,'y');
text(8,18,'服务台');
holdon
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%等待处
x2=[812128];%指定x坐标的值
y2=[7799];%指定y坐标的值
X2=[x2x2
(1)];%首尾相连
Y2=[y2y2
(1)];%首尾相连
plot(X2,Y2);
fill(X2,Y2,'r');
text(8,10,'等待处');
holdon
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%等待人数
x3=[14161614];%指定x坐标的值
y3=[7799];%指定y坐标的值
X3=[x3x3
(1)];%首尾相连
Y3=[y3y3
(1)];%首尾相连
plot(X3,Y3);
fill(X3,Y3,'g');
text(13,10,'等待人数');
holdon
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%总接待人数
x4=[3553];%指定x坐标的值
y4=[15151717];%指定y坐标的值
X4=[x4x4
(1)];%首尾相连
Y4=[y4y4
(1)];%首尾相连
plot(X4,Y4);
fill(X4,Y4,'b');
text(1,18,'总接待人数');
holdon
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%入口
x5=[911119];%指定x坐标的值
y5=[0022];%指定y坐标的值
X5=[x5x5
(1)];%首尾相连
Y5=[y5y5
(1)];%首尾相连
plot(X5,Y5);
fill(X5,Y5,'g');
text(11.5,1,'入口');
holdon
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%出口
x6=[17191719];%指定x坐标的值
y6=[15151717];%指定y坐标的值
X6=[x6x6
(1)];%首尾相连
Y6=[y6y6
(1)];%首尾相连
plot(X6,Y6);
fill(X6,Y6,'g');
text(18,18,'出口');
holdon
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%离开人数
x7=[14161614];%指定x坐标的值
y7=[15151717];%指定y坐标的值
X7=[x7x7
(1)];%首尾相连
Y7=[y7y7
(1)];%首尾相连
plot(X7,Y7);
fill(X7,Y7,'g');
text(12,18,'离开人数');
holdon
axis([020020])
axissquare
gridoff
set(h,'EraseMode','xor','MarkerSize',18)%异或实现动画
set(h1,'EraseMode','xor','MarkerSize',18)
set(h2,'EraseMode','xor','MarkerSize',18)
i=1;
j=1;
t=1;
temp=clock;
nowtime=temp(6)+temp(5)*60+temp(4)*60*60+temp(3)*24*60*60;
nowtime0=nowtime;%记录开始仿真的时间
while1
geta=str2double(get(handles.MYGETA,'String'));
serveb=str2double(get(handles.MYSERVEB,'String'));
if(geta==0||serveb==0)%按下重置键
h_axes=findobj(gcf,'type','axes');%获得当前图中所有坐标的句柄
h_children_axes=allchild(h_axes);%获得坐标的子对象的句柄
delete(h_children_axes);%删除所有坐标子对象句柄,达到清空目的
break;
end
%if(geta==-1||serveb==-1)%按下退出键
%break;
%end
if(reset==1)%把坐标置到(10,0)入口处
x=10;
y=0;
reset=0;
end
time=clock;
curtime=time(6)+time(5)*60+time(4)*60*60+time(3)*24*60*60;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%顾客到来
if(i<=length(gettime))
if(curtime-nowtime0>=gettime(i))
y=y+0.005;
set(h,'XData',x,'YData',y)
if(y>=8)
reset=1;
fill(X3,Y3,'g')
nownum=nownum+1;
text(15,8,num2str(nownum));
i=i+1;
%tempnum=1;
%nowtime=curtime;%更新时间
%plot(x,y,'o');
%holdon
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%顾客去服务
if(j
if(nownum>0)
if(curtime-nowtime0>=gettime(j)+waittime(j))
x0=10.000;
y0=y0+0.005;
set(h1,'XData',x0,'YData',y0)
if(y0>=16)
nownum=nownum-1;
servenum=servenum+1;
%state=1;
fill(X3,Y3,'g')
text(15,8,num2str(nownum));
fill(X4,Y4,'b');
text(3.7,16,num2str(servenum));
x0=10;
y0=8;
j=j+1;
end
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%顾客离开
if(tif(servenum>0)
%if(state>0)
if(curtime-nowtime0>=leavetime(t))
xl=xl+0.005;
yl=16;
set(h2,'XData',xl,'YData',yl)
%if(xl>=20)
%t=t+1;
%xl=10;
%end
if(xl>=18)
t=t+1;
xl=10;
outnum=outnum+1;
fill(X7,Y7,'g');
text(14.5,16,num2str(outnum));
%state=0;
%end
end
end
end
end
if(i>size(gettime))
if(j>size(waittime))
if(t>size(leavetime))
break;
end
end
end
drawnow
end
10.2M/M/N模型计算主要程序
functionMYstart_Callback(hObject,eventdata,handles)
%hObjecthandletoMYstart(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(se