matlab单服务台排队系统实验报告

matlab 单服务台排队系统实验报告

一、实验目的

本次实验要求实现M/M/1单窗口无限排队系统的系统仿真,利用事件调度法实现离散事件系统仿真,并统计平均队列长度以及平均等待时间等值,以与理论分析结果进行对比。

二、实验原理

根据排队论的知识我们知道,排队系统的分类是根据该系统中的顾客到达模式、服务模式、服务员数量以及服务规则等因素决定的。

1、 顾客到达模式

设到达过程是一个参数为λ的Poisson 过程,则长度为t 的时间内到达k 个呼

(λt ) k

p k (t ) =

k ! 叫的概率 服从Poisson 分布,即

e

-λt

,k =0, 1, 2, ⋅⋅⋅⋅⋅⋅⋅⋅⋅,其中λ>0为一

常数,表示了平均到达率或Poisson 呼叫流的强度。

2、 服务模式

设每个呼叫的持续时间为τi ,服从参数为μ的负指数分布,即其分布函数为

P {X

3、 服务规则

先进先服务的规则(FIFO ) 4、 理论分析结果

ρ=

在该M/M/1系统中,设的平均等待时间为

T =

λρλ

Q =

μ,则稳态时的平均等待队长为1-ρ,顾客

ρμ-λ。

三、实验内容

M/M/1排队系统:实现了当顾客到达分布服从负指数分布,系统服务时间也服

从负指数分布,单服务台系统,单队排队,按FIFO 方式服务。

四、采用的语言

MatLab 语言 源代码:

clear; clc;

%M/M/1排队系统仿真

SimTotal=input('请输入仿真顾客总数SimTotal='); %仿真顾客总数; Lambda=0.4; %到达率Lambda ; Mu=0.9; %服务率Mu ; 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; for i=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; for i=2:SimTotal

if t_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;

for i=2:length(Timepoint)

if (temp

CusNum(i)=CusNum(i-1)-1; end end

%系统中平均顾客数计算

Time_interval=zeros(size(Timepoint)); Time_interval(1)=t_Arrive(1); for i=2:length(Timepoint)

Time_interval(i)=Timepoint(i)-Timepoint(i-1); end

CusNum_fromStart=[0 CusNum];

CusNum_avg=sum(CusNum_fromStart.*[Time_interval 0] )/Timepoint(end);

QueLength=zeros(size(CusNum)); for i=1:length(CusNum) if CusNum(i)>=2

QueLength(i)=CusNum(i)-1; else

QueLength(i)=0; end end

QueLength_avg=sum([0 QueLength].*[Time_interval 0] )/Timepoint(end);%系统平均等待队长 %仿真图 figure(1);

set(1,'position',[0,0,1000,700]); subplot(2,2,1);

title('各顾客到达时间和离去时间'); stairs([0 ArriveNum],[0 t_Arrive],'b'); hold on;

stairs([0 LeaveNum],[0 t_Leave],'y'); legend('到达时间',' 离去时间'); hold off;

subplot(2,2,2);

stairs(Timepoint,CusNum,'b') title('系统等待队长分布'); xlabel('时间'); ylabel('队长');

subplot(2,2,3);

title('各顾客在系统中的排队时间和等待时间'); stairs([0 ArriveNum],[0 t_Queue],'b');

stairs([0 LeaveNum],[0 t_Wait],'y'); hold off;

legend('排队时间',' 等待时间');

%仿真值与理论值比较

disp(['理论平均等待时间t_Wait_avg=',num2str(1/(Mu-Lambda))]);

disp(['理论平均排队时间t_Wait_avg=',num2str(Lambda/(Mu*(Mu-Lambda)))]); disp(['理论系统中平均顾客数=',num2str(Lambda/(Mu-Lambda))]);

disp(['理论系统中平均等待队长=',num2str(Lambda*Lambda/(Mu*(Mu-Lambda)))]);

disp(['仿真平均等待时间t_Wait_avg=',num2str(t_Wait_avg)]) disp(['仿真平均排队时间t_Queue_avg=',num2str(t_Queue_avg)]) disp(['仿真系统中平均顾客数=',num2str(CusNum_avg)]); disp(['仿真系统中平均等待队长=',num2str(QueLength_avg)]);

五、数据结构

1. 仿真设计算法(主要函数)

利用负指数分布与泊松过程的关系,产生符合泊松过程的顾客流,产生符合负指数分布的随机变量作为每个顾客的服务时间:

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_interval 0] )/Timepoint(end); %系统中平均顾客数计算

QueLength_avg=sum([0 QueLength].*[Time_interval 0] )/Timepoint(end); %系统平均等待队长

2. 算法的流程图

六、仿真结果分析

顾客的平均等待时间与顾客的平均等待队长,计算其方差如下:

从上表可以看出,通过这种模型和方法仿真的结果和理论值十分接近,增加仿真顾客数时,可以得到更理想的结果。但由于变量定义的限制,在仿真时顾客总数超过1,500,000时会溢出。证明使此静态仿真的思想对排队系统进行仿真是切实可行的。

实验结果截图如下(SimTotal 分别为100、1000、10000、100000):

(仿真顾客总数为100000和1000000时,其图像与10000的区别很小)

七、遇到的问题及解决方法

1. 在算法设计阶段对计算平均队长时对应的时间段不够清楚,重新画出状态转移图后,引入变量Timepoint 用来返回按时间排序的到达和离开的时间点,从而得到正确的时间间隔内的CusNum, 并由此计算出平均队长。

2. 在刚开始进行仿真时仿真顾客数设置较小,得到的仿真结果与理论值相差巨大,进行改进后,得到的结果与理论值相差不大。

3. 刚开始使用exprnd(Mu,m)产生负指数分布,但运行时报错,上网查找资料后找到替代方法:改成Interval_Serve=-log(rand(1,SimTotal))/Mu;方法生成负指数分布,运行正常。

八、实验心得

通过本次实验我对M/M/1单窗口无限排队系统有了更深的认识,同时对MatLab 编程语言更加熟悉,并了解到仿真在通信网中的重要作用。此次实验我受益匪浅。

matlab 单服务台排队系统实验报告

一、实验目的

本次实验要求实现M/M/1单窗口无限排队系统的系统仿真,利用事件调度法实现离散事件系统仿真,并统计平均队列长度以及平均等待时间等值,以与理论分析结果进行对比。

二、实验原理

根据排队论的知识我们知道,排队系统的分类是根据该系统中的顾客到达模式、服务模式、服务员数量以及服务规则等因素决定的。

1、 顾客到达模式

设到达过程是一个参数为λ的Poisson 过程,则长度为t 的时间内到达k 个呼

(λt ) k

p k (t ) =

k ! 叫的概率 服从Poisson 分布,即

e

-λt

,k =0, 1, 2, ⋅⋅⋅⋅⋅⋅⋅⋅⋅,其中λ>0为一

常数,表示了平均到达率或Poisson 呼叫流的强度。

2、 服务模式

设每个呼叫的持续时间为τi ,服从参数为μ的负指数分布,即其分布函数为

