离散事件模拟

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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));

相关文档
最新文档