c++银行模拟管理统计系统数据结构大型实验报告Word格式.docx
《c++银行模拟管理统计系统数据结构大型实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《c++银行模拟管理统计系统数据结构大型实验报告Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
在实验中,可改变参数,如银行营业时间范围,银行窗口数、客户的到达率、服务时间,顾客的最大耐性等待时间,VIP顾客的到达率等,测试银行的服务效率。
银行模拟的关键部分为客户时间,包括到达,中途离开和办完业务离开事件,刚达到的顾客通过随机数产生下一个顾客的到达,已到达的顾客通过随机数产生服务时间,选择最早空闲的窗口后,可生成离开事件;
所有事件都被加上时间戳,放到优先队列中,队列中优先级最高的事件就是时间戳最早的事件。
其中每一到达事件均可估计出自己的等待时间,若等待时间超出一开始设定的最大耐性等待时间,则顾客选择中途离开,生成中途离开事件。
到达的事件中,又分为普通顾客到达事件和VIP顾客到达事件。
VIP到达时,可选择普通窗口和贵宾窗口来办理业务。
但是普通顾客到达只能选择普通窗口来办理业务。
1.2类的设计:
1.2.1time24类
Time24类对24小时时间制的加,减,等于,小于,输入,输出进行了运算符的重载。
classtime24;
time24operator+(consttime24&
lhs,consttime24&
rhs);
lhs,intmin);
time24operator+(intmin,consttime24&
time24operator-(consttime24&
booloperator==(consttime24&
booloperator<
(consttime24&
istream&
operator>
>
(istream&
istr,time24&
r);
ostream&
operator<
<
(ostream&
ostr,consttime24&
r);
1.2.2event类
Event类首先枚举了事件类型:
到达事件,中途离开事件还是正常办完业务的离开事件。
其中每个事件还包括了属性(普通事件还是贵宾事件)。
具体成员变量及函数如下:
#ifndefEVENT_CLASS
#defineEVENT_CLASS
#include"
time24.h"
enumEventType{arrival,departure,dep2};
classEvent
{
private:
inttime;
//到达时间
EventTypeetype;
//事件类型
intcustomerID;
//顾客号
inttellerID;
//窗口号
intwaitTime;
//等待时间
intserviceTime;
//服务时间
intvip;
//贵宾级
public:
Event()
intgetTime()
Event(intt,EventTypeet,intcID,inttID,intwt,intst,intv);
intGetTime()const;
EventTypeGetEventType()const;
intGetCustomerID()const;
intGetTellerID()const;
intGetWaitTime()const;
voidsetWaitTime(intt);
intGetServiceTime()const;
intGetVip()const;
};
#endif
1.2.3pqueue类
该优先级队列是以链表来实现的。
由于每个事件都被插上了时间戳,所以以事件发生的
先后顺序来排定优先级。
时间早的事件,优先级高。
同一时间,离开事件的优先级大于到达
事件。
template<
classT>
structnode
Tvalue;
intpriority;
node<
T>
*next;
classPQueue
intcount;
//队伍中的人数
*front,*back;
//首尾指针
*NewNode(T&
value,int&
priority,node<
*next);
//插入的新的结点(事件
类型的)
PQueue();
~PQueue();
TPQFirst();
voidPQInsert(Titem,intpriority);
//插入函数voidPQDelete();
//删除函数
voidClearPQ();
//清除函数
boolPQEmpty()const;
//判断是否为空
boolPQFull()const;
//判断是否已满
intPQLength()const;
//判断队伍长度
1.2.4simulation类
具体的模拟过程实现。
#ifndefSIMULATION_CLASS#defineSIMULATION_CLASS
#include<
string>
#include"
Event.h"
PQueue.h"
#include"
structWindowState{
intfinishServiceTime;
inttotalCustomerCount;
inttotalCustomerWait;
inttotalService;
intMAX_Wait;
classSimulation
time24begin,end;
//营业开始和结束时间
intSimulationTimeLength;
intTellersCount;
intnextCustomerID;
intarrivalLow,arrivalHigh;
//最小最大到达时间间隔(分钟)intserviceLow,serviceHigh;
//最小最大服务时间间隔(分钟)intMaxBearWait;
//最大耐心等待时间
intVipRate;
//贵宾到达概率
inttotalCustomerAway;
//中途离开的顾客数目WindowStatetstat[11];
WindowStateVtstat;
//贵宾窗口
PQueue<
Event>
pq;
intflag;
intNextArrivaltime();
intGetServiceTime();
intNextAvailableTeller();
Simulation();
voidinitialization();
//各窗口的数据初始化
voidArrivalEvent(Evente);
//到达事件
voidDepartureEvent(Evente);
//办完业务离开事件
voidDepartureEvent2(Evente);
//中途离开事件
voidRunSimulation();
voidPrintSimulation();
二:
整个系统的设计框架
首先,根据银行服务的流程设计好系统的整个模拟运作的框图。
由框图,划分好程序所需的几个类,确定好相应的功能。
用VC6.0实现基本功能,分调各内容,排除bug,再联调。
实现了系统的基本功能后,再加上顾客的最大耐心等待时间,VIP窗口等功能,进行调试。
调试的时候,原代码保留输出语句,用来检验是否符合逻辑。
本系统关键在于处理各类事件,包括了到达事件,中途离开事件,办完业务离开事件。
由于系统运用事件驱动来模拟,故插入到优先级的是各事件。
各事件再根据它们的时间,来排定优先级。
故重新设计了一个优先级队列。
三:
本离散事件的描述
本离散时间采用的比较简单类型的随机离散。
模拟过程中,通过输入最大,最短服务时间,来确定一个顾客的的服务时间,如:
serviceLow+rand()%(serviceHigh-serviceLow+1);
同样,采用输入一个顾客到达的时间间隔范围来随机取得一个顾客的到达时间,如:
arrivalLow+rand()%(arrivalHigh-arrivalLow+1)。
模拟过程中产生每个顾客的到达和离开事件,所有事件都加上时间戳,然后放到优先级队列中,队列中优先级最高的就是到达或离开最早的事件。
由于接受服务的时间的长短不同,故先到达的顾客不一定可以先离开。
根据服务窗口的当前情况,取一个时间最短的窗口分配给该顾客。
接着用服务时间随机变量产生新的服务时间,由顾客的到达时间,等待时间和服务时间就可以确定该顾客的离开时间,再将顾客离开事件插入到队列。
作为优先级队列的队列成员为事件对象,到达事件和离开事件均为Event类的数据成员。
对每个弹出到达事件,先读入它是何时到达的,并于各窗口的finishServiceTime作比较,,如果值大于顾客的到达时间,则需要等待,不然,发生无需等待这种情况。
同时产生下一个顾客的到达时间。
调用NextAvailableTeller()来获得等待时间最小的窗口号,其中服务窗口的数量可由系统界面选定;
再调用GetServiceTime()来取得随机的服务时间,其中服务时间范围可由系统界面设定。
修改windows的窗口信息,产生离开事件。
四:
实现模拟的过程框图
开始营业由窗口状态决定顾客的服务窗
口号和等待时间产生顾客到达事件服务时间随机变量采样
随机获得下一个到达事件下一个
入
该顾客接受服务的时间队
列
顾客离开事件下一到达事件是
否超出营业时间入
队
到达和离开事件的优先级队列
(时间戳)
结束
图1产生顾客到达和离开事件队列逻辑
随机变量采样获取服务窗口号(所需服务时(等待时间最短)间)
更改该