P {X

3、 服务规则

先进先服务的规则(FIFO ) 4、 理论分析结果

ρ=

在该M/M/1系统中,设的平均等待时间为

T =

λρλ

Q =

μ,则稳态时的平均等待队长为1-ρ,顾客

ρμ-λ。

三、实验内容

M/M/1排队系统:实现了当顾客到达分布服从负指数分布,系统服务时间也服

从负指数分布,单服务台系统,单队排队,按FIFO 方式服务。

四、采用的语言

MatLab 语言 源代码:

clear; clc;

%M/M/1排队系统仿真

SimTotal=input('请输入仿真顾客总数SimTotal='); %仿真顾客总数; Lambda=0.4; %到达率Lambda ; Mu=0.9; %服务率Mu ; 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; for i=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; for i=2:SimTotal

if t_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;

for i=2:length(Timepoint)

if (temp

CusNum(i)=CusNum(i-1)-1; end end

%系统中平均顾客数计算

Time_interval=zeros(size(Timepoint)); Time_interval(1)=t_Arrive(1); for i=2:length(Timepoint)

Time_interval(i)=Timepoint(i)-Timepoint(i-1); end

CusNum_fromStart=[0 CusNum];

CusNum_avg=sum(CusNum_fromStart.*[Time_interval 0] )/Timepoint(end);

QueLength=zeros(size(CusNum)); for i=1:length(CusNum) if CusNum(i)>=2

QueLength(i)=CusNum(i)-1; else

QueLength(i)=0; end end

QueLength_avg=sum([0 QueLength].*[Time_interval 0] )/Timepoint(end);%系统平均等待队长 %仿真图 figure(1);

set(1,'position',[0,0,1000,700]); subplot(2,2,1);

title('各顾客到达时间和离去时间'); stairs([0 ArriveNum],[0 t_Arrive],'b'); hold on;

stairs([0 LeaveNum],[0 t_Leave],'y'); legend('到达时间',' 离去时间'); hold off;

subplot(2,2,2);

stairs(Timepoint,CusNum,'b') title('系统等待队长分布'); xlabel('时间'); ylabel('队长');

subplot(2,2,3);

title('各顾客在系统中的排队时间和等待时间'); stairs([0 ArriveNum],[0 t_Queue],'b');

stairs([0 LeaveNum],[0 t_Wait],'y'); hold off;

legend('排队时间',' 等待时间');

%仿真值与理论值比较

disp(['理论平均等待时间t_Wait_avg=',num2str(1/(Mu-Lambda))]);

disp(['理论平均排队时间t_Wait_avg=',num2str(Lambda/(Mu*(Mu-Lambda)))]); disp(['理论系统中平均顾客数=',num2str(Lambda/(Mu-Lambda))]);

disp(['理论系统中平均等待队长=',num2str(Lambda*Lambda/(Mu*(Mu-Lambda)))]);

disp(['仿真平均等待时间t_Wait_avg=',num2str(t_Wait_avg)]) disp(['仿真平均排队时间t_Queue_avg=',num2str(t_Queue_avg)]) disp(['仿真系统中平均顾客数=',num2str(CusNum_avg)]); disp(['仿真系统中平均等待队长=',num2str(QueLength_avg)]);

五、数据结构

1. 仿真设计算法(主要函数)

利用负指数分布与泊松过程的关系,产生符合泊松过程的顾客流,产生符合负指数分布的随机变量作为每个顾客的服务时间:

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_interval 0] )/Timepoint(end); %系统中平均顾客数计算

QueLength_avg=sum([0 QueLength].*[Time_interval 0] )/Timepoint(end); %系统平均等待队长

2. 算法的流程图

六、仿真结果分析

顾客的平均等待时间与顾客的平均等待队长,计算其方差如下:

从上表可以看出,通过这种模型和方法仿真的结果和理论值十分接近,增加仿真顾客数时,可以得到更理想的结果。但由于变量定义的限制,在仿真时顾客总数超过1,500,000时会溢出。证明使此静态仿真的思想对排队系统进行仿真是切实可行的。

实验结果截图如下(SimTotal 分别为100、1000、10000、100000):

(仿真顾客总数为100000和1000000时,其图像与10000的区别很小)

七、遇到的问题及解决方法

1. 在算法设计阶段对计算平均队长时对应的时间段不够清楚,重新画出状态转移图后,引入变量Timepoint 用来返回按时间排序的到达和离开的时间点,从而得到正确的时间间隔内的CusNum, 并由此计算出平均队长。

2. 在刚开始进行仿真时仿真顾客数设置较小,得到的仿真结果与理论值相差巨大,进行改进后,得到的结果与理论值相差不大。

3. 刚开始使用exprnd(Mu,m)产生负指数分布,但运行时报错,上网查找资料后找到替代方法:改成Interval_Serve=-log(rand(1,SimTotal))/Mu;方法生成负指数分布,运行正常。

八、实验心得

通过本次实验我对M/M/1单窗口无限排队系统有了更深的认识,同时对MatLab 编程语言更加熟悉,并了解到仿真在通信网中的重要作用。此次实验我受益匪浅。


相关内容

  • 基于MATLAB排队论模型的探究概述
  • 基于Matlab的排队论模型的探究 排队是日常生活和工作中常见的现象,根据对象的不同,基本可以分为两种.一种是人的排队,例如:上下班坐公共汽车,等待公共汽车的排队:顾客到商店形成的排队:病人到医院看病形成的排队:往售票处购票形成的排队等:而另一种是物的排队,例如文件等待处理的排队:十字路口,红灯下等 ...

  • 到达车辆信号交叉路口的Markov链排队模型
  • 第45卷第4期2010年8月 西南交通大学学报 JOURNALOFSOUTHWESTJIAOTONGUNIVERSnY DOI:10.3969/j.issn.0258-2724.2010.04.023 V01.45 No.4 Aug.2010 文章编号:0258-2724(2010)04-0621- ...

  • 排队论在汽车修理问题中的应用
  • 本文以某汽车维修点数据为样本采用排队论模型,得出其工作台的利用率.汽车需排队候修的可能性以及等待修理与正在修理的汽车数,给出维修点提高效益的建议. 排队论:利用率:泊松流 [中图分类号]O226;F273;TB114.1 [文献标识码]A [文章编号]1009-9646(2012)7-0039-01 ...

  • 体检中的排队论1
  • 体检中的排队论 摘要 一个好的体检排队方案不仅可以提高体检中心的体检效率和仪器的使用率,还可为体检者节约时间和费用.本文利用数学建模的方法,根据排队论知识建立体检中心排队系统的数学模型,通过MATLAB软件求解. 对于问题一.二 对一个新来的顾客要体检,他通过取票进队.排队等待.叫号服务等功能,通过 ...

  • 计算机模拟在数学建模中的应用
  • 第 22 卷第 1 期 海南大学学报自然科学版 Vol . 22 No . 1 文章编号:1004 - 1729 (2004) 01 - 0089 - 07 计算机模拟在数学建模中的应用 欧宜贵 , 李志林 , 洪世煌 (海南大学信息科学技术学院 , 海南海口 570228) 摘 要: 阐述了计算机 ...

  • 机械控制工程基础实验课实验报告
  • 试验一数学模型的Matlab描述 一.实验目的 ①掌握Malab中数学模型的三种表现形式 ②掌握三种模型之间的转换方法 ③掌握复杂传递函数的求取方法 ④了解复杂系统表现形式及建模方法 二.实验要求 ①在Matlab中实现三种数学模型的描述 ②实现三种数学模型之间的转换 ③写出试验报告 三.实验内容 ...

  • 最优投资组合实验
  • <证券投资分析>上机实验 上机实验要求: 第6,8,10,12周星期三1,2节实验课,共分为四项上机实验项目,上机完成实验内容: 具体内容与步骤: (一)数据收集:3-5项股票的价格,上证指数(至少1年时间跨度),K线图,上市公司财务数据 中国股市股票组合的适宜规模为5-10种股票 为了 ...

  • 信号与系统实验报告
  • 本科生实验报告 实验课程 信号与系统 学院名称 信息科学与技术学院 专业名称 信息工程 学生姓名 杨海洋 学生学号 [1**********]1 指导教师 杨斯涵 实验地点 6A502 实验成绩 二〇一四年11月二〇一四年12月 实验一 MATLAB 编程初步应用及产生典型信号 一.实验目的及要求: ...

  • 2013国赛优秀数模论文
  • 车道被占用对城市道路通行能力的影响 摘 要 本文主要研究交通事故占用车道对城市道路通行能力的影响. 针对问题一,首先求出道路的基本通行能力,结合道路基本通行能力与定义的交通事故修正系数求得出事故发生后的实际通行能力. 用SPSS 软件采用Mann-Whitney U检验方法对事故发生前的实际通行能力 ...