📄 queueing4.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 + -