计算机仿真排队系统实验报告(附代码)

合集下载

MM1排队系统仿真matlab实验报告

MM1排队系统仿真matlab实验报告

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

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

1、 顾客到达模式设到达过程是一个参数为λ的Poisson 过程,则长度为t 的时间内到达k 个呼叫的概率 服从Poisson 分布,即e t kk k t t p λλ-=!)()(,⋅⋅⋅⋅⋅⋅⋅⋅⋅=,2,1,0k ,其中λ>0为一常数,表示了平均到达率或Poisson 呼叫流的强度。

2、 服务模式设每个呼叫的持续时间为i τ,服从参数为μ的负指数分布,即其分布函数为{}1,0t P X t e t μ-<=-≥3、 服务规则先进先服务的规则(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;for i=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;for i=2:SimTotalif t_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;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;CusNum(i)=CusNum(i-1)-1;endend%系统中平均顾客数计算Time_interval=zeros(size(Timepoint));Time_interval(1)=t_Arrive(1);for i=2:length(Timepoint)Time_interval(i)=Timepoint(i)-Timepoint(i-1);endCusNum_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)>=2QueLength(i)=CusNum(i)-1;elseQueLength(i)=0;endendQueLength_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; %各顾客在系统中的排队时间由事件来触发仿真时钟的不断推进。

排队系统仿真matlab实验报告

排队系统仿真matlab实验报告

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

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

1、 顾客到达模式设到达过程是一个参数为λ的Poisson 过程,则长度为t 的时间内到达k 个呼叫的概率 服从Poisson 分布,即e t kk k t t p λλ-=!)()(,⋅⋅⋅⋅⋅⋅⋅⋅⋅=,2,1,0k ,其中λ>0为一常数,表示了平均到达率或Poisson 呼叫流的强度。

2、 服务模式设每个呼叫的持续时间为i τ,服从参数为μ的负指数分布,即其分布函数为{}1,0t P X t e t μ-<=-≥3、 服务规则先进先服务的规则(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;for i=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;for i=2:SimTotalif t_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;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;elseCusNum(i)=CusNum(i-1)-1;endend%系统中平均顾客数计算Time_interval=zeros(size(Timepoint));Time_interval(1)=t_Arrive(1);for i=2:length(Timepoint)Time_interval(i)=Timepoint(i)-Timepoint(i-1);endCusNum_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)>=2QueLength(i)=CusNum(i)-1;elseQueLength(i)=0;endendQueLength_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; %各顾客在系统中的排队时间由事件来触发仿真时钟的不断推进。

排队模拟实验C++语言代码

排队模拟实验C++语言代码

void CMy1Dlg::OnOK(){// TODO: Add extra validation hereUpdateData(TRUE);if (m_num<1&&m_num>6){AfxMessageBox("请输入1到5的数字!");return;}int T=m_num;UpdateData(false);ofstream file;file.open("新建.txt",ios::out);if(!file){cout<<"新建.txt can't open"<<endl;abort();}int i=1,X=0,D=0,zj=0,xhcs=0;file<<" 排队过程的模拟表"<<endl;file<<"-----------------------------------------------------------"<<endl;file<<" 随机数"<<" 到达数"<<" 需要卸货车数"<<" 卸货车数"<<" 推迟卸货车数"<<endl;srand(GetTickCount());while(i!=1000){int ran=rand()%10000;file<<setw(6)<<ran;if (ran<2300)X=0;else if(ran>=2300&&ran<5300)X=1;else if(ran>=5300&&ran<8300)X=2;else if(ran>=8300&&ran<9300)X=3;else if(ran>=9300&&ran<9700)X=4;elseX=5;file<<setw(6)<<X;int R;//R为需要卸货,D为推迟卸货,X为到达R=X+D;file<<setw(12)<<R;if (R<=T){file<<setw(12)<<R;D=0;}else{file<<setw(12)<<T;D=R-T;}file<<setw(12)<<D<<endl;zj+=X;if(D!=0)xhcs+=1;i++;}file<<"总计:"<<zj<<" "<<xhcs<<endl;file.close();fstream ifile("新建.txt",ios::in);MessageBox("请看文件<新建.txt>查看结果!");CDialog::OnOK();}。

实验2单服务台单队列排队系统仿真

实验2单服务台单队列排队系统仿真

实验2排队系统仿真一、学习目的1.了解仿真的特点2.学习如何建构模型3.熟悉eM-Plant基本的对象和操作4.掌握排队系统的特点与仿真的实现方法二、问题描述该银行服务窗口为每个到达的顾客服务的时间是随机的,表2.4是顾客服务时间纪录的统计结果表2.4 每个顾客服务时间的概率分布对于上述这样一个单服务待排队系统,仿真分析30天,分析该系统中顾客的到达、等待和被服务情况,以及银行工作人员的服务和空闲情况。

三、系统建模3.1 仿真目标通过对银行排队系统的仿真,研究银行系统的服务水平和改善银行服务水平的方法,为银行提高顾客满意度,优化顾客服务流程服务。

3.2.系统建模3.2.1 系统调研1. 系统结构: 银行服务大厅的布局, 涉及的服务设备2. 系统的工艺参数: 到达-取号-等待-服务-离开3. 系统的动态参数: 顾客的到达时间间隔, 工作人员的服务时间4. 逻辑参数: 排队规则, 先到先服务5. 系统的状态参数: 排队队列是否为空, 如果不为空队长是多少, 服务台是否为空6. 系统的输入输出变量:输入变量确定其分布和特征值,顾客的到达时间间隔的概率分布表和每个顾客被服务时间的概率分布. 输出变量根据仿真目标设定. 包括队列的平均队长、最大队长、仿真结束时队长、总服务人员、每个顾客的平均服务时间、顾客平均排队等待服务时间、业务员利用率等。

3.2.2系统假设1.取号机前无排队,取号时间为02.顾客排队符合先进先出的排队规则3.一个服务台一次只能对一个顾客服务4.所有顾客只有一种单一服务5.仿真时间为1个工作日(8小时)6.等候区的长度为无限长3.2.3系统建模系统模型:3.2.4 仿真模型1.实体:银行系统中的实体是人(主动体)2.属性:到达时间间隔、接受服务的时间、接受服务类型3.事件:顾客到达、开始取号、取号结束、进入队列、出队列、接受服务、服务完成、离开银行。

4.活动:到达、取号、排队、服务、离开5.资源:取号机、排队的座椅、服务柜台4 系统仿真4.1 eM-plant 界面与主要控件介绍1. 实体:eM-Plant 中包括3类实体:entity ,container ,transporter 。

银行排队系统实验报告

银行排队系统实验报告

一、实验目的1. 熟悉银行排队系统的基本原理和设计方法;2. 掌握使用C语言实现银行排队系统的基本操作;3. 培养团队合作精神和实践能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发工具:Visual Studio三、实验内容1. 银行排队系统简介银行排队系统是一种模拟真实银行排队场景的程序,主要功能包括:客户到达、排队、服务、离开等。

通过模拟银行排队过程,我们可以了解银行排队系统的基本原理,并为实际应用提供参考。

2. 系统设计(1)数据结构本系统采用队列数据结构来存储排队客户。

队列是一种先进先出(FIFO)的数据结构,适用于模拟银行排队场景。

(2)功能模块本系统主要包括以下功能模块:1)客户到达模块:模拟客户到达银行,并随机生成客户信息,如客户ID、到达时间、服务时间等;2)排队模块:根据客户到达顺序,将客户信息依次加入队列;3)服务模块:按照客户排队顺序,为每位客户提供服务,并更新客户状态;4)离开模块:客户服务完成后,从队列中移除该客户信息;5)统计模块:记录客户服务次数、平均等待时间、最长等待时间等数据。

(3)实现方法1)客户到达模块:使用随机数生成器生成客户信息,并将客户信息存入队列;2)排队模块:当客户到达时,将客户信息加入队列尾部;3)服务模块:从队列头部取出客户信息,为该客户提供服务,并更新客户状态;4)离开模块:当客户服务完成后,从队列中移除该客户信息;5)统计模块:记录客户服务次数、平均等待时间、最长等待时间等数据。

3. 实验步骤(1)初始化系统,设置窗口数量和客户到达时间间隔;(2)模拟客户到达,生成客户信息并加入队列;(3)按照客户到达顺序,为每位客户提供服务;(4)记录客户服务次数、平均等待时间、最长等待时间等数据;(5)统计实验结果,分析银行排队系统性能。

四、实验结果与分析1. 实验结果通过实验,我们得到了以下数据:(1)客户服务次数:100次;(2)平均等待时间:5分钟;(3)最长等待时间:15分钟。

排队系统仿真

排队系统仿真

排队系统仿真学院:___浙江科技学院____专业班级:_______工业工程____姓名:____廖汉杰__________学号:____________________指导老师:___________________年月日目录一、实验名称 (3)二、实验目的 (3)三、实验内容 (3)四、仪器设备 (3)五、实验步骤 (4)1.添加控件 (4)2.设置发生器的参数 (4)3、设置处理器的参数 (4)4、模拟仿真模型 (5)5、统计数据 (5)六、方案改进 (6)一、实验名称排队系统仿真实验二、实验目的学习Flexsim仿真软件的基本用法并建立一个简单的排队模型;学习如何使用拉式逻辑,根据临时实体类型来定义临时实体的流程路径;学习统计数据的收集、分析与比较。

三、实验内容有两种类型的顾客,分别为类型1和类型2。

顾客到达的时间间隔服从指数分布exponential(0,10,1)。

两种类型的顾客随机的均匀到达。

有2个服务台为类型1的顾客提供服务,有3个服务台为类型2的顾客提供服务,顾客将首先到空闲可用的服务台接受服务。

类型1的顾客接受服务的时间服从(40,8)的正态分布,类型2的顾客接受服务的时间服从(60,12)的正态分布。

顾客接受完服务后离开系统。

以上时间单位皆为分钟。

对上述系统进行建模,仿真系统一天12小时的运行状况,收集各服务台的利用率、顾客的平均等待时间等数据,提出服务设施的改进建议,使得顾客的平均等待时间不超过30分钟。

四、仪器设备计算机、Flexsim仿真软件五、实验步骤1.添加控件首先flexsim仿真软件,软件,1个发生器,1个暂存区,5个处理器,1个吸收器,并连接各个实体控件。

如图1-1所示图1-12. 设置发生器的参数<1>到达时间间隔设置<2>发生触发器离开出发设置3、设置处理器的参数<1>定义发生器Processor1、Processor2为类型1的顾客提供服务,并设置其参数处理时间设置临时实体流设置<2>定义发生器Processor3、Processor4、Processor5为类型2的顾客提供服务,并设置其参数临时实体流设置4、模拟仿真模型先打开实验控制器按钮,设置系统仿真时间720分钟,再编译,然后运行,如图所示图5-15、统计数据P1P3P2P4P5六、方案改进1、分别增加一个类型1,类型2的处理器,连接控件,如图5-1所示图5-12、设置Processor6的设置如类型1的参数,设置Processor7的设置如类型2的参数3、运行模型,统计其数据P6P1P2P3P4P5P7。

MM1排队系统仿真matlab实验报告

MM1排队系统仿真matlab实验报告

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

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

