分析一个单服务台排队系统
1、排队系统的一般理论
一般的排队系统都有三个基本组成部分:
(1) 到达模式:指动态实体(顾客)按怎样的规律到达,描写实体到达的统计特性。通常假定顾客总体是无限的。
(2) 服务机构:指同一时刻有多少服务设备可以接纳动态实体,它们的服务需要多少时间。它也具有一定的分布特性。通常,假定系统的容量(包括正在服务的人数加上在等待线等待的人数)是无限的。(3) 排队规则:指对下一个实体服务的选择原则。通用的排队规则包括先进先出(FIFO),后进先出(LIFO),随机服务(SIRO)等。
2、离散系统常用的仿真策略
(1)事件调度法(Event Scheduling):
基本思想:离散事件系统中最基本的概念是事件,事件发生引起系统状态的变化,用事件的观点来分析真实系统。通过定义事件或每个事件发生系统状态的变化,按时间顺序确定并执行每个事件发生时有关逻辑关系。
(2)活动扫描法:
基本思想:系统有成分组成,而成分又包含活动。活动的发生必须满足某些条件,且每一个主动成分均有一个相应的活动例程。仿真过程中,活动的发生时间也作为条件之一,而且较之其他条件具有更高的优先权。
(3)进程交互法:
基本思想:将模型中的主动成分历经系统所发生的事件及活动,按时间发生的顺序进行组合,从而形成进程表。系统仿真钟的推进采用两张进程表,一是当前事件表,二是将来事件表。
3、本实验采用单服务台模型
(1) 到达模式:顾客源是无限的,顾客单个到达,相互独立,一定时间的到达数服从指数分布。
(2) 排队规则:单队,且对队列长度没有限制,先到先服务的 FIFO规则。
(3) 服务机构:单服务台,各顾客的服务时间相互独立,服从相同的指数分布。
(4) 到达时间间隔和服务时间是相互独立的。
4、仿真运行方式
仿真运行方式可分为两大类:
(1)终止型仿真:仿真的运行长度是事先确定的由于仿真运行时间长度有限,系统的性能与运行长度有关,系统的初始状态对系统性能的影响是不能忽略的。为了消除由于初始状态对系统性能估计造成的影响,需要多次独立运行仿真模型。
(2)稳态型仿真:这类仿真研究仅运行一次,但运行长度却是足够长,仿真的目的是估计系统的稳态性能。
5、系统设计
采用事件调度法,事件调度法共有三种事件:即“顾客到达”、“服务开始”、“服务结束”。其中“服务开始”为条件事件,其条件是“顾客队列长度不为零且服务员空闲”。在用事件调度法时,不单独考虑条件事件,而将其并入非条件事件中。因此,需要考虑的事件例程有“顾客到达时间例程”和 “服务结束时间例程”。“顾客到达时间例程”和 “服务结束时间例程”如图
事件调度法的程序结构设计如下:
(1)初始化。
设置仿真的开始时间 t0和结束时间 tf ;
设置实体的初始化状态;
设置初始事件及其发生时间 ts。
(2)仿真时钟 TIME = ts。
(3)确定在当前时钟 TIME 下发生的事件类型 E(i = 1,2,3,…,n),并按解结规则排序。
(4)如果 TIME <= tf执行。
{case E1:执行 E1 的事件例程;产生后续事件类型及发生时间;……case En:执行 En 的事件例程;产生后续事件类型及发生时间;
}
否则,转(6).
(5)将仿真时钟 TIME 推进到下一最早事件发生时刻;转(3)。(6)结束仿真。
6、思路分析
采用事件调度法来研究单服务台排队系统。顾客逐个到达服务台,且相邻两个顾客到达服务台的时间间隔服从参数为 3 min 的指数分布。到达服务台后,若这时服务员空闲,则为其提供服务,若此时服务员正在为其他顾客服务,则刚到的顾客排队等待。服务员为每位顾客服务的时间长度服从参数为 4 min 的指数分布。使用 Matlab 软件进行建模仿真,用 exprnd 函数生成符合指数分布的随机数。用三个空白数组分别存储第 i 个顾客引起的三种事件先后发生的时刻,对获得的参数按照时间顺序进行整理和分析,可以得出平均队长、平均等待时间等重要参数,流程样例如下
单服务台排队系统的流程框架图如下:
代码语言:javascript复制clc
close all
clear
rng default
T = 1000; % T-仿真长度(min)
mu1=3; %顾客到达时间间隔(指数分布)的均值
mu2=4; %服务时间(指数分布)均值
arriveGap = []; % 到达时间间隔
serveGap = []; % 服务时间
Arrive=[]; %顾客到达时间
Serve=[]; %服务开始时间
Leave=[]; %服务结束时间
%===========初始化============%
i=0; % 第几个顾客抵达
t0=0; % 仿真开始时间
TIME=0; % 系统时间
arriveGap = [arriveGap, exprnd(mu1)];
Tarrv=t0 arriveGap(i 1); % 第i个抵达时间
serveGap = [serveGap, exprnd(mu2)];
Tleave=Tarrv serveGap(i 1); % 第i个服务结束时间
Arrive=[Arrive,Tarrv];
Serve=[Serve,Tarrv];
Leave=[Leave,Tleave];
% 开始仿真
while TIME < T
i=i 1;
arriveGap = [arriveGap, exprnd(mu1)];
Tarrv=Tarrv arriveGap(i 1); %确定下一顾客到达时刻
% 留个空白思考
if Leave(i)<=Arrive(i 1) %服务员空闲,无需排队
% 留个空白思考
else %服务员忙碌,需要排队
% 留个空白思考
end
% 留个空白思考
Leave=[Leave,Tleave];
end
%%
Twait=[]; %每个顾客的等待时间
Nwait=[]; %每个顾客接受服务时的队长
WaitNum=0; % 平均等待人数
WaitTime=0; % 平均等待时间
%平均等待时间
for j=1:i
Twait(j)=Serve(j)-Arrive(j);
WaitTime=WaitTime Twait(j);
end
WaitTime=WaitTime/i;
%平均队长
for m=1:i
k=0;
for n=m 1:i
if Leave(m)>Arrive(n)
k=k 1;
else
break;
end
end
Nwait(m)=k;
WaitNum=WaitNum Nwait(m);
end
WaitNum=WaitNum/i;
%绘图
figure
plot(arriveGap)
xlabel 顾客序号
ylabel 到达间隔时间/min
figure
plot(serveGap)
xlabel 顾客序号
ylabel 服务时间/min
figure
plot(Twait);
xlabel 顾客序号
ylabel 等待时间/min
figure
plot(Nwait);
xlabel 顾客序号
ylabel 队伍长度/人
disp(['平均到达间隔时间:', num2str(mean(arriveGap)),' min'])
disp(['平均服务时间:', num2str(mean(serveGap)),' min'])
disp(['平均等待时间:', num2str(WaitTime),' min'])
disp(['平均队长指标:', num2str(WaitNum),' 人'])