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

📄 queueing4.cpp

📁 N个并列的单通道等待制系统
💻 CPP
字号:
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <fstream.h>
#include <iomanip.h>


double  Sequence(double T,double r1,double u1,int N,ostream&out);

void main()
{
	srand( (unsigned)time(NULL));      //随机数播种
	int N;  //输入服务员的数目
	cout<<"Please input the number of server (positive number):  ";
	cin>>N;
 
/*
   取系统的负荷p=0.3,设顾客的到达流强度r=6,每个服务员的的服务强度u=20
                       (p=r/u)
   顾客到达间隔为指数分布f(t)=6e^(-6t)   服务时间分布f1(t)=20e^(-20t)

*/
   double r1=6.6;                       //顾客到达流强度
   double u1=20.0;	                   //服务员服务强度
   double T=4.0;                       //终止条件
   double sum=0.0;
   double ave=0.0;                      //顾客平均等待时间
/*
   取系统的负荷p=0.7,设顾客的到达流强度r=7,每个服务员的的服务强度u=10
                       (p=r/u)
   顾客到达间隔为指数分布f(t)=7e^(-7t)   服务时间分布f1(t)=10e^(-10t)

*/
   double r2=7.0;                       //顾客到达流强度
   double u2=10.0;	                   //服务员服务强度

/* 
  模拟顺序排入服务窗口情况,调用函数Sequence()6次,取其平均数
  p=0.3
*/

   ofstream out("D:\\result4.txt");
   out<<"服务员数目N="<<N<<"           ";
   out<<"参数选择为: "<<"p=0.3   "<<"到达流强度r=6 ,   "<<"服务强度u=20"<<endl;

  for(int i=0;i<6;i++)
  {
	out<<"第"<<i+1<<"轮模拟"<<endl;
//    sum+=NoSeperate(T,r1,u1,N,out);
    out<<"顾客序号"<<" "<<"随机数R1"<<" "<<"到达间隔"<<" "
		<<"到达时间"<<"       "<<"随机数R2"<<" "<<"服务时间"<<"  "
		<<"结束时间"<<"  "<<"等待时间"<<endl;
	sum+=Sequence(T,r1,u1,N,out);
	
  }
  ave=sum/6;
   out<<"总的平均等待时间为:  "<<ave<<endl;
   out<<endl;
/* 
  模拟顺序排入服务窗口情况,调用函数Sequence()6次,取其平均数
  p=0.7
*/

out<<"******************************************************************************************************************************"<<endl;
out<<"服务员数目N="<<N<<"           ";
out<<"参数选择为:"<<"p=0.7  "<<"到达流强度r=7 ,  "<<"服务强度u=10"<<endl;

  for(i=0;i<6;i++)
  {
	out<<"第"<<i+1<<"轮模拟"<<endl;
        out<<"顾客序号"<<" "<<"随机数R1"<<" "<<"到达间隔"<<" "
			<<"到达时间"<<"       "<<"随机数R2"<<" "<<"服务时间"<<"  "
	    	<<"结束时间"<<"  "<<"等待时间"<<endl;
	sum+=Sequence(T,r2,u2,N,out);
	
  }
  ave=sum/6;
   out<<"总的平均等待时间为:  "<<ave<<endl;
}

double Sequence(double T,double r,double u,int N,ostream&out){
   //分配堆内存,生成长度为服务员个数的数组,存放每个服务员的下一空闲时刻  
   double * st;
   if((st=new double[N])==NULL)
   {
    cout<<"can't allocate memory,terminate.\n";
	exit(1);
   }
   for(int count=0;count<N;count++)   //初始为0
	  st[count]=0;

   double time=0;                          //系统的绝对时钟,初始为0
   int numberOfClient=0;                  //系统到达的顾客总数
   double CRT1=0.0;                        //顾客的到达间隔                       
   double CRT2=0.0;                        //顾客的服务时间
   double random=0.0;                      //生成的0—1之间的随机数
   int j=0;                               //当前进入排队窗口的服务员编号j 
   double totalWaitTime=0.0;               //记录系统中到达顾客的总的等待时间

   while(1)
   {
	 random=(double(rand() %100))/100;       //生成0-1间的随机数,但不能为0
	 while(random==0)
	 {
	  random=(double(rand() %100))/100;
	 }

	 CRT1=(log(1/random))/r;                  //模拟顾客到达的时间间隔
	 
	 time=CRT1+time;                           //更新系统绝对时钟

	if (time<T)                                //有服务员空闲
	{
      
      numberOfClient++;                        //系统顾客数加1 
	 
	  out<<setw(3)<<numberOfClient<<" ";            //输出顾客编号
      out<<setw(10)<<random<<" ";                  //输出模拟到达间隔所取的随机数
	  out<<setw(10)<<CRT1<<" ";                    //输出顾客到达间隔
	  out<<setw(10)<<time<<" ";                    //输出顾客到达时间

	  random=(double(rand() %100))/100;        //生成0-1间的随机数,但不能为0
	   while(random==0)
	 {
	  random=(double(rand() %100))/100;
	 }

	   CRT2=(log(1/random))/u;                  //模拟顾客的服务时间

     out<<setw(10)<<random<<" ";                  //输出模拟服务时间所取的随机数
     out<<setw(10)<<CRT2<<" "; 

	 //按1..N的顺序循环排入服务员窗口
	 j=numberOfClient%N;

	 //当前j号服务员空闲,则直接接收服务
	 if(st[j]<=time)
	   {
         st[j]=time+CRT2;
         out<<setw(10)<<st[j]<<" ";                  //输出服务终了时刻
         out<<setw(10)<<"0"<<endl;                 //输出等待时间为0
	   }
	 else{//所有服务员都在忙着,顾客要排队等候
		  
		   totalWaitTime+=st[j]-time;  //st[j]-time为该顾客排队等待的时间
		   out<<setw(10)<<st[j]+CRT2<<" ";                  //输出服务终了时刻
		   out<<setw(10)<<st[j]-time<<endl;         //输出顾客的等待时间
		   st[j]+=CRT2;

		   }
	}
	else{//超出模拟的时间,终止
		
         break;
	}
 }
  delete[]st;
  out<<"顾客总的等待时间为:"<<"  "<< totalWaitTime<<endl;
  out<<"平均等待时间为:"<<"  "<<totalWaitTime/numberOfClient<<endl;
  out<<endl;
 // double totalWaitTime1=totalWaitTime*10;
  return totalWaitTime/numberOfClient;   //返回顾客平均等待时间
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -