系统模拟实验的三个案例实验案例赶上火车的概率1实验案例1.1赶上火车的概率1.1.1问题描述如图,一列火车从A站开往B站,某人每天赶往B站上这趟火车。他已了解到:(1)火车从A站到B站的运行时间是均值为30分钟,标准差为2分钟的随机变量;(2)火车在下午大约1点离开A站,离开时刻的频率分布如下:出发时刻午后1:00午后1:05午后1:10频率0.70.20.1此人到达B站的时刻频率分布为:时刻午后1:28午后1:30午后1:32午后1:34频率0.30.40.20.1问他能赶上火车的概率是多少?1.1.2变量说明1T:火车从A站出发的时刻;2T:火车从A站到B站的运行时间;单位:分钟3T:他到达B站的时刻1.1.3问题分析与假设此问题包含多个随机因素。这里假设1T,2T,3T都是随机变量,其中2T服从正态分布。1.1.4模型建立很显然,他能及时赶上火车的条件是:213TTT。为了简化计算,将下午1点记为初始时刻。1T和3T的分布律如下:1T/min0510)(tP0.70.20.13T/min28303234)(tP0.30.40.20.1为了模拟随机变量。如果r为在)1,0(均匀分布的随机数,为了模拟随机变量31,TT,可以通过如下方法。19.0,109.07.0,57.00,01rrrt,0.19.0,349.07.0,327.03.0303.00,283rrrrt,。其中,1t和3t分别用来模拟随机变量1T和3T。1.1.5模拟算法变量说明:k临时变量,存储当前累计模拟次数count存储赶上火车的次数第1步输入模拟次数n第2步k=1,count=0第3步当k=n,执行第4步,否则执行第12步第4步生成均匀分布随机数赋给r第5步由r及公式确定T1模拟火车出发时刻第6步生成均匀分布随机数赋给r;第7步由r及公式确定T3模拟人达到时刻第8步生成正态分布随机数T2模拟火车运行时间第9步IFT1+T2T3,count=count+1,END第10步k=k+1第11步执行第3步第12步输出赶上火车频率p=count/n1.1.6模拟程序%sim_train.mtotal=input('输入模拟次数:');count=0;fori=1:total,%模拟随机变量t1(火车从A站出发的时刻)rt1=rand;ifrt10.7T1=0;elseifrt1=0.7&rt10.9T1=5;elseT1=10;end%模拟随机变量t2(火车的运行时间)T2=30+randn*2;%模拟随机变量t3(他到达B站的时刻)rt3=rand;ifrt30.3T3=28;elseifrt3=0.3&rt30.7T3=30;elseifrt3=0.7&rt30.9T3=32;elseT3=34;endifT3T1+T2,%赶上了count=count+1;endend%forprob=count/total1.1.7模拟结果命令行中输入以下语句:sim_train运行结果输出:输入模拟次数:100prob=0.6302此次运行结果显示赶上火车的近似概率为0.6左右。下面列表给出多次运行模拟程序的结果。序号模拟次数近似概率p15000.628025000.6920310000.6530410000.6490550000.6260650000.62881.1.8评价与改进方向为了计算赶上火车的概率,本文采用了随机系统模拟的方法。如果能够从模型出发,对赶上火车的概率进行近似计算,然后与模拟结果进行对比,这样模拟会更有说明力。1.1.9思考题(1)请思考用其它方法计算赶上火车的概率或近似概率。(2)如果要使得他赶上火车的概率大于95%,你有什么办法?结合上面的数学模型及模拟程序来思考。(3)通过该问题的建模求解,你能归纳出一般系统模拟的方法步骤么?实验案例理发店模拟1实验案例1.1案例:理发店模拟例子:一个理发店有两位服务员A和B,顾客们随机到达店内,其中60%的顾客仅需剪发,每位花5分钟时间,另外40%顾客既要剪发又要洗发,每位用时8分钟。理发店是个含有多种随机因素的系统,请对该系统进行模拟,并对其进行评判。(准备怎么做)可供参考内容“排队论”,“系统模拟”,“离散系统模拟”,“事件调度法”1.1.1问题分析理发店系统包含诸多随机因素,为了对其进行评判就是要研究其运行效率,从理发店自身利益来说,要看服务员工作负荷是否合理,是否需要增加员工等考虑。从顾客角度讲,还要看顾客的等待时间,顾客的等待队长,如等待时间过长或者等待的人过多,则顾客会离开。理发店系统是一个典型的排队系统,可以用排队论有关知识来研究。1.1.2模型假设1.60%的顾客只需剪发,40%的顾客既要剪发,又要洗发;2.每个服务员剪发需要的时间均为5分钟,既剪发又洗发则花8分钟;3.顾客的到达间隔时间服从指数分布;4.服务中服务员不休息。1.1.3变量说明u:剪发时间(单位:分钟),u=5m;v:既剪发又理发花的时间(单位:分钟),v=8m;T:顾客到达的间隔时间,是随机变量,服从参数为的指数分布,(单位:分钟)T0:顾客到达的平均间隔时间(单位:秒),T0=1;1.1.4模型建立由于该系统包含诸多随机因素,很难给出解析的结果,因此可以借助计算机模拟对该系统进行模拟。考虑一般理发店的工作模式,一般是上午9:00开始营业,晚上10:00左右结束,且一般是连续工作的,因此一般营业时间为13小时左右。这里以每天运行12小时为例,进行模拟。这里假定顾客到达的平均间隔时间T0服从均值3分钟的指数分布,则有3小时到达人数约为603603人,6小时到达人数约为1203606人,10小时到达人数约为20036010人,这里模拟顾客到达数为60人的情况。(如何选择模拟的总人数或模拟总时间)1.1.5系统模拟根据系统模拟的一般方法,需要考虑系统的如下数据、参数。1.状态(变量)(1)等待服务的顾客数;(2)A是否正在服务;(3)B是否正在服务;2.实体:两名服务员、顾客们3.事件:(1)一名新顾客的到达;(2)A开始服务;(3)A结束服务;(4)B开始服务;(5)B结束服务;4.活动:(1)顾客排队时间(2)顾客们到达的间隔时间(3)A的服务时间(4)B的服务时间;在系统模拟时,为了研究系统的整体情况,这里考虑顾客到达后不离开,且等待队长不限。要考虑如果服务员均空闲时,顾客先选择谁服务?要考虑模拟的时间设置还有顾客数目。模拟终止条件是根据顾客数目还是根据营业时间终止?1.1.6计算机模拟算法设计自行设计finished=0;初始化运行时钟whilefinished==0if产生的顾客数不到规定数目时then,产生该顾客的有关数据;将顾客加入等待队列;else运行时钟继续;endif处理服务员的状态(包括工作状态,空闲时间);获得服务员的服务优先顺序;根据服务员优先顺序从等待队列中安排服务;endwhile有无参考算法?离散系统仿真算法:事件调度法1.1.7计算机模拟程序顾客到达的间隔时间T的计算机产生方法,利用T=randTrandlnln10,%理发店系统的模拟(案例分析之一)%关键词:面向事件的计算机模拟技术clearallcurclock=0;%当前时刻,动态变化totalcustomer=0;%总共服务的顾客数numsrv=2;srvstatus=zeros(numsrv,5);%服务员有关数据%srvstatus第1列:服务状态(0空闲,1正在服务);第2列:当前服务顾客编号;%第3列:当前服务结束时刻;第4列:服务员空闲时间;第5列:服务的顾客总数endtime=0;%结束时间waiting=[];%等待队列数据%waiting第1列:顾客编号;第2列:顾客到达时刻;第3列:顾客开始接受服务时刻;%第4列:接受服务时间;第5列:顾客结束服务时刻;第6列:间隔时间cur=zeros(1,6);%当前产生顾客的数据,对应关系同waitingavgwaitlen=[];%平均等待队长avgwaittime=[];%平均等待时间ujiange=5;%平均间隔时间finished=0;numsimucustumer=yesinput('输入等待模拟的顾客数:',10,[101000]);whilefinished==0,iftotalcustomernumsimucustumer%产生一个顾客的到达及其有关性质的数据totalcustomer=totalcustomer+1;jiange=-log(rand)*ujiange;%与上一个顾客的到达的间隔时间curclock=curclock+jiange;cur(1)=totalcustomer;%第1列:顾客编号cur(2)=curclock;%第2列:顾客到达时刻cur(6)=jiange;第6列:间隔时间%下面产生接受服务时间(可改进模型)ifrand0.6,%产生顾客有关性质:这里是产生接受服务时间cur(4)=5;elsecur(4)=8;end%放入等待队列ifisempty(waiting),waiting=cur;else[m,n]=size(waiting);waiting(m+1,:)=cur;endelsecurclock=curclock+(-log(rand)*ujiange);end%iftotalcustomer%分配等待队列(看是否有服务员空闲,如果有则分配;否则继续执行)%处理服务员的服务状态fori=1:numsrv,ifsrvstatus(i,1)==1&srvstatus(i,3)=curclock,srvstatus(i,1)=0;%设置为空闲状态srvstatus(i,4)=curclock-srvstatus(i,3);%目前已经空闲的时间elseifsrvstatus(i,1)==1&srvstatus(i,3)curclock,srvstatus(i,4)=0;%没有休息(正在忙)elsesrvstatus(i,4)=curclock-srvstatus(i,3);%目前已经空闲的时间endend%处理服务员服务的先后顺序(依据空闲时间)(精细处理)tmp=srvstatus(:,4);fori=1:numsrv,[value,id]=max(tmp);b(i)=id;tmp(id)=0;%已经排序了end%此时等待队列必然不为空forj=1:numsrv,i=b(j);%确定服务员的序号if(srvstatus(i,1)==0)%找一个顾客开始服务,同时计算该顾客什么时候接受服务,结束服务;[m,n]=size(waiting);ifm==0,break;endifwaiting(1,5)==0,%还没有开始接受服务waiting(1,3)=curclock;waiting(1,5)=waiting(1,3)+waiting(1,4);%结束时刻srvstatus(i,1)=1;%设置为忙状态srvstatus(i,2)=waiting(1,1);%顾客编号srvstatus(i,3)=waiting(1,5);%结束时刻srvstatus(i,5)=srvstatus(i,5)+1;%又服务了一个顾客%计算等待时间avgwaittime(end+1)=waiting(1,3)-waiting(1,2);disp(sprintf('间隔时间(%8.2f)顾客编号:%5d接受服务员(%4d)服务(到达时刻%10.2f)',waiting(1,6),waiting(1,1),i,waiting(1,2)))endtime=max(endtime,waiting(1,5))waiting(1,:)=[];%从等待队列中离开endend%ifend%for[m,n]=size(waiting);%计算队长(这里的计算式子可以参考排队论有关术语进行确定)iftotalcustomernumsimu