系统模拟实验的三个案例.docx
- 文档编号:4447207
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:15
- 大小:45.53KB
系统模拟实验的三个案例.docx
《系统模拟实验的三个案例.docx》由会员分享,可在线阅读,更多相关《系统模拟实验的三个案例.docx(15页珍藏版)》请在冰豆网上搜索。
系统模拟实验的三个案例
系统模拟实验的三个案例
实验案例赶上火车的概率
1实验案例
1.1赶上火车的概率
1.1.1问题描述
如图,一列火车从A站开往B站,某人每天赶往B站上这趟火车。
他已了解到:
(1)火车从A站到B站的运行时间是均值为30分钟,标准差为2分钟的随机变量;
(2)火车在下午大约1点离开A站,离开时刻的频率分布如下:
出发时刻
午后1:
00
午后1:
05
午后1:
10
频率
0.7
0.2
0.1
此人到达B站的时刻频率分布为:
时刻
午后1:
28
午后1:
30
午后1:
32
午后1:
34
频率
0.3
0.4
0.2
0.1
问他能赶上火车的概率是多少?
1.1.2变量说明
T1:
火车从A站出发的时刻;
T2:
火车从A站到B站的运行时间;单位:
分钟
T3:
他到达B站的时刻
1.1.3问题分析与假设
此问题包含多个随机因素。
这里假设「,T2,T3都是随机变量,其中T2服从正态分布。
1.1.4模型建立
很显然,他能及时赶上火车的条件是:
T3:
:
:
T1T2。
为了简化计算,将下午1点记为
初始时刻。
T1和%的分布律如下:
丁1/min
0
5
10
P(t)
0.7
0.2
0.1
丁3/min
28
30
32
34
P(t)
0.3
0.4
0.2
0.1
为了模拟随机变量。
如果r为在(0,1)均匀分布的随机数,为了模拟随机变量T1,T3,可
以通过如下方法。
'28,0兰rc0.3
P,0兰rc0.730,0.3兰rc0.7
t3=彳
^=<5,0.7兰rc0.9'32,0.7Er<0.9
10,0.9兰r兰1,34,0.9兰r兰1.0
其中,ti和t3分别用来模拟随机变量Ti和T3。
1.1.5模拟算法
变量说明:
k临时变量,存储当前累计模拟次数
count存储赶上火车的次数
第1步输入模拟次数n
第2步k=1,count=O
第3步当k<=n,执行第4步,否则执行第12步
第4步生成均匀分布随机数赋给r
第5步由r及公式确定T1模拟火车出发时刻
第6步生成均匀分布随机数赋给r;
第7步由r及公式确定T3模拟人达到时刻
第8步生成正态分布随机数T2模拟火车运行时间
第9步IFT1+T2>T3,count=count+1,END
第10步k=k+1
第11步执行第3步
第12步输出赶上火车频率p=count/n
1.1.6模拟程序
%sim_train.m
total=input('输入模拟次数:
');count=0;
fori=1:
total,
%莫拟随机变量t1(火车从A站出发的时刻)rt1=rand;
ifrt1<0.7
T仁0;
elseifrt1>=0.7&rt1<0.9
T仁5;
else
T1=10;
end
%莫拟随机变量t2(火车的运行时间)
T2=30+randn*2;
%莫拟随机变量t3(他到达B站的时刻)
rt3=rand;
ifrt3<0.3
T3=28;
elseifrt3>=0.3&rt3<0.7
T3=30;
elseifrt3>=0.7&rt3<0.9
T3=32;
else
T3=34;
end
ifT3 count=count+1; end end%for prob=count/total 1.1.7模拟结果 命令行中输入以下语句: sim_train 运行结果输出: 输入模拟次数: 100 prob= 序号 模拟次数 近似概率p 1 500 0.6280 2 500 0.6920 3 1000 0.6530 4 1000 0.6490 5 5000 0.6260 6 5000 0.6288 0.6302 此次运行结果显示赶上火车的近似概率为0.6左右。 下面列表给出多次运行模拟程序的 1.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. 2. 3. 4. 1.1.3变量说明 60%的顾客只需剪发,40%的顾客既要剪发,又要洗发; 每个服务员剪发需要的时间均为5分钟,既剪发又洗发则花8分钟; 顾客的到达间隔时间服从指数分布; 服务中服务员不休息。 u: 剪发时间(单位: 分钟),u=5m; v: 既剪发又理发花的时间(单位: 分钟),v=8m T: 顾客到达的间隔时间,是随机变量,服从参数为’的指数分布,(单位: 分钟) To: 顾客到达的平均间隔时间(单位: 秒),To='; 1.1.4模型建立 由于该系统包含诸多随机因素,很难给出解析的结果,因此可以借助计算机模拟对该系统进行模拟。 考虑一般理发店的工作模式,一般是上午9: 00开始营业,晚上10: 00左右结束,且 一般是连续工作的,因此一般营业时间为13小时左右。 这里以每天运行12小时为例,进行模拟。 这里假定顾客到达的平均间隔时间T0服从均值3分钟的指数分布, 则有 这里模拟顾客到达数为60人的情况。 (如何选择模拟的总人数或模拟总时间) 1.1.5系统模拟 根据系统模拟的一般方法,需要考虑系统的如下数据、参数。 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=O; 初始化运行时钟 whilefinished==0 then, if产生的顾客数不到规定数目时 产生该顾客的有关数据;将顾客加入等待队列; else 运行时钟继续; endif 处理服务员的状态(包括工作状态,空闲时间)获得服务员的服务优先顺序; 根据服务员优先顺序从等待队列中安排服务; endwhile 有无参考算法? 离散系统仿真算法: 事件调度法 T= %理发店系统的模拟(案例分析之一)%关键词: 面向事件的计算机模拟技术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);%当前产生顾客的数据,对应关系同waiting avgwaitlen=[];%平均等待队长 avgwaittime=[];%平均等待时间 ujiange=5;%平均间隔时间 finished=0; numsimucustumer=yesinput('输入等待模拟的顾客数: ',10,[101000]); whilefinished==0, iftotalcustomer 沪生一个顾客的到达及其有关性质的数据 totalcustomer=totalcustomer+1; jiange=-log(rand)*ujiange;%与上一个顾客的到达的间隔时间 curclock=curclock+jiange; cur (1)=totalcustomer;%第1列: 顾客编号 cur (2)=curclock;%第2列: 顾客到达时刻 cur(6)=jiange;第6列: 间隔时间 %F面产生接受服务时间(可改进模型) ifrand<0.6,%产生顾客有关性质: 这里是产生接受服务时间 cur(4)=5; else cur(4)=8; end %放入等待队列 ifisempty(waiting), waiting=cur; else [m,n]=size(waiting); waiting(m+1,: )=cur; end else curclock=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;%没有休息(正在忙) else srvstatus(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; end if waiting(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接受服务员(%4c)服务(到 达时刻%10.2f)',waiting(1,6),waiting(1,1),i,waiting(1,2))) endtime=max(endtime,waiting(1,5)) waiting(1,: )=[];%从等待队列中离开 end end%ifend%for [m,n]=size(waiting); %计算队长(这里的计算式子可以参考排队论有关术语进行确定) iftotalcustomer avgwaitlen(end+1)=m; end ifsum(srvstatus(: 5))>=numsimucustumer,%队列为空,结束 finished=1; endend%while disp('服务顾客数: ') disp(srvstatus(: 5)') disp('平均队长'); disp(mean(avgwaitlen)); disp('运行时间(分钟,小时)’); disp(sprintf('%8.f%8.f,curclock,curclock/60)); disp('平均等待时间(分钟)’); disp(mean(avgwaittime)); disp('结束时间(分钟)’); disp(endtime); figurehist(avgwaitlen)title('平均队长')figure hist(avgwaittime)title('平均等待时间'); 1.1.8思考题 请运行模拟程序,并分析运行结果。 实验案例一个修理厂的模拟 1实验案例 1.1案例: 一个修理厂的模拟1.1.1问题描述 某修理厂设有3个停车位置,其中一个位置供正在修理的汽车停放。 现以一天为一个时 段,每天最多修好一辆车,每天到达修理站的汽车数有如下概率分布: 到达数 0 1 2 概率 0.6 0.2 0.2 假定在一个时段内一辆汽车能够修好的概率为0.7,本时段内未能完成修理的汽车于正 在等待修理的汽车一起进入下一时段。 试问: 该停车厂有无必要增加停车位置,并说明理由。 1.1.2模拟模型 这种排队论方面的问题采用固定时间增量法模拟。 模拟以一天为一个时段,模拟纵 时间最好在1000天以上。 模拟汽车到达数量,根据概率分布: 产生在[0,1]上均匀分布的随机数t,如果t一0且t: : : 0.6,则认为当天到达的车辆数为0辆;如果t-0.6且t: : : 0.8,则认为当天到达的车辆数为1辆,如果t-°.8且t门,则认为当天到达的车辆数为2辆。 模拟修理情况: 由于一天最多修好一辆,而一个时段内一辆汽车修好的概率为0.7, 则模拟每两车的修理情况,如果这些车所能修好数目大于等于1辆,则以当天修好1辆计。 1.1.3模拟程序 本模拟程序编写了一个主函数queue,另外在函数queue中编写了2个子函数: getcome: 模拟车辆到来情况,返回当天到来的车辆数目 getrepaired: 模拟修理情况,返回修好的车辆数目 整个模拟程序如下: (2005/6/6新版本) functionqueue %2005-6-6 %排队模拟主程序 %排队问题模拟 % numdays=input('请输入模拟天数: ') numstay=0;%假定最初修理站还没有待修理的汽车 LEN=6;%t义常量 matfrequence=zeros(1,LEN);%第i个元素表示当天末还有i-1辆车在没有修好的时段频数 leave_norepair=0;%存储来到,但没有停车位置而离开的车辆数 fordays=1: numdays泣循环,模拟numdays个时段 temp=getcome; ifnumstay+temp>3, leave_norepair=leave_norepair+(numstay+temp-3); end %numcome=numstay+getcome;%2004-10-10: 这里有问题,受限制与停车位置数量 numcome=min(3,numstay+temp);% %头一天还没有修好的车辆数+当天新到来的车辆数 %numstay表示当天末还没有修理好的车辆数目 numstay=max(0,numcome-getrepaired(numcome));% matfrequence(numstay+1)=matfrequence(numstay+1)+1; end matfrequence prob=matfrequence/numdays disp(sprintf('平均每天夜里停放在修理站的车辆数=%4.2f',... sum(matfrequence/numdays.*[0: LEN-1])))%sprintf('=%.4f',sum(matfrequence/numdays.*[0: LEN-1]))disp(sprintf('平均每天因位置而未修理而离开修理站的车辆数=%4.2f',... leave_norepair/numdays))%sprintf('=%.4f',leave_norepair/numdays)leave_norepair functionnum=getcome %模拟车辆到来情况,返回当天到来的车辆数目 t=rand; ift>=0&t<0.6 num=0;%当天到来车俩数为0辆 elseift>=0.6&t<0.8 num=1;%当天到来车俩数为1辆 else num=2;%当天到来车俩数为2辆 end functionr=getrepaired(num_cur) %模拟修理情况,返回修好的车辆数目 %门为需要修理的车辆数目 %r为n辆车修好了r辆 %num_cur当前(天)车辆数 r=0; ifnum_cur<=0,%如果根本没有车,当然就没有修好车 return end %只考虑当前正在修的这辆车是否能够修好 ifrand<0.7,%(0,0.7)认为修好,[0.7,1)认为没有修好 r=1; end 1.1.4模拟结果 程序运行结果如下: 请输入模拟天数: (100): 10000 numdays= 10000 matfrequenee= 42302729237566600 prob= 0.42300.27290.23750.066600 平均每天夜里停放在修理站的车辆数=0.95 平均每天因位置而未修理而离开修理站的车辆数=0.09 leave_norepair= 883 模拟10000次的结果如下表所示: 留夜的车辆数 0 1 2 3 频数 4230 2729 2375 666 频率 0.4230 0.2729 0.2375 0.0666 最后得到平均每天夜里停放在修理站的车辆数约为0.95辆。 因此从这个结果分析可以 初步认为: “不必要增加车位”或“增加车位必要性不大”。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 系统 模拟 实验 三个 案例