1、 顾客到达模式设到达过程是一个参数为λ的Poisson 过程,则长度为t 的时间内到达k 个呼叫的概率 服从Poisson 分布,即etkk k t t p λλ-=!)()(,⋅⋅⋅⋅⋅⋅⋅⋅⋅=,2,1,0k ,其中λ>0为一常数,表示了平均到达率或Poisson 呼叫流的强度。

2、 服务模式设每个呼叫的持续时间为i τ,服从参数为μ的负指数分布,即其分布函数为{}1,0t P X t e t μ-<=-≥3、 服务规则先进先服务的规则(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;for i=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;for i=2:SimTotalif t_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;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;CusNum(i)=CusNum(i-1)-1;endend%系统中平均顾客数计算Time_interval=zeros(size(Timepoint));Time_interval(1)=t_Arrive(1);for i=2:length(Timepoint)Time_interval(i)=Timepoint(i)-Timepoint(i-1);endCusNum_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)>=2QueLength(i)=CusNum(i)-1;elseQueLength(i)=0;endendQueLength_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; %各顾客在系统中的排队时间由事件来触发仿真时钟的不断推进。

用Matlab实现排队过程的仿真

用Matlab实现排队过程的仿真

用Matlab实现排队过程的仿真一、引言排队是日常生活中经常遇到的现象。

通常,当人、物体或是信息的到达速率大于完成服务的速率时,即出现排队现象。

排队越长,意味着浪费的时间越多,系统的效率也越低。

在日常生活中,经常遇到排队现象,如开车上班、在超市等待结账、工厂中等待加工的工件以及待修的机器等。

总之,排队现象是随处可见的。

排队理论是运作管理中最重要的领域之一,它是计划、工作设计、存货控制及其他一些问题的基础。

Matlab 是MathWorks 公司开发的科学计算软件,它以其强大的计算和绘图功能、大量稳定可靠的算法库、简洁高效的编程语言以及庞大的用户群成为数学计算工具方面的标准,几乎所有的工程计算领域,Matlab 都有相应的软件工具箱。

选用 Matlab 软件正是基于 Matlab 的诸多优点。

二、排队模型三.仿真算法原理( 1 )顾客信息初始化根据到达率λ和服务率µ来确定每个顾客的到达时间间隔和服务时间间隔。

服务间隔时间可以用负指数分布函数 exprnd() 来生成。

由于泊松过程的时间间隔也服从负指数分布,故亦可由此函数生成顾客到达时间间隔。

需要注意的是 exprnd() 的输入参数不是到达率λ和服务率µ而是平均到达时间间隔 1/ λ和平均服务时间 1/ µ。

根据到达时间间隔,确定每个顾客的到达时刻 . 学习过 C 语言的人习惯于使用 FOR 循环来实现数值的累加,但 FOR 循环会引起运算复杂度的增加而在 MATLAB 仿真环境中,提供了一个方便的函数 cumsum() 来实现累加功能读者可以直接引用对当前顾客进行初始化。

第 1 个到达系统的顾客不需要等待就可以直接接受服务其离开时刻等于到达时刻与服务时间之和。

( 2 )进队出队仿真在当前顾客到达时刻,根据系统内已有的顾客数来确定是否接纳该顾客。

若接纳则根据前一顾客的离开时刻来确定当前顾客的等待时间、离开时间和标志位;若拒绝,则标志位置为 0。

单服务台排队系统仿真报告

单服务台排队系统仿真报告

单服务台排队系统仿真报告一、模型准备1、 顾客到达特性在该系统中,顾客的到达规模(成批到达还是单个到达)是单个到达,假设顾客到达率Ai 服从均值为 的指数分布,即2、 顾客服务时间顾客服务时间为Si ,服从指数分布,假设均值为,即二、 仿真模型设计1、 元素定义(Define )本系统的元素定义如表1所示。

2、 元素可视化设置(Display )本系统中各个元素的显示特征定义设置如图2所示:m in 5=A βAs Ae Af ββ/)(-=)0(≥A min 4=s βSA Se Sf ββ/)(-=)0(≥S图2 各元素的显示特征(1)Part元素可视化设置在元素选择窗口选择customer元素,鼠标右键点击Display,跳出Display 对话框(图3),设置它的Text(图4)、Icon(图5)。

图3 Display对话框图4 Display Text对话框图5 Display Icon对话框(2)Buffer元素可视化设置在元素选择窗口选择paidui元素,鼠标右键点击Display,跳出Display对话框(图3),设置它的Text、Icon、Rectangle(图6)。

图6 Display Rectangle对话框(3)Machine元素可视化设置在元素选择窗口选择Fuwuyuan元素,鼠标右键点击Display,跳出Display 对话框(图3),设置它的Text、Icon、Part Queue(图7)。

图7 Display Part Queue对话框(4)Variable元素可视化设置在元素选择窗口选择Jifen0元素,鼠标右键点击Display,跳出Display对话框(图3),设置它的Text 、Value(图8)。

图8 Display Value对话框(5)Timeseries元素可视化设置在元素选择窗口选择duichang元素,鼠标右键点击Display,跳出Display 对话框(图3),设置它的Text、Timeseries(图9)。

排队系统实验报告

排队系统实验报告

1. 理解排队理论的基本概念和原理。

2. 掌握排队系统模型的建立和求解方法。

3. 分析不同排队系统参数对排队性能的影响。

4. 利用排队理论解决实际排队问题。

二、实验内容1. 排队系统模型的选择本实验选取了单服务器排队系统作为研究对象,该系统由一个服务器、无限个到达顾客和有限个等待位置组成。

2. 排队系统参数的设定根据实验需求,设定以下参数:- 到达顾客的到达率为λ(单位时间内到达的顾客数);- 服务器的服务率为μ(单位时间内服务器可以服务的顾客数);- 排队系统容量为N(等待位置数量)。

3. 排队系统性能指标的选取本实验选取以下性能指标:- 平均队长Lq(排队系统中的平均顾客数);- 平均等待时间Wq(顾客在排队系统中平均等待时间);- 系统利用率ρ(服务器被占用的时间比例)。

4. 排队系统模型的求解根据排队系统模型和参数,运用排队理论求解以下公式:- 平均队长Lq = (ρ/μ) [1 + ρ + (ρ^2)/2! + ... + (ρ^N)/N!]- 平均等待时间Wq = Lq/λ- 系统利用率ρ = λ/μ1. 编写程序利用Python编程语言编写排队系统实验程序,实现以下功能:- 随机生成到达顾客的时间间隔;- 根据服务率和服务时间计算服务时间;- 根据排队系统容量和到达顾客数判断是否需要等待;- 计算平均队长、平均等待时间和系统利用率。

2. 参数设置与实验- 设置不同的到达率λ和服务器服务率μ;- 设置不同的排队系统容量N;- 运行实验程序,记录实验结果。

3. 结果分析- 根据实验结果,绘制Lq、Wq和ρ随λ和μ变化的曲线;- 分析不同参数对排队系统性能的影响。

四、实验结果与分析1. 实验结果通过实验,得到以下结果:- 当λ=0.5,μ=1时,Lq=0.8,Wq=1.6,ρ=0.5;- 当λ=1,μ=2时,Lq=0.25,Wq=0.125,ρ=0.5;- 当λ=2,μ=3时,Lq=0.125,Wq=0.083,ρ=0.667。

模拟病人到医院排队看病上机内容完整实验报告!

模拟病人到医院排队看病上机内容完整实验报告!
输入无效*/
int stop=0;/*判断病历号是否全部进队,stop=1全部进队, stop=0还有
剩余的没有进队*/
int e;
int flag=1;/*flag=0,停止排队*/
QUEUE*temp;
while(flag==1)
{
printf("1:排队2:就诊3:查看排队4:停止排队\n");
/*病人看病的程序*/
/*========================================================*/
void SeeDoctor()
{
int selection,number;/*number为病历号*/
int exinum; /*exinum用于确认号码是否已有,true表示与之前的号码重复,
printf("目前所有的病历号: ");
while (temp!=NULL)
{
printf("%d ",temp->data);
temp=temp->next;
}
printf("\n");
}
/*========================================================*/
} QUEUE;/*链式队列类型名*/
QUEUE*front=NULL;/*队头指针*/
QUEUE*rear=NULL;/*队尾指针*/
/*========================================================*/
/*病例入队*/
/*========================================================*/

R语言仿真排队系统代码

R语言仿真排队系统代码

R语言仿真排队系统代码# DES.R: R routines for discrete-event simulation (DES)# each event will be represented by a data frame row consisting of the# following components: evnttime, the time the event is to occur;# evnttype, a character string for the programmer-defined event type;# optional application-specific components, e.g.# the job's arrival time in a queuing app# a global list named "sim" holds the events data frame, evnts, and# current simulated time, currtime; there is also a component dbg, which# indicates debugging mode# forms a row for an event of type evntty that will occur at time# evnttm; see comments in schedevnt() regarding appinevntrow <- function(evnttm,evntty,appin=NULL) {rw <- c(list(evnttime=evnttm,evnttype=evntty),appin)return(as.data.frame(rw))}# insert event with time evnttm and type evntty into event list;# appin is an optional set of application-specific traits of thisevent,# specified in the form a list with named componentsschedevnt <- function(evnttm,evntty,appin=NULL) {newevnt <- evntrow(evnttm,evntty,appin)# if the event list is empty, set it to consist of evnt and return if (is.null(sim$evnts)) {sim$evnts <<- newevntreturn()}# otherwise, find insertion pointinspt <- binsearch((sim$evnts)$evnttime,evnttm)# now "insert," by reconstructing the data frame; we find what# portion of the current matrix should come before the new event and# what portion should come after it, then string everything togetherbefore <-if (inspt == 1) NULL else sim$evnts[1:(inspt-1),]nr <- nrow(sim$evnts)after <- if (inspt <= nr) sim$evnts[inspt:nr,] else NULLsim$evnts <<- rbind(before,newevnt,after)}# binary search of insertion point of y in the sorted vector x; returns# the position in x before which y should be inserted, with the value# length(x)+1 if y is larger than x[length(x)]; could be changed to C# code for efficiencybinsearch <- function(x,y) {n <- length(x)lo <- 1hi <- nwhile(lo+1 < hi) {mid <- floor((lo+hi)/2)if (y == x[mid]) return(mid)if (y < x[mid]) hi <- mid else lo <- mid}if (y <= x[lo]) return(lo)if (y < x[hi]) return(hi)return(hi+1)}# start to process next event (second half done by application# programmer via call to reactevnt())getnextevnt <- function() {head <- sim$evnts[1,]# delete headif (nrow(sim$evnts) == 1) {sim$evnts <<- NULL} else sim$evnts <<- sim$evnts[-1,]return(head)}# simulation body# arguments:# initglbls: application-specific initialization function; inits# globals to statistical totals for the app, etc.; records apppars # in globals; schedules the first event# reactevnt: application-specific event handling function, coding the# proper action for each type of event# prntrslts: prints application-specific results, e.g. mean queue# wait# apppars: list of application-specific parameters, e.g.# number of servers in a queuing app# maxsimtime: simulation will be run until this simulated time # dbg: debug flag; if TRUE, sim will be printed after each eventdosim <- function(initglbls,reactevnt,prntrslts,maxsimtime,apppars=NULL, dbg=FALSE) {sim <<- list()sim$currtime <<- 0.0 # current simulated timesim$evnts <<- NULL # events data framesim$dbg <<- dbginitglbls(apppars)while(sim$currtime < maxsimtime) {head <- getnextevnt()sim$currtime <<- head$evnttime # update current simulated timereactevnt(head) # process this eventif (dbg) print(sim)}prntrslts()}。

银行排队模拟系统实验报告

银行排队模拟系统实验报告
waibi(c) = num1'将该客户编号存入waibi数组,c为weibi数组的数组元素标号()
TextBox3.Text = TextBox3.Text &"G-"& waibi(c)
TextBox3.Text = TextBox3.Text & vbCrLf
c = c + 1'排在号窗口,并将其号码显示在文本框输出
测试11:
某窗口排对人数超过25人。
(二)遇到的问题和解决方法:
问题1:
当2号、3号窗口同为空时,排在1号窗口的第一为客户的编号会出现在2号、3号两个窗口中。
方法:
经分析,这是由于没有考虑两个窗口的优先级所致,于是我设置办理理财业务的2号窗口的优先级高于办理外币业务的3号窗口。当两窗口同为空时,先给2号窗口分配客户,之后,若1号窗口仍有人排队,再分配给3号窗口。
3、显示排队情况:将客户的编号、所排窗口、所在队伍位置显示在应用程序界面上,模拟排队情况。
4、刷新队伍:每位客户业务办理结束后,工作人员提醒下一位客户,当2号窗口、3号窗口业务办理结束且1号窗口仍有人在办理业务,则将在1号窗口前排队的客户分配到2号窗口、3号窗口去。分配方法是:当2、3窗口同时为空时,先分配给2号窗口,若此时仍有客户在1号窗口排队,则再分配给3号窗口。
7、Button3_Click
退出程序。
8、Timer6_Tick
2号窗口为空,且1号窗口仍有人排队,将排在1号窗口的第一位客户转到2号窗口办理业务。
1号窗口排队人数小于25人时,撤销提示信息,恢复个人业务的办理。
3个窗口均为空,退出程序。
9、Timer5_Tick
3号窗口为空,1、2号窗口均不空,将排在1号窗口的第一位客户转到3号窗口办理业务。

实验三 排队系统仿真-2011

实验三 排队系统仿真-2011

实验三排队系统仿真
实验目的:
1、掌握power&free四元素的使用
2、掌握排队系统的组成及分析
实验内容:
系统描述:part001是待处理的零部件,到达间隔时间为60分钟,批量为5-15的整数均匀分布;PF****元素为隶属于PFNetwork001的power&free系统,工作类型为路径驱动(section powered),其中PFstation001是装载站点,PFStation003是卸载站点,装卸载的时间均为1分钟,PFStation002是加工站点,加工时间为均值20分钟,标准差3分钟,位于10-30分钟之间的截断正态分布;PFSection001-003长度(length)分别为1000米、500米、1400米,驱动速度(drive speed)为100米/分钟,狗距(dog spacing)为10米,车距(override carrier)为50米。

模型布局如下图所示
你所要做的工作:
1、建立如上所述的仿真模型
2、指出该系统有哪些排队系统,其组成分别是什么
3、运行7天(1440*5),观察buffers001的平均存储量
(提示:右击buffers001-statistics-avg size)
4、如果要使buffers001的平均存储量下降到30左右,有什么办法?并提出代价相对较小的改进方案(提示:改变PFstaiton002和PFCarrier001的数量)
实验报告要求:
(1)画出仿真模型图,并注明各元素非默认细节设置(detail…配置图片或documentor文档均可)。

注意:不得复制实验内容上图片,否则0分处理(2)回答实验内容2-4的问题,必要时要有图片或数据支持说明。

多服务台排队系统的仿真

多服务台排队系统的仿真

实验3---多服务台排队系统的仿真姓名:学号:一、目标任务已知一个系统有N个服务员,能力相等,服务时间服从指数分布。

顾客的到达时间间隔服从指数分布。

用Monte-Carlo仿真,分别求按下列方案的总体平均排队时间:① M|M|N。

② N个单通道系统并列,按1/N概率分裂到达流。

③ N个单通道并列,挑选最短的队。

要求:①给出程序设计的过程。

②如果采用固定的N,则要求N>2。

③至少取ρ=0.3和ρ=0.7两种强度运行程序。

④对结果进行分析。

二、编程语言Matlab三、关键代码方案一:N = 3; % 服务员人数r = 6; % 顾客到达流强度u = 20; % 服务员服务强度T = 1000000; % 仿真运行时间avg_wait_time = []; % 平均等待时间for i=1:100% 模拟排队函数server_time = [0.0, 0.0, 0.0]; % 用来保存服务员下一空闲时间time = 0; % 绝对时钟,初始为0client_num = 0; % 顾客总数,初始为0CRTime = 0; % 顾客到达时间间隔ServeTime = 0; % 顾客服务时间server_id = 0; % 当前进入排队窗口的服务员编号total_wait_time = 0;% 系统中到达顾客的总等待时间while 1CRTime = exprnd(1/r); % 按指数分布产生顾客到达时间间隔time = time + CRTime; % 更新系统的绝对时钟if time > Tbreak;endclient_num = client_num + 1; % 顾客数加1ServeTime = exprnd(1/u); % 按指数分布产生顾客服务间隔server_id = mod(client_num, N); % 按1..N的顺序循环排入服务员窗口if server_id ==0server_id = N;endif server_time(1, server_id) <= time % 如果当前server_id号服务员空闲,则直接接收服务server_time(1, server_id) = time + ServeTime; % 服务员下一空闲时间为当前绝对时钟加上当前服务时间else % 否则所有服务员都在忙碌,顾客要排队等候total_wait_time = total_wait_time + server_time(1, server_id) - time; % 顾客排队等候时间为当前服务员下一空闲时间减去绝对时钟server_time(1, server_id) = server_time(1, server_id) + ServeTime;endendavg_wait_time = [avg_wait_time, total_wait_time/client_num];end% 计算平均等待时间mean_avg_wait_time = mean(avg_wait_time);fprintf('ρ=%2.1f平均等待时间%6.5f\n', r/u, mean_avg_wait_time); % 打印平均等待时间% 绘制每次仿真的平均等待时间和总体平均等待时间线状图x = 1:100;%plot(x, avg_wait_time, x, mean_avg_wait_time);scatter(x, avg_wait_time, '.');方案二:N = 3; % 服务员人数r = 6; % 顾客到达流强度u = 20; % 服务员服务强度T = 1000; % 仿真运行时间avg_wait_time = []; % 平均等待时间for i=1:100% 模拟排队函数server_time = [0.0, 0.0, 0.0]; % 用来保存服务员下一空闲时间time = 0; % 绝对时钟,初始为0client_num = 0; % 顾客总数,初始为0CRTime = 0; % 顾客到达时间间隔ServeTime = 0; % 顾客服务时间server_id = 0; % 当前进入排队窗口的服务员编号total_wait_time = 0;% 系统中到达顾客的总等待时间while 1CRTime = exprnd(1/r); % 按指数分布产生顾客到达时间间隔time = time + CRTime; % 更新系统的绝对时钟if time > Tbreak;endclient_num = client_num + 1; % 顾客数加1ServeTime = exprnd(1/u); % 按指数分布产生顾客服务时间间隔server_id = randi([1 N]); % 按1/N的概率排入服务员窗口if server_time(1, server_id) <= time % 如果当前server_id号服务员空闲,则直接接收服务server_time(1, server_id) = time + ServeTime; % 服务员下一空闲时间为当前绝对时钟加上当前服务时间else % 否则所有服务员都在忙碌,顾客要排队等候total_wait_time = total_wait_time + server_time(1, server_id) - time; % 顾客排队等候时间为当前服务员下一空闲时间减去绝对时钟server_time(1, server_id) = server_time(1, server_id) + ServeTime;endendavg_wait_time = [avg_wait_time, total_wait_time/client_num];end% 计算平均等待时间mean_avg_wait_time = mean(avg_wait_time);fprintf('ρ=%2.1f平均等待时间%6.5f\n', r/u, mean_avg_wait_time); % 打印平均等待时间% 绘制每次仿真的平均等待时间散点图x = 1:100;scatter(x, avg_wait_time, '.');方案三:N = 3; % 服务员人数r = 6; % 顾客到达流强度u = 20; % 服务员服务强度T = 1000; % 仿真运行时间avg_wait_time = []; % 平均等待时间for i=1:100% 模拟排队函数server_time = [0.0, 0.0, 0.0]; % 用来保存服务员下一空闲时间time = 0; % 绝对时钟,初始为0client_num = 0; % 顾客总数,初始为0CRTime = 0; % 顾客到达时间间隔ServeTime = 0; % 顾客服务时间server_id = 0; % 当前进入排队窗口的服务员编号total_wait_time = 0;% 系统中到达顾客的总等待时间while 1CRTime = exprnd(1/r); % 按指数分布产生顾客到达时间间隔time = time + CRTime; % 更新系统的绝对时钟if time > Tbreak;endclient_num = client_num + 1; % 顾客数加1ServeTime = exprnd(1/u); % 按指数分布产生顾客服务时间间隔temp = min(server_time); % 寻找排队时间最短的服务员窗口[x, y] = find(temp == min(min(server_time)));server_id = y; % 按队伍最短排入服务员窗口if server_time(1, server_id) <= time % 如果当前server_id号服务员空闲,则直接接收服务server_time(1, server_id) = time + ServeTime; % 服务员下一空闲时间为当前绝对时钟加上当前服务时间else % 否则所有服务员都在忙碌,顾客要排队等候total_wait_time = total_wait_time + server_time(1, server_id) - time; % 顾客排队等候时间为当前服务员下一空闲时间减去绝对时钟server_time(1, server_id) = server_time(1, server_id) + ServeTime;endendavg_wait_time = [avg_wait_time, total_wait_time/client_num];end% 计算平均等待时间mean_avg_wait_time = mean(avg_wait_time);fprintf('ρ=%2.1f平均等待时间%6.5f\n', r/u, mean_avg_wait_time); % 打印平均等待时间% 绘制每次仿真的平均等待时间散点图x = 1:100;scatter(x, avg_wait_time, '.');四、实验结果与分析方案一:图1 方案一仿真的平均等待时间散点图图2 方案一平均等待时间M|M|N1. 输入参数:服务员人数N,顾客到达流强度r,服务员服务强度u,仿真运行时间T;2. 各变量初始值置0:绝对时钟time,服务员下一空闲时刻数组server_time[](其中按顺序保存每一个服务员的下一空闲时刻),顾客总数client_num,顾客到达时间间隔CRTime,顾客服务时间ServeTime,当前进入排队窗口的服务员编号server_id,系统中顾客总等待时间total_wait_time;3. 按照指数分布产生下一顾客到达的时间间隔CRTime,time+=CRTime。

单服务台排队系统的仿真

单服务台排队系统的仿真

实验2---单服务台排队系统的仿真姓名:学号:一、目标任务①模拟路由器缓存区M|M|1|m实验。

②设定:λ=8/s,μ=10/s,ρ=0.8,m=10。

③模拟系统106s,求系统报文的丢失率及报文在路由器中停留时间的均值。

④模拟100次,图展示每次的模拟结果,并与理论值0.0184比较。

二、编程语言Matlab三、关键代码lamda = 8; %报文到达强度u = 10; %路由器处理强度m = 10; %路由器缓冲区长度T = 1000000; %模拟时间a = []; %模拟运行时丢失率的运行结果mean_a = 0; %模拟运行时丢失率的平均运行结果ref_value = 0.0184; %丢失率理论值大小b = []; %模拟运行时报文在路由器中的停留时间mean_b = 0; %模拟运行时报文在路由器中停留时间的均值%模拟运行一百次for i=1:100time = 0; %绝对时钟t = 0; %路由器的下一空闲时刻N = 0; %到达报文数NI = 0; %丢失报文数q = 0; %队长stay_time = 0; %报文在路由器中的停留时间%按指数分布产生随机到达时间和服务时间while 1CRTime = exprnd(1/lamda); %按指数分布产生下一报文的到达随机时间间隔time = CRTime + time; %下一个报文到达的时间if time > Tbreak;endN = N + 1;q = q + 1;while q > 0 & t < timeq = q - 1;ServeTime = exprnd(1/u);%按指数分布产生报文的随机服务时间if q == 0t = time + ServeTime;elset = t + ServeTime;endstay_time = stay_time + ServeTime * (q + 1);endif q == m + 1 %如果超过缓冲区长,则丢失报文数加1,队长减1 NI = NI + 1;q = q - 1;endenda = [a, NI/N];b = [b, stay_time/(N-NI)];end%计算结果mean_a = mean(a);mean_b = mean(b);%绘图x = 1:100;plot(x, a, x, mean_a); %绘制模拟运行时丢包率变化图以及均值线scatter(x, a, '.'); %绘制模拟运行时丢包率变化散点图scatter(x, b, '.'); %绘制模拟运行时平均停留时间变化散点图fprintf('平均丢包率%6.5f\n', mean_a); % 打印平均丢包率fprintf('平均停留时间%6.5f\n', mean_b); % 打印平均停留时间四、实验结果与分析图1 丢包率和平均停留时间图2模拟运行时丢包率变化图以及均值线M/M/1/∞/∞ 模型模型条件(1) 输入过程――顾客源是无限的, 单个到来, 到达过程服从泊松分布, 即顾客到达间隔时间服从负指数分布;(2) 排队规则――单队, 且队长没有限制, 先到先服务;(3) 服务机构――单服务台, 服务时间的长短是随机的,服从相同的负指数分布 。

2022年AnyLogic排队系统仿真实验报告

2022年AnyLogic排队系统仿真实验报告

《物流系统建模与仿真》AnyLogic排队系统仿真实验报告一、实验目旳通过学习操作Anylogic仿真软件,学会使用Anylogic对单线排队系统进行仿真旳实验,理解该仿真系统旳运营流程,熟悉对其旳基本操作,理解排队方案中存在旳局限性,并懂得如何借助Anylogic对仿真成果旳优化,改善排队方案,达届时间和效率上旳最,结合实际状况解决实际问题。

二、实验时间和地点时间:-第1学期地点:管理系学生宿舍三、实验内容借助Anylogic仿真软件建立一种简朴旳离散事件系统——单线排队系统,并在仿真旳过程中,结识涉及实体、属性、事件、活动和进程等功能要素,运用Anylogic仿真软件模拟实际生活中旳排队现象,并对排队现象进行仿真分析及成果优化。

四、实验原理1、轻变换抽象层次和视点直到它完美地合用于需要解决旳问题;2、如果觉得系统动态学旳抽象层对解决问题绰绰有余,使用整合汇集表;3、如果系统能以流程(操作顺序、实体、资源)旳形式显示出来,使用离散事件建模;4、如果对具体旳对象行为更感爱好,使用基于主体旳建模;5、可以将不同旳措施用于一种模型。

五、实验环节六、实验成果与优化七、思考与实验体会第一次做这个实验旳时候,从下载软件到安装就已经感觉到了实验旳困难限度,明显感觉到了很大旳压力。

在一切安装完毕之后不懂得如何下手,从哪一步做起。

然后就翻看教师给旳材料、ppt文档看了半天也不懂得怎么弄,寝室人也不懂得怎么做,后来想起来教师说旳朱立建同窗做好了,我们有问题可以找她帮忙,于是,我就开始询问朱立建,在朱立建同窗旳热心协助下,给我耐心认真旳解说,每一步都很具体,看她给我掩饰实验环节,一步步旳看明白,慢慢旳明白了实验旳大体过程,然后自己根据朱立建旳解说把前面旳程序做了一下,建立排队模型,设定期间,插入旁边旳功能图标,设定参数等,根据教师发旳排队照片,一步步地进行,最后点击运营,发既有某些错误,然后根据错误批示慢慢旳找出了错误旳地方,然后重新设立参数。

排队模型仿真实验2020_1_10更新

排队模型仿真实验2020_1_10更新

停止
练习 建立多服务台的排队模型仿真测试 试利用计算机建立下列两种排队模式的仿真模型,并解决问 题1,2
湖北工业大学 理学院 ZNL
问题1 设有两个修理工人,负责5台机器的正常运行,每台机 器平均损坏的概率为每运转一小时1次,两个工人能以相同 的平均修复率4(次/小时)修好机器。假设按每天工作16小 时计算,求一年内: (1)等待修理的机器平均数 (2)需要修理的机器平均数 (3)等待修理的总时间 (4)因机器故障造成的停工时间
符号说明
w:总等待时间; ci:第i个顾客的到达时刻; bi:第i个顾客开始服务时刻; ei:第i个顾客服务结束时刻. xi:第i-1个与第i个顾客到达时间间隔 yi:对第i个顾客的服务时间
模拟框图
初始化:令i=1,ei-1=0,w=0
产生间隔时间随机数x1服从参数为0.1的指数分布 c1=x1 , b1=x1
That all, Thank you!
湖北工业大学 理学院 ZNL
符号说明 w:总等待时间; ci:第i个顾客的到达时刻;
bi:第i个顾客开始服务时刻; ei:第i个顾客服务结束时刻. xi:第i-1个顾客与第i个顾客到达之间的时间间隔 yi:对第i个顾客的服务时间
c1 c2
c3
c4
c5
e1
e2
e3
e4
t
b1
b2
b3
b4
b5
ci=ci-1+ xi bi=max(ci, ei-1) ei=bi+yi
产生服务时间随机数yi服从[4,15]的均匀分布 ei=bi+yi
累计等待时间:w=w+bi-ci
准备下一次服务:i=i+1 产生间隔时间随机数xi服从参数为0.1的指数分布

MM1排队系统仿真matlab实验报告

MM1排队系统仿真matlab实验报告

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

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

1、 顾客到达模式设到达过程是一个参数为λ的Poisson 过程,则长度为t 的时间内到达k 个呼叫的概率 服从Poisson 分布,即etkk k t t p λλ-=!)()(,⋅⋅⋅⋅⋅⋅⋅⋅⋅=,2,1,0k ,其中λ>0为一常数,表示了平均到达率或Poisson 呼叫流的强度。

2、 服务模式设每个呼叫的持续时间为i τ,服从参数为μ的负指数分布,即其分布函数为{}1,0t P X t e t μ-<=-≥3、 服务规则先进先服务的规则(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;for i=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;for i=2:SimTotalif t_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;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;CusNum(i)=CusNum(i-1)-1;endend%系统中平均顾客数计算Time_interval=zeros(size(Timepoint));Time_interval(1)=t_Arrive(1);for i=2:length(Timepoint)Time_interval(i)=Timepoint(i)-Timepoint(i-1);endCusNum_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)>=2QueLength(i)=CusNum(i)-1;elseQueLength(i)=0;endendQueLength_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; %各顾客在系统中的排队时间由事件来触发仿真时钟的不断推进。

计算机仿真排队系统实验报告(附代码)

计算机仿真排队系统实验报告(附代码)

计算机仿真实验报告第一题1. 作业内容应用排队系统流程图,用C语言编制仿真程序,求解以下问题。

修理店只有一个修理工,来修理的顾客到达次数服从泊松分布,平均4人/h;修理时间服从指数分布,平均需6min。

试求(随机数发生器采用float lcgrand(int stream) ,种子stream 为自己学号的最后两位。

):①修理店空闲的概率;②店内有三个顾客的概率;③店内至少有一个顾客的概率;④在店内顾客的平均数;⑤顾客在店内的平均逗留时间;⑥顾客必须在店内消耗15分钟以上的概率。

统计量实现算法:①修理店空闲的概率;p1=1-area_server_status/sim_timearea_server_status:总服务时间(即修理工在这段仿真时间里非空闲时间)sim_time:总仿真时间用1减去非空闲概率,即为空闲概率。

②店内有三个顾客的概率;p2=Three_people_time/sim_time增加变量Three_people_time,即有三个顾客在店内的时间。

三个顾客在店里,也就是说一个顾客在理发,两个人在排队,此时,无论是来一个新的客人或者离开一个客人,都会破坏这种三个人的状态,所以我们每次要统计的,就是这种三个人的状态持续的时间。

因此,用到的是time_since_last_event这个变量,该变量用于统计两种状态(事件,包括离开和到来)之间的事件。

因此,在每次计算完time_since_last_event之后,考察队伍中的人数是否为2,若为2,则把该段time_since_last_event加到Three_people_time中。

仿真结束时,用Three_people_time/总仿真时间,即为店内有三个顾客的概率。

③店内至少有一个顾客的概率;p3=p3=1-idle_time/sim_time增加变量idle_time,即店里空闲的概率(没有顾客),用1减去一个顾客都没有的概率,就是至少有一个顾客的概率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机仿真实验报告第一题1.作业内容应用排队系统流程图,用C语言编制仿真程序,求解以下问题。

修理店只有一个修理工,来修理的顾客到达次数服从泊松分布,平均4人/h;修理时间服从指数分布,平均需6min。

试求(随机数发生器采用float lcgrand(int stream) ,种子stream 为自己学号的最后两位。

):①修理店空闲的概率;②店内有三个顾客的概率;③店内至少有一个顾客的概率;④在店内顾客的平均数;⑤顾客在店内的平均逗留时间;⑥顾客必须在店内消耗15分钟以上的概率。

统计量实现算法:①修理店空闲的概率;p1=1-area_server_status/sim_timearea_server_status:总服务时间(即修理工在这段仿真时间里非空闲时间)sim_time:总仿真时间用1减去非空闲概率,即为空闲概率。

②店内有三个顾客的概率;p2=Three_people_time/sim_time增加变量Three_people_time,即有三个顾客在店内的时间。

三个顾客在店里,也就是说一个顾客在理发,两个人在排队,此时,无论是来一个新的客人或者离开一个客人,都会破坏这种三个人的状态,所以我们每次要统计的,就是这种三个人的状态持续的时间。

因此,用到的是time_since_last_event这个变量,该变量用于统计两种状态(事件,包括离开和到来)之间的事件。

因此,在每次计算完time_since_last_even t之后,考察队伍中的人数是否为2,若为2,则把该段time_since_last_event加到Three_people_time中。

仿真结束时,用Three_people_time/总仿真时间,即为店内有三个顾客的概率。

③店内至少有一个顾客的概率;p3=p3=1-idle_time/sim_time增加变量idle_time,即店里空闲的概率(没有顾客),用1减去一个顾客都没有的概率,就是至少有一个顾客的概率。

判断店里空闲的方法是,如果当前有一个顾客来了,他不需要排队,就意味着这之前店里是空闲着的。

这里仍用到time_since_last_event,在这个客人来之前的这段时间店里空闲,因此把这个时间段加给idle_time,以此累加,最后得到总的空闲时间。

④在店内顾客的平均数;mean_customer=1.0*num_custs_delayed/sim_time在这里我计算的是店里平均每分钟的顾客数(包括等待的和正在理发的)。

num_cust_delay ed是在这段仿真时间里总共出现的顾客,除以仿真时间,就是店内顾客平均数。

⑤顾客在店内的平均逗留时间;mean_stay_time=(area_num_in_q+area_server_status)/(1.0*num_custs_delayed)对于任意一位顾客,他在店里逗留的时间=排队时间+理发时间。

area_num_in_q统计的是队列中的顾客等待的总时间,而area_server_status统计的是所有顾客理发的总时间,相加就是所有顾客在店里逗留的时间,除以顾客的人数,就是顾客平均逗留时间。

⑥顾客必须在店内消耗15分钟以上的概率。

p6=1.0*count15/num_custs_delayed增加变量count15,用于统计在店内消耗15分钟以上的顾客人数,再增加变量single_cust_t ime,用于统计单个顾客在店内消耗的时间。

这里有两种情况。

(1)不用排队。

那么该顾客在店里消耗的时间就是理发时间,即single_cust_time=time_n ext_event[2]-sim_time。

time_next_event[2]=sim_time+expon(mean_service)。

(2)要排队。

那么single_cust_time=delay+time_next_event[2]-sim_time。

delay是当前有一位顾客离开时,得到的下一位将要理发的顾客(即队首顾客)的等待时间。

每一位顾客到店里时都会有一个time_arrival[]将其抵达时刻记录下来,因此,轮到他时,用sim_time减去time_arrival[]就得到了他等待的时间。

等待时间加上理发时间,就是这位顾客在店里消耗的时间。

以上可计算出单个顾客在店里消耗的时间,与15分钟比较,若超过,加入count15中,count 15除以总人数,就是所求概率。

对原程序的修改点:去掉了文件操作,用提示输入的方式输入参数,可多次输入。

增加变量count15,Three_peop le_time,idle_time,single_cust_time。

作用见上面六小题具体算法。

代码:#include <stdio.h>#include <math.h>#include <stdlib.h>/*#include "lcgrand.h" Header file for random-number generator. */#define Q_LIMIT 100 /* Limit on queue length. */#define BUSY 1 /* Mnemonics for server's being busy */#define IDLE 0 /* and idle. */int next_event_type, num_custs_delayed, num_delays_required, num_events,num_in_q, server_status,count15;float area_num_in_q, area_server_status, mean_interarrival, mean_service,sim_time, time_arrival[Q_LIMIT + 1], time_last_event, time_next_event[3],total_of_delays,Three_people_time,idle_time,single_cust_time,time_since_last_eve nt;/* The following 3 declarations are for use of the random-number generatorlcgrand and the associated functions lcgrandst and lcgrandgt for seedmanagement. This file (named lcgrand.h) should be included in any programusing these functions by executing#include "lcgrand.h"before referencing the functions. */float lcgrand(int stream);void lcgrandst(long zset, int stream);long lcgrandgt(int stream);void initialize(void);void timing(void);void arrive(void);void depart(void);void report(void);void update_time_avg_stats(void);float expon(float mean);int main() /* Main function. */{/* Specify the number of events for the timing function. */char choice;num_events = 2;while(1){printf("Start to simulate?(Y/N)");getchar();scanf("%c",&choice);if(choice=='N')exit(0);printf("\n\nPlease enter the interarrival time(min):");scanf("%f",&mean_interarrival);printf("\nPlease enter the serving time(min):");scanf("%f",&mean_service);printf("\nPlease enter the number of customer:");scanf("%d",&num_delays_required);/* Initialize the simulation. */initialize();/* Run the simulation while more delays are still needed. */ while (num_custs_delayed < num_delays_required) {/* Determine the next event. */timing();/* Update time-average statistical accumulators. */update_time_avg_stats();/* Invoke the appropriate event function. */switch (next_event_type) {case 1:arrive();break;case 2:depart();break;}}/* Invoke the report generator and end the simulation. */report();}return 0;}void initialize(void) /* Initialization function. */{/* Initialize the simulation clock. */sim_time = 0.0;/* Initialize the state variables. */server_status = IDLE;num_in_q = 0;time_last_event = 0.0;/* Initialize the statistical counters. */num_custs_delayed = 0;total_of_delays = 0.0;area_num_in_q = 0.0;area_server_status = 0.0;// Initialize the variables I addedThree_people_time = 0.0;idle_time = 0.0;count15 = 0;/* Initialize event list. Since no customers are present, the departure (service completion) event is eliminated from consideration. */time_next_event[1] = sim_time + expon(mean_interarrival);time_next_event[2] = 1.0e+30;}void timing(void) /* Timing function. */{int i;float min_time_next_event = 1.0e+29;next_event_type = 0;/* Determine the event type of the next event to occur. */for (i = 1; i <= num_events; ++i)if (time_next_event[i] < min_time_next_event) {min_time_next_event = time_next_event[i];next_event_type = i;}/* Check to see whether the event list is empty. */if (next_event_type == 0) {/* The event list is empty, so stop the simulation. */printf("\nEvent list empty at time %f", sim_time);exit(0);}/* The event list is not empty, so advance the simulation clock. */sim_time = min_time_next_event;}void arrive(void) /* Arrival event function. */{float delay;/* Schedule next arrival. */time_next_event[1] = sim_time + expon(mean_interarrival); //compute when the next people arrive/* Check to see whether server is busy. */if (server_status == BUSY) {/* Server is busy, so increment number of customers in queue. */++num_in_q;/* Check to see whether an overflow condition exists. */if (num_in_q > Q_LIMIT) {/* The queue has overflowed, so stop the simulation. */printf("\nOverflow of the array time_arrival at");printf(" time %f", sim_time);exit(2);}/* There is still room in the queue, so store the time of arrival of the arriving customer at the (new) end of time_arrival. */time_arrival[num_in_q] = sim_time; //record the time when this person arrived}else {/* Server is idle, so arriving customer has a delay of zero. (Thefollowing two statements are for program clarity and do not affectthe results of the simulation.) */delay = 0.0; //no need to waittotal_of_delays += delay;idle_time+=time_since_last_event;/* Increment the number of customers delayed, and make server busy. */++num_custs_delayed;server_status = BUSY;/* Schedule a departure (service completion). */time_next_event[2] = sim_time + expon(mean_service); //compute the serve time of this person(to know when he will leave)single_cust_time = time_next_event[2] - sim_time;if(single_cust_time>=15)count15++;}}void depart(void) /* Departure event function. */{int i;float delay;/* Check to see whether the queue is empty. */if (num_in_q == 0) {/* The queue is empty so make the server idle and eliminate thedeparture (service completion) event from consideration. */server_status = IDLE;time_next_event[2] = 1.0e+30;}else {/* The queue is nonempty, so decrement the number of customers inqueue. */--num_in_q;/* Compute the delay of the customer who is beginning service and update the total delay accumulator. */delay = sim_time - time_arrival[1]; //how long does this person wait in the queuetotal_of_delays += delay; //the total waiting-time of people in the queue/* Increment the number of customers delayed, and schedule departure. */++num_custs_delayed;time_next_event[2] = sim_time + expon(mean_service); //compute the serve time of this personsingle_cust_time = delay + time_next_event[2] - sim_time;if(single_cust_time>=15)count15++;/* Move each customer in queue (if any) up one place. */for (i = 1; i <= num_in_q; ++i)time_arrival[i] = time_arrival[i + 1]; //FIFO,after the firstperson's departure,the queue moves.}}void report(void) /* Report generator function. */{/* Compute and write estimates of desired measures of performance. */ float p1,p2,p3,p6,mean_customer,mean_stay_time;p1=1-area_server_status/sim_time;p2=Three_people_time/sim_time;p3=1-idle_time/sim_time;mean_customer=1.0*num_custs_delayed/sim_time;mean_stay_time=(area_num_in_q+area_server_status)/(1.0*num_custs_delayed);p6=1.0*count15/num_custs_delayed;printf("\n\nSingle-server queueing system\n\n");printf("Mean interarrival time%11.3f minutes\n\n",mean_interarrival);printf("Mean service time%16.3f minutes\n\n", mean_service);printf("Number of customers%14d\n\n", num_delays_required);printf("Here is the report:\n");printf("\n\n修理店空闲的概率为:%11.3f\n\n",p1);printf("\n\n店内有三个顾客的概率为:%11.3f\n\n",p2);printf("\n\n店内至少有一个顾客的概率为:%11.3f\n\n",p3);printf("\n\n在店内顾客的平均数为%11.3f 人每分钟\n\n",mean_customer);printf("\n\n顾客在店内的平均逗留时间为%11.3f 分钟\n\n",mean_stay_time);printf("\n\n顾客必须在店内消耗15分钟以上的概率为:%11.3f\n\n",p6);printf("Time simulation ended%12.3f minutes\n\n",sim_time);}void update_time_avg_stats(void) /* Update area accumulators for time-averagestatistics. */{/* Compute time since last event, and update last-event-time marker. */time_since_last_event = sim_time - time_last_event;//how much time past from the last event(arrive or departure)time_last_event = sim_time;//record the moment of last eventif(num_in_q==2)Three_people_time+=time_since_last_event;/* Update area under number-in-queue function. */area_num_in_q += num_in_q * time_since_last_event;//count the total waiting-time of people in the queue/* Update area under server-busy indicator function. */area_server_status += server_status * time_since_last_event;//count the total serving-time}float expon(float mean) /* Exponential variate generation function. */{/* Return an exponential random variate with mean "mean". */return -mean * log(lcgrand(3));}/* Prime modulus multiplicative linear congruential generatorZ[i] = (630360016 * Z[i-1]) (mod(pow(2,31) - 1)), based on Marse and Roberts'portable FORTRAN random-number generator UNIRAN. Multiple (100) streams aresupported, with seeds spaced 100,000 apart. Throughout, input argument "stream" must be an int giving the desired stream number. The header filelcgrand.h must be included in the calling program (#include "lcgrand.h")before using these functions.Usage: (Three functions)1. To obtain the next U(0,1) random number from stream "stream," executeu = lcgrand(stream);where lcgrand is a float function. The float variable u will contain thenext random number.2. To set the seed for stream "stream" to a desired value zset, executelcgrandst(zset, stream);where lcgrandst is a void function and zset must be a long set to thedesired seed, a number between 1 and 2147483646 (inclusive). Defaultseeds for all 100 streams are given in the code.3. To get the current (most recently used) integer in the sequence beinggenerated for stream "stream" into the long variable zget, executezget = lcgrandgt(stream);where lcgrandgt is a long function. *//* Define the constants. */#define MODLUS 2147483647#define MULT1 24112#define MULT2 26143/* Set the default seeds for all 100 streams. */static long zrng[] ={ 1,1973272912, 281629770, 20006270,1280689831,2096730329,1933576050, 913566091, 246780520,1363774876, 604901985,1511192140,1259851944, 824064364, 150493284, 242708531, 75253171,1964472944,1202299975, 233217322,1911216000, 726370533, 403498145, 993232223,1103205531, 762430696,1922803170,1385516923, 76271663, 413682397, 726466604, 336157058,1432650381,1120463904, 595778810, 877722890,1046574445, 68911991,2088367019, 748545416, 622401386,2122378830, 640690903, 1774806513,2132545692,2079249579, 78130110, 852776735,1187867272, 1351423507,1645973084,1997049139, 922510944,2045512870, 898585771, 243649545,1004818771, 773686062, 403188473, 372279877,1901633463, 498067494,2087759558, 493157915, 597104727,1530940798,1814496276, 536444882,1663153658, 855503735, 67784357,1432404475, 619691088, 119025595, 880802310, 176192644,1116780070, 277854671,1366580350, 1142483975,2026948561,1053920743, 786262391,1792203830,1494667770, 1923011392,1433700034,1244184613,1147297105, 539712780,1545929719, 190641742,1645390429, 264907697, 620389253,1502074852, 927711160, 364849192,2049576050, 638580085, 547070247 };/* Generate the next random number. */float lcgrand(int stream){long zi, lowprd, hi31;zi = zrng[stream];lowprd = (zi & 65535) * MULT1;hi31 = (zi >> 16) * MULT1 + (lowprd >> 16);zi = ((lowprd & 65535) - MODLUS) +((hi31 & 32767) << 16) + (hi31 >> 15);if (zi < 0) zi += MODLUS;lowprd = (zi & 65535) * MULT2;hi31 = (zi >> 16) * MULT2 + (lowprd >> 16);zi = ((lowprd & 65535) - MODLUS) +((hi31 & 32767) << 16) + (hi31 >> 15);if (zi < 0) zi += MODLUS;zrng[stream] = zi;return (zi >> 7 | 1) / 16777216.0;}void lcgrandst (long zset, int stream) /* Set the current zrng for stream"stream" to zset. */{zrng[stream] = zset;}long lcgrandgt (int stream) /* Return the current zrng for stream "stream". */ {return zrng[stream];}。

相关文档
最新文档