您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > matlab单服务台排队系统实验报告
matlab单服务台排队系统实验报告一、实验目的本次实验要求实现M/M/1单窗口无限排队系统的系统仿真,利用事件调度法实现离散事件系统仿真,并统计平均队列长度以及平均等待时间等值,以与理论分析结果进行对比。二、实验原理根据排队论的知识我们知道,排队系统的分类是根据该系统中的顾客到达模式、服务模式、服务员数量以及服务规则等因素决定的。1、顾客到达模式设到达过程是一个参数为的Poisson过程,则长度为t的时间内到达k个呼叫的概率服从Poisson分布,即etkkkttp!)()(,,2,1,0k,其中0为一常数,表示了平均到达率或Poisson呼叫流的强度。2、服务模式设每个呼叫的持续时间为i,服从参数为的负指数分布,即其分布函数为{}1,0tPXtet3、服务规则先进先服务的规则(FIFO)4、理论分析结果在该M/M/1系统中,设,则稳态时的平均等待队长为1Q,顾客的平均等待时间为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;fori=2:SimTotalt_Arrive(i)=t_Arrive(i-1)+Interval_Arrive(i);ArriveNum(i)=i;endt_Leave(1)=t_Arrive(1)+Interval_Serve(1);%顾客离开时间LeaveNum(1)=1;fori=2:SimTotalift_Leave(i-1)t_Arrive(i)t_Leave(i)=t_Arrive(i)+Interval_Serve(i);elset_Leave(i)=t_Leave(i-1)+Interval_Serve(i);endLeaveNum(i)=i;endt_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=length(t_Arrive))&&(Timepoint(i)==t_Arrive(temp))CusNum(i)=CusNum(i-1)+1;temp=temp+1;ArriveFlag(i)=1;elseCusNum(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);endCusNum_fromStart=[0CusNum];CusNum_avg=sum(CusNum_fromStart.*[Time_interval0])/Timepoint(end);QueLength=zeros(size(CusNum));fori=1:length(CusNum)ifCusNum(i)=2QueLength(i)=CusNum(i)-1;elseQueLength(i)=0;endendQueLength_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('队长');subplot(2,2,3);title('各顾客在系统中的排队时间和等待时间');stairs([0ArriveNum],[0t_Queue],'b');holdon;stairs([0LeaveNum],[0t_Wait],'y');holdoff;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_interval0])/Timepoint(end);%系统中平均顾客数计算QueLength_avg=sum([0QueLength].*[Time_interval0])/Timepoint(end);%系统平均等待队长2.算法的流程图六、仿真结果分析顾客的平均等待时间与顾客的平均等待队长,计算其方差如下:开始计算第1个顾客的离开时间:i-2输入仿真人数计算第i个顾客的等待时间、离开时间、标示位:i+1标志位置0:i=i+1系统是否接纳第i个顾客?仿真时间是否越界?结束输出结果仿真顾客总数=10000012345平均值方差平均等待时间2.0231.99711.99451.99612.00432.0030.000556360平均排队时间0.911470.88650.882930.884040.894950.891980.000563657平均顾客数0.81010.798460.793340.799580.804330.801160.000160911平均等待队长0.3650.354440.35120.354120.359150.356780.000116873678910理论值平均等待时间1.97382.00541.99111.99091.99272平均排队时间0.866120.890680.88320.875270.885030.88889中平均顾客数0.785450.80370.797970.791660.800240.8平均等待队长0.344650.356950.353950.348040.355420.35556仿真顾客总数=100000012345平均值方差平均等待时间2.00291.99751.99432.00192.01152.001620.000169888平均排队时间0.892090.886240.884940.8910.898730.89060.000119522平均顾客数0.801570.799550.797630.800130.805310.800840.000032986平均等待队长0.357020.354740.353940.356120.359820.356330.000020940678910理论值平均等待时间1.99911.99081.99652.00161.9962平均排队时间0.886230.881110.88490.889870.886520.88889平均顾客数0.798240.796210.798650.799430.797550.8平均等待队长0.353870.352390.353990.355410.354240.35556从上表可以看出,通过这种模型和方法仿真的结果和理论值十分接近,增加仿真顾客数时,可以得到更理想的结果。但由于变量定义的限制,在仿真时顾客总数超过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;方法生成负指数分布,运行正常。八、实验心得通过本次实验
本文标题:matlab单服务台排队系统实验报告
链接地址:https://www.777doc.com/doc-2887198 .html