离散事件系统仿真实验
通过单服务台排队系统的方针,理解和掌握对离散事件的仿真建模方法,以便对其他系统进行建模,并对其系统分析,应用到实际系统,对实际系统进行理论指导。
1.排队系统的通常理论
一般的排队系统都有三个基本组成部分:
(1)抵达模式:指动态实体(顾客)按怎样的规律抵达,描绘实体抵达的统计数据特性。通常假设顾客总体就是无穷的。
(2)服务机构:指同一时刻有多少服务设备可以接纳动态实体,它们的服务需要多少时间。它也具有一定的分布特性。通常,假定系统的容量(包括正在服务的人数加上在等待线等待的人数)是无限的。 (3)排队规则:所指对下一个实体服务的挑选原则。通用型的排队规则包含先进先出(fif
o),后进先出(lifo),随机服务(siro)等。
2.对于离散系统有三种常用的仿真策略:事件调度法、活动扫描法、进程交互法。
(1)事件调度法(eventscheduling):
基本思想:离散事件系统中最基本的概念是事件,事件发生引起系统状态的变化,用事
件的观点去分析真实系统。通过定义事件或每个事件出现系统状态的变化,按时间顺序确认并继续执行每个事件出现时有关逻辑关系。
(2)活动扫描法:
基本思想:系统存有成分共同组成,而成分又涵盖活动。活动的出现必须满足用户某些条件,且每
一个主动成分均有一个相应的活动例程。仿真过程中,活动的发生时间也作为条件之一,而且较之其他条件具有更高的优先权。
(3)进程可视化法:
基本思想:将模型中的主动成分历经系统所发生的事件及活动,按时间发生的顺序进行
女团,从而构成进程表中。系统仿真钟的大力推进使用两张进程表中,一就是当前事件表中,二就是将来事件表中。
3.本实验采用的单服务台模型
(1)抵达模式:顾客源就是无穷的,顾客单个抵达,相互单一制,一定时间的抵达数顺从指数
(2)排队规则:单队,且对队列长度没有限制,先到先服务的fifo规则。(3)服务机构:单服务台,各顾客的服务时间相互独立,服从相同的指数分布。(4)到达时间间隔和服务时间是相互独立的。
4.事件调度法的仿真策略
事件调度法的基本思想是:用事件的观点来分析真实系统,通过定义事件及每个事件发
生对于系统状态的变化,按时间顺序确认并继续执行每个事件出现时有关的逻辑关系。
按这种策略建立模型时,所有事件均放在事件表中。模型中设有一个时间控制成分,该
成分从事件表挑选具备最早出现时间的事件,并将仿真钟修正至该事件出现的时间,再调用与该事件适当的事件处理模块,该事件处理回去后回到时间掌控成分。这样,事件的挑选与处置不断地展开,直至仿真中止的条件或程序事件产生年才。
5.离散事件结果分析
仿真运转方式可以分成两大类:
(1)终止型仿真:仿真的运行长度是事先确定的
由于仿真运行时间长度非常有限,系统的性能与运转长度有关,系统的初始状态对系统性能
的影响是不能忽略的。为了消除由于初始状态对系统性能估计造成的影响,需要多次独立运行仿真模型。
(2)稳态型仿真:这类仿真研究仅运转一次,但运转长度却是足够多短,仿真的目的就是
估
计系统的稳态性能。
三、理论分析根据排队学说的科学知识我们晓得,排队系统的分类就是根据该系统中的顾客抵达模式、服务模
式、服务员数量以及服务规则等因素决定的。
1、顾客抵达模式
实体(临时实体)到达模式:顾客。实体到达模式是顾客到达模式,设到达时间间隔a1服从均值βa=5min的指数分布
f(a)=
e-a/βa(a≥0)
设立服务员为每个顾客服务的时间为si,它也顺从指数分布,均值为βs=4min
f(s)=
e-s/βs(s≥0)
由于是单服务台系统,考虑系统顾客按单队排列,并按fifo方式服务4、理论分析结果
在该系统中,设立
μ,则稳态时的平均等待队长为1-ρ,顾客的平均等待时间为
2、仿真设计算法(主要函数)
利用指数分布间的关系,产生符合过程的顾客流,产生符合指数分布的随机变量作为每
个顾客的服务时间:
interval_arrive=-log(rand(1,simtotal))/lambda;%到达时间间隔,结果与调用exprnd(1/lambda,m)函数产生的结果相同
interval_serve=-log(rand(1,simtotal))/mu;%服务时间间隔t_arrive(1)=interval_arrive(1);
%顾客抵达时间时间排序t_wait=t_leave-t_arrive;%各顾客在系统中的等待时间t_queue=t_wait-interval_serve;%各顾客在系统中的排队时间
由事件来触发仿真时钟的不断推进。每发生一次事件,记录下两次事件间隔的时间以及在该时间段内排队的人数:
timepoint=[t_arrive,t_leave];%系统中顾客数变化cusnum=zeros(size(timepoint));
cusnum_avg=sum(cusnum_fromstart.*[time_interval0])/timepoint(end);%系统中平均顾客数计算
quelength_avg=sum([0quelength].*[time_interval0])/timepoint(end);%系统平均值等候队长
3、仿真程序(matlab语言)
clear;clc;
%m/m/1排队系统仿真
simtotal=input('恳请输出仿真顾客总数simtotal=');%仿真顾客总数;lambda=0.2;mu=0.25;
t_arrive=zeros(1,simtotal);t_leave=zeros(1,simtotal);arrivenum=zeros(1,simtotal);leavenum=zeros(1,simtotal);
interval_arrive=-log(rand(1,simtotal))/lambda;%抵达时间间隔interval_serve=-log(rand(1,simtotal))/mu;%服务时间t_arrive(1)=interval_arrive(1);%顾客抵达时间arrivenum(1)=1;fori=2:simtotal
t_arrive(i)=t_arrive(i-1)+interval_arrive(i);arrivenum(i)=i;end
t_leave(1)=t_arrive(1)+interval_serve(1);%顾客返回时间leavenum(1)=1;fori=2:simtotal
ift_leave(i-1)
t_leave(i)=t_arrive(i)+interval_serve(i);else
t_leave(i)=t_leave(i-1)+interval_serve(i);end
leavenum(i)=i;end
t_wait=t_leave-t_arrive;%各顾客在系统中的等待时间t_wait_avg=mean(t_wait);
t_queue=t_wait-interval_serve;%各顾客在系统中的排队时间t_queue_avg=mean(t_queue);
timepoint=[t_arrive,t_leave];%系统中顾客数随时间的变化timepoint=sort(timepoint);
arriveflag=zeros(size(timepoint));%抵达时间标志cusnum=zeros(size(timepoint));
temp=2;
cusnum(1)=1;
fori=2:length(timepoint)
if(temp
cusnum(i)=cusnum(i-1)-1;endend
%系统中平均值顾客数排序
time_interval=zeros(size(timepoint));time_interval(1)=t_arrive(1);fori=2:length(timepoint)
time_interval(i)=timepoint(i)-timepoint(i-1);end
cusnum_fromstart=[0cusnum];
cusnum_avg=sum(cusnum_fromstart.*[time_interval0])/timepoint(end);quelength=zeros(size(cusnum));fori=1:length(cusnum)ifcusnum(i)>=2
quelength(i)=cusnum(i)-1;else
quelength(i)=0;endend
quelength_avg=sum([0quelength].*[time_interval0])/timepoint(end);%系统平均等待队长%仿真图figure(1);
set(1,'position',[0,0,1000,700]);subplot(2,2,1);
title('各顾客到达时间和离去时间');
stairs([0arrivenum],[0t_arrive],'b');holdon;
stairs([0leavenum],[0t_leave],'y');legend('到达时间','离去时间');holdoff;
subplot(2,2,2);
stairs(timepoint,cusnum,'b')title('系统等待队长分布');xlabel('时间');ylabel('队长');