离散事件模拟---银行业务模拟c++实现
来源:互联网 发布:windows msg 编辑:程序博客网 时间:2024/04/30 11:03
// bankQueue.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <list>
#include <queue>
#include <iostream>
#include <ctime>
using namespace std;
typedef struct Event
{
int OccurTime; //事件发生时刻
int NType; //事件类型,0表示到达事件,1-4表示四个窗口的离开事件
bool operator<(Event a) //sort()函数调用函数指针,比较自定义类型
{
if (this->OccurTime <= a.OccurTime)
{
return true;
}
return false;
}
}Event,ElemType;
typedef struct
{
int ArriveTime; //到达时间
int Duration; //办理事务所需时间
}QElemType; //队列的数据元素类型
std::list<Event> ev; //事件列表
Event en; //事件
QElemType customer;
std::queue<QElemType> q[3];
int TotalTime = 0;
int CustomerNum = 0;
int CloseTime = 300;
void Init()
{
//设定第一个客户到达事件
en.OccurTime = 0;
en.NType = 0;
ev.push_back(en);
}
int RandNum()
{
int MIN = 4;
int MAX = 20;
srand((unsigned int )time(NULL));
return rand() % (MAX - MIN + 1);
}
int GetMinLengthQueue()
{
unsigned int min = q[0].size();
for (int i =1 ; i<3; i++)
{
if (q[i].size() < min)
{
min = i;
}
}
return min;
}
void CustomerArrived()
{
//处理客户到达事件
++CustomerNum;
int duraTime = RandNum();
int interTime = RandNum();
int t = en.OccurTime + interTime; // 下一客户到达时刻
if(t < CloseTime) //银行尚未关门
{
//插入事件列表
Event newCustomer;
newCustomer.NType = 0;
newCustomer.OccurTime = t;
ev.push_back(newCustomer);
ev.sort();
}
//求长度最短队列
int minQ = GetMinLengthQueue();
QElemType insert;
insert.ArriveTime = en.OccurTime;
insert.Duration = duraTime;
q[minQ].push(insert);
if (q[minQ].size() == 1)//
{
Event newCustomer;
newCustomer.NType = minQ;
newCustomer.OccurTime = en.OccurTime + duraTime;
ev.push_back(newCustomer);
ev.sort();
}
}
void CustomerLeaved()
{
int i = en.NType;
QElemType customer = q[i].front();
q[i].pop();
TotalTime += en.OccurTime - customer.ArriveTime;
if (!q[i].empty()) //
{
QElemType customer = q[i].front();
Event newCustomer;
newCustomer.NType = i;
newCustomer.OccurTime = en.OccurTime + customer.Duration;
ev.push_back(newCustomer);
ev.sort();
}
}
void Bank_Simulation()
{
Init();
while (!ev.empty())
{
std::list<Event>::iterator it = ev.begin();
en = *it;
if (en.NType == 0 )
{
CustomerArrived();
}
else
{
CustomerLeaved();
}
ev.erase(it);
}
cout<<TotalTime<<" "<<(float)TotalTime / CustomerNum<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
Bank_Simulation();
system("pause");
return 0;
}
- 离散事件模拟---银行业务模拟c++实现
- 3.5 离散事件模拟--银行业务模拟程序
- 离散事件模拟(银行业务模拟。实现算法3.6、3.7的程序)
- C语言 离散事件模拟
- 离散事件模拟实现——数据结构(C语言版)
- C++实现离散事件模拟--Bank_Simulation
- 离散事件模拟
- 离散事件模拟
- 队列-模拟离散事件
- 离散事件模拟
- 3.5离散事件模拟
- 离散事件模拟--银行排队时间模拟
- 离散事件模拟-银行管理 模拟,队列
- 银行业务调度系统模拟实现
- 离散事件模拟-银行管理
- 离散事件模拟-银行管理
- 离散事件模拟-银行管理
- 离散事件模拟-银行管理
- js动态添加事件的方法
- gamebryo--字体
- 电子银行业务分析系统—项目总结6. 沟通管理总结
- 学会调整自己的生活态度——让自己更快乐
- ORA-00972 标识过长
- 离散事件模拟---银行业务模拟c++实现
- 多线程基础总结--ReentrantReadWriteLock(网摘)
- asp.net读取excl中的数据【转】
- 大家好
- delphi调用选择目录对话框
- Nagle算法TCP_NODELAY和TCP_CORK
- org.jbpm.api.JbpmException: no environment to get org.jbpm.pvm.internal.session.RepositorySession
- 调整文本框大小以适应内容
- 将sql查询出来的数据转化为对象