📄 simulation of queue mmcc.cpp
字号:
//本程序用于M/M/C/C系统的阻塞率仿真计算
#include "stdio.h"
#include "math.h"
#define znew (z=36969*(z&65535)+(z>>16))
#define wnew (w=18000*(w&65535)+(w>>16))
#define MWC ((znew<<16)+wnew )
#define SHR3 (jsr^=(jsr<<17), jsr^=(jsr>>13), jsr^=(jsr<<5))
#define CONG (jcong=69069*jcong+1234567)
#define KISS ((MWC^CONG)+SHR3) //用KISS算法生成U(0,1)分布随机数
#define NUM 50000 //每次仿真到达的总用户数
typedef unsigned long UL;
static UL z=362436069, w=521288629, jsr=123456789, jcong=380116160;//全局静态变量
void settable(UL i1,UL i2,UL i3,UL i4) //数表初始化函数
{ z=i1;
w=i2,
jsr=i3;
jcong=i4;
}
double expo(float lamda) //生成参数为lamda的指数分布随机数
{ UL k;
double U01;
k=KISS;
U01=(double)(k-1372460312U)/4294967296;
return(-lamda*log(1-U01));
}
double theory(float arrival_rate,float server_rate,int capacity) //应用Erlang公式计算阻塞率的理论值
{long double a,factor=0,block,c=1,temp=1;
int i,j;
a=arrival_rate/server_rate;
for(i=capacity;i>0;i--)
c=c*i;
for(i=1;i<=capacity;i++)
{
temp=1;
for(j=i;j>0;j--)
temp=temp*j;
factor=factor+pow(a,i)/temp;
}
block=pow(a,capacity)/(c*factor);
return(block);
}
void main() //主函数
{
int i,j,resource,capacity; //resource剩余资源数,capacity系统容量
float arrival_rate,server_rate,lamda,mu,block_probability,block;
double interarrival,holdtime,a[500];
FILE *out,*out2,*out3; //输出文件指针
settable(12345,65435,34221,12345); //对KISS数表进行初始化
arrival_rate=3600; //到达率(单位时间为小时)
server_rate=20; //服务率
lamda=1/arrival_rate; //到达时间间隔
mu=1/server_rate; //每个用户的保持时间
out=fopen("block.txt","w");
out2=fopen("capacity.txt","w");
out3=fopen("theory.txt","w");
for(capacity=1;capacity<=231;capacity+=10) //统计各种不同容量的情况
{
resource=capacity;
for(i=0;i<capacity;i++)
a[i]=0;
block=0;
for(j=0;j<NUM;j++)
{
interarrival=expo(lamda); //生成参数为lamda的指数分布随机数,代表用户到达时间间隔
holdtime=expo(mu); //生成参数为mu的指数分布随机数,代表该用户的通话时间
for(i=0;i<capacity;i++) //判断是否有用户离开,有则释放资源
if(a[i]!=0)
{
a[i]=a[i]-interarrival;
if(a[i]<=0) //每次有一个用户离开,则资源数加1
{
a[i]=0;
resource++;
}
}
if(resource==0) //没有资源时,阻塞次数加1,等待下一个用户到达
{
block++;
continue;
}
for(i=0;i<capacity;i++) //有资源时,把该用户的通话时间记录到数组c[i]
if(a[i]==0)
{
a[i]=holdtime;
resource--; //资源数减1
break;
}
}
fprintf(out2,"%d\n",capacity); //分别输出容量与它对应的理论阻塞率和仿真阻塞率
block_probability=block/NUM;
fprintf(out,"%f\n",block_probability);
fprintf(out3,"%f\n",theory(arrival_rate,server_rate,capacity));
printf("capacity %d success %f %f\n",capacity,block_probability,theory(arrival_rate,server_rate,capacity));
}
fclose(out); //关闭文件
fclose(out2);
fclose(out3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -