离散事件动态模拟通过程序动态模拟银行顾客在一家有n>=2个窗口的银行的到达和离开的情况.通过计算每位顾客的平均等待时间及每一窗口处于“繁忙”状态的百分比,来计算银行的服务效率.
来源:学生作业帮助网 编辑:六六作业网 时间:2024/05/06 01:46:46
离散事件动态模拟通过程序动态模拟银行顾客在一家有n>=2个窗口的银行的到达和离开的情况.通过计算每位顾客的平均等待时间及每一窗口处于“繁忙”状态的百分比,来计算银行的服务效率.
离散事件动态模拟
通过程序动态模拟银行顾客在一家有n>=2个窗口的银行的到达和离开的情况.通过计算每位顾客的平均等待时间及每一窗口处于“繁忙”状态的百分比,来计算银行的服务效率.实现中,可以电影院代表银行活动的对象,用事件驱动来模拟这些活动,并以概率(随机数发生器)来描述预期的客户到达率和银行职员为一个顾客服务所需的时间.
在实验中,可改变参数,如银行窗口数、客户的到达率、服务时间等,测试银行的服务效率.要求在各种情况下,模拟测试都能得到合理的运行结果.
银行模拟的关键部分为客户时间,包括到达和离开事件,刚达到的顾客通过随机数产生下一个顾客的到达,已到达的顾客通过随机数产生服务时间,选择最早空闲的窗口后,可生成离开事件;所有事件都被加上时间戳,放到优先队列中,队列中优先级最高的事件就是时间戳最早的事件.
采用数据结构c++实现
离散事件动态模拟通过程序动态模拟银行顾客在一家有n>=2个窗口的银行的到达和离开的情况.通过计算每位顾客的平均等待时间及每一窗口处于“繁忙”状态的百分比,来计算银行的服务效率.
#include
#include
#include
#include "start.h"
#include "test_dig.h"
#include "d_time24.h"
#include "d_except.h"
#include "event.h"
#include "windows.h"
#include "myMultyueue.h"
using namespace std;
int window_num;
double rand_arr;
time24 start_time,end_time;
void build(time24 first,time24 end,int w,double r);
int main()
{
start(); //欢迎
test_dig(start_time,end_time,window_num,rand_arr);//输入测试数据
srand((unsigned)time(NULL)); //生成第一个顾客
int first=rand()%5+1; //到达的时间
time24 first_custom; //
first_custom=start_time+first; //
cout<
system("pause");
return 0;
}
void build(time24 first,time24 end,int w,double r)
{
windows wind[100]; //定义窗口
for(int i=1;i<=w;i++)
{
wind[i]=windows(i); //初始化窗口
}
event first_custom(first,r); //定义第一个客户到达
myMultyqueue bank;
bank.push(first_custom); //压入第一个客户
while(!bank.empty())
{
event temp;
temp=bank.top(); //弹出事件
bank.pop();
time24 now=temp.get_time(); //得到当前事件的时间
bool have_window=false;
int num;
if(temp.is_arr()) //是到达事件
{
temp.set_servetime(); //设置当前事件的服务时间
for(int i=1;i<=w;i++) //寻找窗口
{
if(wind[i].is_free())
{
have_window=true;
num=i;
break;
}
}
if(have_window) //找到窗口
{
wind[num].set_free(false); //置忙
wind[num].add_serveper(); //增加总服务人数
wind[num].add_totservetime(temp.get_servetime());//增加总服务时间
temp.set_window(num);//设置事件发生的窗口
event left(now+temp.get_servetime(),num);//在该窗口生成离开事件
bank.push(left);
}
else//没有空闲窗口
{
event top;
top=bank.top(); //继续得到下一个事件
time24 next=top.get_time(); //下一个事件发生的时间
int next_window=top.get_window(); //下一个事件发生的窗口
time24 t=next-now; //两个事件的时间差,即等待时间
temp.set_window(next_window); //下一个事件的发生窗口设置成当前事件的离开窗口
wind[next_window].add_serveper(); //窗口服务人数加一
wind[next_window].add_totservetime(temp.get_servetime());//增加窗口服务时间
wind[next_window].add_totwaittime(t);//增加窗口的等待时间
event left(next+temp.get_servetime(),next_window);//生成离开事件
bank.pop();
bank.push(left); //压入其离开事件
}
temp.set_nextcustom();
time24 next_arrcustom=now+temp.get_nextcustom();//定义下一个客户到达的时间
event next_arr(next_arrcustom,r);
if(next_arrcustom
bank.push(next_arr);
cout<<" 下一个客户:"<
cout<
else//是离开事件
{
wind[temp.get_window()].set_free(true);
}
}
int serve=0,wait=0,person=0,flag=0;
time24 max_waittime(0,0);
cout<<"\n银行从"<
{
cout< serve+=wind[a].get_totservetime();
wait+=wind[a].get_totwaittime();
person+=wind[a].get_serveper();
if(max_waittime
max_waittime=wind[a].get_maxwaittime();
flag=a;
}
}
time24 tot_servetime(0,serve),tot_waittime(0,wait);
cout<<"\n银行总服务时间为:"<
}