离散事件模拟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//离散事件模拟,模拟银行营业时的排队情况
//不考虑顾客中途离开,顾客到达事件随机,业务办理时间
//长度随机,选择最短的队排队,不再换队
//作者:nuaazdh
//时间:2011年12月10日08:52:37
#include
#include
#include
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef struct Event{ //事件类型
int OccurTime; //事件发生时刻
int NType; //事件类型,0表示到达事件,1至4表示四个窗口的离开事件
struct Event *next;
}Event,ElemType;
typedef struct{ //单向链表结构
ElemType *head;//头指针
ElemType *tail;//尾指针
int len; //长度
}LinkList;
typedef LinkList EventList; //事件链表
typedef struct QElemType{ //队列元素
int ArriveTime;//到达时间
int Duration;//办理业务所需时间
struct QElemType *next;
}QElemType;
typedef struct{//队列结构
QElemType *head;//头指针
QElemType *tail;//尾指针
}LinkQueue;
Event NewEvent(int occurT,int nType);
//根据OccurTime和NType值,创建新事件
Status InitList(LinkList *L);
//初始化事件链表
Status OrderInsert(LinkList *L,Event e);
//将事件e按发生时间顺序插入有序链表L中
Status ListEmpty(LinkList *L);
//判断链表L是否为空,为空返回TRUE,否则返回FALSE
Status DelFirst(LinkList *L,ElemType *e);
//链表L不为空,删除其首结点,用e返回,并返回OK;否则返回ERROR Status ListTraverse(LinkList *L);
//遍历链表
Status InitQueue(LinkQueue *Q);
//初始化队列Q
Status EmptyQueue(LinkQueue *Q);
//若队列Q为空,返回TRUE,否则返回FALSE
Status DelQueue(LinkQueue *Q,QElemType *e);
//若队列Q不为空,首结点出队,用e返回,并返回OK;否则返回ERROR Status EnQueue(LinkQueue *Q,QElemType e);
//结点e入队Q
int QueueLength(LinkQueue Q);
//返回队列Q的长度,即元素个数
Status GetHead(LinkQueue *Q,QElemType *e);
//若队列Q不为空,用e返回其首结点,并返回OK,否则返回ERROR Status QueueTraverse(LinkQueue *Q);
//遍历队列Q
//------------------//
int Min(int a[],int n);
//返回长度为n的数组a第一个最小值的下标,从1开始
int ShortestQueue();
//获取最短队列的编号
void OpenForDay();
//初始化操作
void CustomerArrived();
//顾客达到事件
void CustomerDepature();
//顾客离开事件
void Bank_Simulation();
//银行排队模拟
void PrintEventList();
//输出事件队列
void PrintQueue();
//打印当前队列
//----全局变量-----//
EventList ev;
Event en;
LinkQueue q[5];
QElemType customer;
int TotalTime,CustomerNum;
int CloseTime=50;//关闭时间,即营业时间长度
//--------------main()------------------//
int main()
{
Bank_Simulation();
return 0;
}
//--------------模拟排队----------------//
void OpenForDay(){
//初始化操作
int i;
TotalTime=0; CustomerNum=0;
InitList(&ev);//初始化事件队列
en.OccurTime=0;
en.NType=0;
OrderInsert(&ev,en);
for(i=1;i<=4;i++)
InitQueue(&q[i]);//初始化四个窗口队列
}//OpenForDay
void CustomerArrived(){
//顾客达到事件
int durtime,intertime,i,t;
QElemType e;
++CustomerNum;
intertime=rand()%5+1;//间隔时间在5分钟内
durtime=rand()%30+1;//办理业务时间在30分钟内
t=en.OccurTime+intertime;
if(t printf("A new customer will arrive at:%d\n",en.OccurTime);//下一位顾客达到时间 OrderInsert(&ev,NewEvent(t,0)); i=ShortestQueue();//最短队列 e.ArriveTime=en.OccurTime; e.Duration=durtime; EnQueue(&q[i],e); if(QueueLength(q[i])==1) OrderInsert(&ev,NewEvent(en.OccurTime+durtime,i));