资源描述
计算机仿真
单服务员单队列系统仿真实验
班 级: 机设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
展开阅读全文