Matlab-离散事件系统仿真实验

  • Post author:
  • Post category:其他


分析一个单服务台排队系统

图片

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 个顾客引起的三种事件先后发生的时刻,对获得的参数按照时间顺序进行整理和分析,可以得出平均队长、平均等待时间等重要参数,流程样例如下

图片

单服务台排队系统的流程框架图如下:

图片

clcclose allclearrng defaultT = 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);endWaitTime=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;%绘图figureplot(arriveGap)xlabel 顾客序号ylabel 到达间隔时间/minfigureplot(serveGap)xlabel 顾客序号ylabel 服务时间/minfigureplot(Twait);xlabel 顾客序号ylabel 等待时间/minfigureplot(Nwait);xlabel 顾客序号ylabel 队伍长度/人
disp(['平均到达间隔时间:', num2str(mean(arriveGap)),' min'])disp(['平均服务时间:', num2str(mean(serveGap)),' min'])disp(['平均等待时间:', num2str(WaitTime),' min'])disp(['平均队长指标:', num2str(WaitNum),' 人'])

图片

图片



版权声明:本文为qingfengxd1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。