收藏 分销(赏)

-合肥工业大学-单服务员单队列系统仿真.doc

上传人:精**** 文档编号:2110350 上传时间:2024-05-16 格式:DOC 页数:12 大小:20.94KB 下载积分:8 金币
下载 相关 举报
-合肥工业大学-单服务员单队列系统仿真.doc_第1页
第1页 / 共12页
-合肥工业大学-单服务员单队列系统仿真.doc_第2页
第2页 / 共12页


点击查看更多>>
资源描述
计算机仿真 单服务员单队列系统仿真实验 班 级: 机设13-4班 学 号: 2013210360 姓 名: 杨 尚 武 授课教师: 翟 华 日 期: 2016年4月13日 实验二 单服务员单队列系统仿真实验 一、 实验目的 通过实验了解离散事件系统仿真一般过程,了解离散事件系统中典型的单服务员单队列系统的仿真一般过程,了解不同分布随机数的计算机实现过程,了解事件扫描法在离散事件系统中的应用。 二、实验要求 通过实验了解离散事件系统仿真一般过程,了解离散事件系统中典型的单服务员单队列系统的仿真一般过程,了解不同分布随机数的计算机实现过程,了解事件扫描法在离散事件系统中的应用。 同学能在参考源程序的基础上,独立编写C源程序,或其他高级语言程序,能正确计算仿真结果,并对结果进行分析。 三、参考C语言程序 #include "stdio.h" #include "math.h" FILE * fp; float seed; int sstop,ip; float miat,msvt,svt; float tval,tlq,tmen; float sigma,time,lqt,lst,tle; float wkst[100]; float b,mq,s,f,nd,ts,is,ta,ia,clock,fel[3]; int imevt,numevs; void rptgen() //报告生成子程序 { float rho,w,pc,amts,amta,lq,l,wq; rho=b/clock; w=s/nd; pc=f/nd; amts=ts/is; amta=ta/ia; lq=tlq/clock; l=tmen/clock; wq=tlq/nd; if((fp=fopen("fz22","wb"))==NULL) {printf("cannot open file\n"); } printf("time=%f\n",time); fprintf(fp,"miat=%f,msvt=%f,sigma=%f,time=%f\n",miat,msvt,sigma,time); fprintf(fp,"rho=%f,mq=%f,pc=%f,clock=%f\n",rho,mq,pc,clock); fprintf(fp,"nd=%f,amts=%f,amta=%f\n",nd,amts,amta); fprintf(fp,"lq=%f,l=%f,wq=%f,w=%f\n",lq,l,wq,w); } float rand() //随机数生成子程序 {float a,c,m; float rand1; a=25173.0; c=13849.0; m=65535.0; seed=(seed*a+c)-m*(int)((seed*a+c)/m); if(seed==0.0) seed=1.0; rand1=seed/m; return rand1; } float normal(float ex,float stdx) //正态分布随机数生成子程序 //float ex,stdx; {float sum,x; int i; float r; sum=0.0; for(i=1;i<=12;i++) {r=rand(); sum=sum+r;} x=stdx*(sum-6.0)+ex; printf=(“normal=%\n”,x); return x; } float expent(float ex) //指数分布随机数生成子程序 {float r,x; r=rand(); x=-ex*log(r); return x; } void initlz() //系统初始化子程序 {float aat; clock=0.0; //置仿真时钟为.0 imevt=0; //假定系统在时间为空闲 lqt=0.0; //置以下各统计量初值为 lst=0.0; tle=0.0; b=0.0; mq=0.0; s=0.0; f=0.0; nd=0.0; ts=0.0; is=0.0; ta=0.0; ia=0.0; tlq=0.0; tmen=0.0; aat=expent(miat); fel[1]=clock+aat; //产生第一次到达,并安排在FEL() fel[2]=1.0e+30; //置FEL()为无穷大,表示系统空闲时,不会发生离开事件 } void timadv() //时间推进子程序 { float fmin; int i; fmin=1.0e+29; imevt=0; for (i=1;i<=numevs;i++) //搜索FEL以找出下一事件 { if(fel[i]>=fmin) continue; fmin=fel[i]; imevt=i; } if(imevt>0) //判断有无将来事件 {clock=fel[imevt]; //设定仿真时钟为下一事件时间,事件将在时间FEL(IMEVT)发生 tval=clock-tle; tlq=tlq+lqt*tval; tmen=tmen+(lqt+lst)*tval; } else { rptgen(); //若将来事件为空,调用报告子程序 sstop=1; } } void arrvl() //到达事件子程序 { float aat,svt; if(lst==1.0) goto loop2; //检查服务员是否被占 lst=1.0; //若服务员空闲,修改系统状态并记录新的顾客的到达时间 wkst[ip]=clock; svt=normal(msvt,sigma); //为新到达顾客产生服务时间并安排离开事件 fel[2]=clock+svt; ts=ts+svt; is=is+1.0; //修改累积统计量 tle=clock; if(lqt>mq)mq=lqt; goto loop3; loop2: lqt=lqt+1.0; //若服务员被占,修改系统状态,记录新的顾客到达时间及系统中顾客数 ip=lqt+lst; if(ip>100) goto loop4; //现设系统容量为人,若超过即给出报告 wkst[ip]=clock; b=b+(clock-tle); //修改累积统计量 tle=clock; if(lqt>mq) mq=lqt; loop3: aat=expent(miat); //产生一个到达时间间隔并安排下一到达事件 ta=ta+aat; ia=ia+1.0; fel[1]=clock+aat; goto loop31; loop4: printf("overflow in array wkst"); rptgen(); sstop=1; loop31:return; } void dpart() //离开事件子程序 { int i,i1; float rt,svt; b=b+(clock-tle); //修改累积统计量 tle=clock; rt=clock-wkst[ip]; s=s+rt; nd=nd+1.0; if(rt>=4.0)f=f+1.0; //记录(累计)停留时间大于等于的顾客数 if(lqt>1.0) //检查队列空否 { for(i=1;i<=lqt;i++) {i1=i+1; //此时至少有一个顾客在队列中,使每个顾客向前移动一个位置 wkst[i]=wkst[i1]; } lqt=lqt-1.0; //队列中的顾客数减 svt=normal(msvt,sigma); //对将被服务的顾客产生一个新的服务,时间且安排下一个 //离开事件 fel[2]=clock+svt; } else { //队列空,服务员空闲,下一离开事件置在无穷大时间 lst=0.0; fel[2]=1.0e+30;} } void main() //主程序 { ip=0; seed=2.0; //输入随机数种子 miat=10.0; // msvt=3.0; sigma=1.0; time=500.0; numevs=2; //确定事件总数为 initlz(); //调用初始化子程序 sstop=0; //程序终止变量,sstop=0,程序循环,sstop=1,程序终止 loop: timadv(); //调用时间推进子程序 if(sstop==1) goto loopp; //判断sstop=1,程序终止 if (imevt==1) //IMEVT=1为到达,IMEVT=2为离开 {arrvl(); //调用到达事件子程序 if(sstop==1) goto loopp; //判断sstop=1,程序终止 goto loop; //程序循环执行 } if (imevt==2) dpart(); //调用离开事件子程序 if (clock<time) goto loop; //判断仿真是否结束,若未结束继续循环执行 rptgen(); //当仿真结束时生成报告输出 loopp:return; } 四、实验报告 1.给出RAND()子程序输出的10个数据,以及对应的符合正态分布和指数分布的随机数。 1 2 3 4 5 RAND() 0.979553 0.664057 0.504250 0.527916 0.193561 NORMAL() 2.9767 2.4904 3.0001 2.6499 3.2569 EXPENT() 0.2066 4.0939 6.8468 6.3882 16.4216 6 7 8 9 10 RAND() 0.959777 0.683238 0.084337 0.162432 0.080400 NORMAL() 2.9658 4.5799 3.7783 1.6343 6.6180 EXPENT() 0.4105 3.8091 24.7294 18.1749 25.2074 2.分别输入下列三组数据,给出相应的计算结果(包括服务员忙度、平均服务时间、平均到达间隔时间、顾客在系统中平均时间、系统中平均顾客数、队列中平均顾客数、停留4个小时单位以上的顾客比例等),并加以文字说明。 (1)输入数据为: MIAT=10,MSVT=5,SIGMA=2,TIME=100 计算结果为: 平均到达间隔时间miat=10.000000 平均服务时间msvt=5.000000 服务时间标准差sigma=2.000000 仿真停止时间time=100.000000 服务员忙度rho=0.482677 到当前时间为止等待队列的最大长度mq=2.000000 停留4个小时单位以上的顾客比例pc=0.454545 仿真时钟当前时间clock=114.048820 到当前时间为止离开的顾客数nd=11.000000 平均服务时间amts=4.362051 平均到达间隔时间amta=9.973741 队列中平均顾客数lq=1.026730 系统中平均顾客数l=1.509407 顾客在队列中平均时间wq=10.645217 顾客在系统中平均时间w=3.600372 (2)输入数据为: MIAT=10,MSVT=3,SIGMA=1,TIME=100 计算结果为: 平均到达间隔时间miat=10.000000 平均服务时间msvt=3.000000 服务时间标准差sigma=1.000000 仿真停止时间time=100.000000 服务员忙度rho=0.242204 到当前时间为止等待队列的最大长度mq=1.000000 停留4个小时单位以上的顾客比例pc=0.111111 仿真时钟当前时间clock=108.105759 到当前时间为止离开的顾客数nd=9.000000 平均服务时间amts=2.909301 平均到达间隔时间amta=11.269994 队列中平均顾客数lq=0.682092 系统中平均顾客数l=0.924297 顾客在队列中平均时间wq=8.193123 顾客在系统中平均时间w=2.863684 (3)输入数据为: MIAT=10,MSVT=30,SIGMA=2,TIME=100 计算结果为: 平均到达间隔时间miat=10.000000 平均服务时间msvt=30.000000 服务时间标准差sigma=2.000000 仿真停止时间time=100.000000 服务员忙度rho=0.998272 到当前时间为止等待队列的最大长度mq=8.000000 停留4个小时单位以上的顾客比例pc=1.000000 仿真时钟当前时间clock=119.530281 到当前时间为止离开的顾客数nd=4.000000 平均服务时间amts=29.953489 平均到达间隔时间amta=9.972269 队列中平均顾客数lq=5.037513 系统中平均顾客数l=6.035784 顾客在队列中平均时间wq=150.533829 顾客在系统中平均时间w=15.594049
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服