⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simulation of queue mmcc.cpp

📁 电路交换系统的阻塞率仿真与理论比较。有详细的报告。报告中有Erlang公式推导过程和比较曲线。
💻 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 + -