MM1排队系统仿真matlab试验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
M/M/1排队系统实验报告
一、实验目的
本次实验要求实现M/M/1单窗口无限排队系统的系统仿真,利用事件调度法实现离散事件系统仿真,并统计平均队列长度以及平均等待时间等值,以与理论分析结果进行对比。
二、实验原理
根据排队论的知识我们知道,排队系统的分类是根据该系统中的顾客到达模式、服务模式、服务员数量以及服务规则等因素决定的。
1、顾客到达模式
设到达过程是一个参数为入的Poisson过程,则长度为t的时间内到达k个呼
p (t)=(入“ e 4
叫的概率服从Poisson分布,即k k!,k = 01,2, .. ,其中入>0为一
常数,表示了平均到达率或Poisson呼叫流的强度。
2、服务模式
设每个呼叫的持续时间为二,服从参数为N的负指数分布,即其分布函数为P{ X < t } = 1 - e-k t > 0
3、服务规则
先进先服务的规则(FIFO)
4、理论分析结果
入
P = Q = -2—在该M/M/1系统中,设口,则稳态时的平均等待队长为Q 1-P,顾客
上乙T T T T =
的平均等待时间为N-九。
三、实验内容
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_Arrive(i)
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));% 至 U达时间标志
CusNum=zeros(size(Timepoint));
temp=2;
CusNum(1)=1;
for i=2:length(Timepoint)
if (temp<=length(t_Arrive))&&(Timepoint(i)==t_Arrive(temp)) CusNum(i)=CusNum(i-
1)+1;
temp=temp+1;
ArriveFlag(i)=1;
else
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');
hold on;
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;% 至U 达时间间隔,结果与调用exprnd(1/Lambda, m)函数产生的结果相同
Interval_Serve=-log(rand(1,SimTotal))/Mu;% 服务时间间隔
七_A「后8(1)=加七8~31_八「用8(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.算法的流程图
六、仿真结果分析
顾客的平均等待时间与顾客的平均等待队长,计算其方差如下:
仿真顾客总数
=100000 1 2 3 4 5 平均值方差
平均等待时间 2.023 1.9971 1.9945 1.9961 2.0043 2.003 0.000556360
平均排队时间0.91147 0.8865 0.88293 0.88404 0.89495 0.89198 0.000563657
平均顾客数0.8101 0.79846 0.79334 0.79958 0.80433 0.80116 0.000160911
平均等待队长0.365 0.35444 0.3512 0.35412 0.35915 0.35678 0.000116873
6 7 8 9 10 理论值
平均等待时间 1.9738 2.0054 1.9911 1.9909 1.9927 2
平均排队时间0.86612 0.89068 0.8832 0.87527 0.88503 0.88889
中平均顾客数0.78545 0.8037 0.79797 0.79166 0.80024 0.8
平均等待队长0.34465 0.35695 0.35395 0.34804 0.35542 0.35556
仿真顾客总数
=1000000 1 2 3 4 5 平均值方差
平均等待时间 2.0029 1.9975 1.9943 2.0019 2.0115 2.00162 0.000169888
平均排队时间0.89209 0.88624 0.88494 0.891 0.89873 0.8906 0.000119522
平均顾客数0.80157 0.79955 0.79763 0.80013 0.80531 0.80084 0.000032986
平均等待队长0.35702 0.35474 0.35394 0.35612 0.35982 0.35633 0.000020940
6 7 8 9 10 理论值
平均等待时间 1.9991 1.9908 1.9965 2.0016 1.996 2
平均排队时间0.88623 0.88111 0.8849 0.88987 0.88652 0.88889
平均顾客数0.79824 0.79621 0.79865 0.79943 0.79755 0.8
平均等待队长0.35387 0.35239 0.35399 0.35541 0.35424 0.35556
从上表可以看出,通过这种模型和方法仿真的结果和理论值十分接近,增加仿真顾客数时,可以得到更理想的结果。
但由于变量定义的限制,在仿真时顾客总数超过1,500,000时会溢出。
证明使此静态仿真的思想对排队系统进行仿真是切实可行的。
实验结果截图如下(SimTotal分别为100、1000、10000、100000):
W ••«• «WW • . • W>nZ 〜L •*
(仿真顾客总数为100000和1000000时,其图像与10000的区别很小)
Command Window
请输入仿真顾客总数SimTtrt al=100000 理论平均等待时间t_Vait_avg=2
理论平均排队时间t_Wait_avg=。
. 88889 理论系统中平均顾客数二0. 8 理论系统中平均等待队长=口. 35556 仿真平均等待时间t_Wa 【t_avg=2. 0027 仿真平均排队时间t_queujavg=Q. 89572 仿真系统中平均顾客数二口. 8口449 仿真系统中平均等待队长=Q. 35982 fx » |
Command Window
请输入仿真顾客总数SimT 口 tal=lQQ 口口
QQ 理论平均等待时间t_Vait_avg=2
理论平均排队时间t_Vait_avg=Q. 88839 理论系统中平均顾客数=0. 8 理论系统中平均等待队长=Q. 35556 仿真平均等待时间t _孤五_皿肝20027 仿真平均排队时间t_queue_avg=Q. 89088 仿真系统中平均顾客数=口.眈114 仿真系统中平均等待队法=口. 35639
A »I
七、遇到的问题及解决方法
1 .在算法设计阶段对计算平均队长时对应的时间段不够清楚,重新画出状态 转移图后,引入变量Timepoint 用来返回按时间排序的到达和离开的时间点,从 而得到正确的时间间隔内的CusNum,并由此计算出平均队长。
2 .在刚开始进行仿真时仿真顾客数设置较小,得到的仿真结果与理论值相差 巨大,进行改进后,得到的结果与理论值相差不大。
3 .刚开始使用exprnd(Mu,m)产生负指数分布,但运行时报错,上网查找资料 后找到替代方法:改成Interval_Serve=-log(rand(1,SimTotal))/Mu;方法生成负指数 分布,运行正常。
排队时间 等待时间
请输入仿真顾客总数SimTot al=10000 理
诒平均等待时间t_Wait_avg=2
理论平均排队时间t_Wait_avg= 口. 88889 理论系统中平均顾客数=口. 8 理诒系统中平均等待队长=Q. 35556 仿真平均等待时间t_¥ait_avg=l. 9585 仿真平均排队时间t_queujavg=。
. 8531 仿真系统中平均顾客数=口. 78524 仿真系统中平均等待队长=Q. 34204 »
到达时间
离去时间
Command Window
八、实验心得
通过本次实验我对M/M/1单窗口无限排队系统有了更深的认识,同时对MatLab 编程语言更加熟悉,并了解到仿真在通信网中的重要作用。
此次实验我受益匪浅。