Bank Service Simulation ——队列的应用
之前上学期间的作业,但当时没有用类来封装起来,所以打算重写,结果发现自己之前要写4,5个小时,现在居然两个小时就搞定了,但还有缺点,test函数太长,算法的核心部分其实没有封装起来,跪求大神指点。
以下是代码实现:
//RANDOM.h
#ifndef RANDOM_H
#define RANDOM_H
class Random
{
public:
Random(bool pseudo = true);
// Declare random-number generation methods here.
int random_integer(int low, int high);
double random_real();
int poisson(double mean);
private:
int reseed(); // Re-randomize the seed.
int seed,
multiplier, add_on; // constants for use in arithmetic operations
};
#endif
//RANDOM.cpp
#include <limits.h>
const int max_int = INT_MAX;
#include <math.h>
#include <time.h>
#include "Random.h"
Random::Random(bool pseudo)
/*
Post: The values of seed, add_on, and multiplier
are initialized. The seed is initialized randomly only if
pseudo == false.
*/
{
if (pseudo) seed = 1;
else seed = time(NULL) % max_int;
multiplier = 2743;
add_on = 5923;
}
double Random::random_real()
/*
Post: A random real number between 0 and 1 is returned.
*/
{
double max = max_int + 1.0;
double temp = reseed();
if (temp < 0) temp = temp + max;
return temp / max;
}
int Random::random_integer(int low, int high)
/*
Post: A random integer between low and high (inclusive)
is returned.
*/
{
if (low > high) return random_integer(high, low);
else return ((int) ((high - low + 1) * random_real())) + low;
}
int Random::poisson(double mean)
/*
Post:
A random integer, reflecting a Poisson distribution
with parameter mean, is returned.
*/
{
double limit = exp(-mean);
double product = random_real();
int count = 0;
while (product > limit) {
count++;
product *= random_real();
}
return count;
}
int Random::reseed()
/*
Post:
The seed is replaced by a psuedorandom successor.
*/
{
seed = seed * multiplier + add_on;
return seed;
}
//Service.h
#ifndef SERVICESYSTEM_H
#define SERVICESYSTEM_H
struct Customer
{
int num;
int served_time;
int wating_time;
};
class Service
{
public:
//构造函数
Service();
//判断服务窗口是否处于空闲状态
bool Is_idle() const;
//当前服务顾客的信息,即更新每个时刻的状态
void Customer_Information(Customer a);
//重载
void Customer_Information();
//当前处理人数的叠加
void Customer_add();
//窗口处理服务的总人数
int Customer_amount() const;
//窗口累积服务的总时间
int Customer_Serve_time() const;
//顾客的等待时间
int Customer_Wait_time() const;
//输出当前的状态
void Service_state();
private:
bool state;
Customer customer;
int amount;
int servicing_time; //服务顾客的总时间累积
};
#endif
//Service.cpp
#include "Service.h"
#include <iostream>
using namespace std;
Service::Service()
{
state = true; //起初处于空闲状态
amount = 0;
servicing_time = 0;
}
bool Service::Is_idle() const
{
return state;
}
void Service::Customer_add()
{
amount++;
}
void Service::Customer_Information(Customer a)
{
customer = a;
Customer_add();
state = false;
customer.served_time--;
servicing_time++;
Service_state();
if(!customer.served_time)
state = true;
}
void Service::Customer_Information()
{
customer.served_time--;
servicing_time++; //每次所服务顾客时间的减少,同时也是服务时间的累积
Service_state();
if(!customer.served_time)
state = true;
}
int Service::Customer_amount() const
{
return amount;
}
int Service::Customer_Serve_time() const
{
return servicing_time;
}
int Service::Customer_Wait_time() const
{
return customer.wating_time;
}
void Service::Service_state()
{
if(state)
cout << "处于空闲状态。" << endl;
else
{
cout << "正在处理号码为" << customer.num << "的业务。" << endl;
}
}
//test.cpp
#include <iostream>
#include <queue>
#include <vector>
#include <list>
#include "Random.h"
#include "Service.h"
using namespace std;
int main()
{
Random r(true);//Sample could be repeated.
//初建5个服务窗口,同时调用默认构造函数
Service windows[5] = {Service(),Service(),Service(),Service(),Service()};
int Time;
int record = 0;
int Total_amount = 0;
double Total_Serve_time = 0;
double Total_Wait_time = 0;
queue<Customer> Queue;
//没办法,他要求要得出顾客等待的平均时间
list<Customer> Waiting;
list<Customer>::iterator itr ; //迭代器
int i;
cout << "********欢迎使用银行模拟排队系统********" << endl;
cout << "*************制作人:中大黑熊*************" << endl;
cout << "******请输入你所要模拟的时间单位数目:t=?";
cin >> Time;
cout << endl << "以下是每个时间单位的模拟过程:" << endl << endl;
for(i = 1 ;i <= Time;i++)
{
cout << "以下是第" << i << "个时间单位的实时信息:" << endl;
int j;
int time_num; //每个时间单位来排队的人数
time_num = r.poisson(2); //Generate a sample of Poisson distribution of mean 5.
if(!time_num)
{
for(j = 0; j < 5;j++)
{
cout << "窗口" << j+1;
if(windows[j].Is_idle())
{
if(!Queue.empty())
{
Customer temp = Queue.front();
Queue.pop();
windows[j].Customer_Information(temp);
}
else
{
windows[j].Service_state();
}
}
else
{
windows[j].Customer_Information();
}
}
cout << "目前等待的顾客人数为:" << Queue.size() << endl << endl;
}
else
{
Customer * p = new Customer[time_num];
for(j = 0;j < time_num;j++)
{
p[j].num = ++record;
p[j].wating_time = 0; //初始化顾客的等待时间
p[j].served_time = r.poisson(2); //随机模拟顾客所需要的服务时间
//将他们入队
Customer temp = p[j];
Queue.push(temp);
Waiting.push_back(temp);
}
delete [ ]p; //清空动态内存,In case of the memory leak
//接下来处理窗口
// cout << Queue.size() << endl;
for(j = 0; j < 5;j++)
{
cout << "窗口" << j+1;
if(windows[j].Is_idle())
{
if(!Queue.empty())
{
Customer temp = Queue.front();
Customer wtemp = Waiting.front();
temp.wating_time = wtemp.wating_time;
Queue.pop();
Waiting.pop_front();
windows[j].Customer_Information(temp);
}
else
{
windows[j].Service_state();
}
}
else
{
windows[j].Customer_Information();
}
}
cout << "目前等待的顾客人数为:" << Queue.size() << endl << endl;
}
for(itr = Waiting.begin() ;itr != Waiting.end() ;itr++)
{
(*itr).wating_time++;
}
}
cout << "****" << Time << "个服务时间结束,以下是统计信息:" << "****" << endl;
for(i = 0;i < 5;i++)
{
cout << "窗口" << i+1 << "处理的顾客数为:" << windows[i].Customer_amount() << endl;
Total_amount += windows[i].Customer_amount();
Total_Serve_time += windows[i].Customer_Serve_time();
Total_Wait_time += windows[i].Customer_Wait_time();
}
for(itr = Waiting.begin() ;itr != Waiting.end() ;itr++)
{
Total_Wait_time += (*itr).wating_time;
}
cout << "柜台服务的顾客总数为:" << Total_amount << endl;
cout << "顾客服务的平均时间为:" << (double)Total_Serve_time/(double)Total_amount << endl;
cout << "顾客等待的平均时间为:" << (double)Total_Wait_time / (double)(Total_amount + Waiting.size() ) << endl;
return 0;
}

浙公网安备 33010602011771号