前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matlab-离散事件系统仿真实验

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

作者头像
用户9925864
发布2022-07-27 09:31:22
6060
发布2022-07-27 09:31:22
举报
文章被收录于专栏:算法工程师的学习日志
代码语言:javascript
复制
分析一个单服务台排队系统

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 下发生的事件类型 Ei = 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),' 人'])
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师的学习日志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档