logo资料库

M/M/1排队系统实验报告.doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
M/M/1 排队系统实验报告 一、实验目的 本次实验要求实现 M/M/1 单窗口无限排队系统的系统仿真,利用事件调度 法实现离散事件系统仿真,并统计平均队列长度以及平均等待时间等值,以与理 论分析结果进行对比。 二、实验原理 根据排队论的知识我们知道,排队系统的分类是根据该系统中的顾客到达模 式、服务模式、服务员数量以及服务规则等因素决定的。 1、 顾客到达模式 设到达过程是一个参数为的 Poisson 过程,则长度为t 的时间内到达 k 个呼 叫的概率 服从 Poisson 分布,即 常数,表示了平均到达率或 Poisson 呼叫流的强度。 , k  ,2,1,0  ,其中>0 为一 )( tp k  k ( ) t   e t ! k 2、 服务模式 设每个呼叫的持续时间为 i ,服从参数为的负指数分布,即其分布函数为 { P X t  t e  0 } 1   , t 3、 服务规则 先进先服务的规则(FIFO) 4、 理论分析结果     Q   ,则稳态时的平均等待队长为 1   ,顾客 在该 M/M/1 系统中,设 的平均等待时间为 T    。   三、实验内容 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)
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;% 到 达 时 间 间 隔 , 结 果 与 调 用 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 个顾客的离开 时间:i-2 系统是否接纳第 i 个顾客? 计算第 i 个顾客的等待时间、离 开时间、标示位: i+1 标志位置 0:i=i+1 仿真时间是否越 界? 输出结果 结束 六、仿真结果分析 顾客的平均等待时间与顾客的平均等待队长,计算其方差如下:
从上表可以看出,通过这种模型和方法仿真的结果和理论值十分接近,增加 仿真顾客数时,可以得到更理想的结果。但由于变量定义的限制,在仿真时顾客 总数超过 1,500,000 时会溢出。证明使此静态仿真的思想对排队系统进行仿真是 切实可行的。 实验结果截图如下(SimTotal 分别为 100、1000、10000、100000):
分享到:
收藏