ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:58.49KB ,
资源ID:8010029      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8010029.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(离散事件模拟.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

离散事件模拟.docx

1、离散事件模拟#includeQueue.h#includeshuxu.h#define Qu 4/离散客户列数#define Khjg 5/ 两个相邻的客户的时间间隔的最大值#define Blsj 30/每个客户办理业务的时间最大值typedef LinkList EventList;/定义事件链表类型为有序链表/*typedef structint ArrivalTime;/时间发生时刻 int Duration;/事件类型QElemtype;*/EventList ev;/事件表Event en;/事件Event et;/临时变量LinkQueue qQu;/Qu个客户队列QElemty

2、pe customer;/客户记录int TotalTime=0,CustomerNum=0;/累计客户逗留时间,客户数(初值为 0)int CloseTime;/银行营业时间(单位是分)int cmp(Event a,Event b)/依事件a发生时刻事件b的时刻分别返回 -1,0或1 if(a.OccurTime=b.OccurTime) return 0; else return (a.OccurTime-b.OccurTime)/abs(a.OccurTime-b.OccurTime);void OpenForDay()/初始化操作 int i; InitList (ev); en.O

3、ccurTime=0;/设定第一个客户到达事件 en.NType=Qu;/到达 OrderInsert(ev,en,cmp);/插入事件表 for(i=0;iQu;+i) InitQueue(qi); void Random(int &d,int &i) d=rand()%Blsj+1; i=rand()%Khjg+1; int Minimum(LinkQueue Q)/返回最短队列的序号 int lQu; int i,j; for(i=0;iQu;i+) li=QueueLength(Qi); j=0; for(i=1;iQu;i+) if(lil0) l0=li; j=i; return

4、j; void CustomerArrived()/处理客户到达事件 QElemtype f; int durtime,intertime,i; +CustomerNum; Random(durtime,intertime);/生成随机数 et.OccurTime=en.OccurTime+intertime;/下个客户到达的时刻 et.NType=Qu;/队列中只有一个客户到达事件 if(et.OccurTimeCloseTime)/银行尚未关门,插入事件表 OrderInsert(ev,et,cmp); i=Minimum(q); f.ArrivalTime=en.OccurTime; f

5、.Duration=durtime; EnQueue(qi,f); if(QueueLength(qi)=1) et.OccurTime=en.OccurTime+durtime; et.NType=i; OrderInsert(ev,et,cmp);/设定第i队列的一个离开事件并插入事件表 void CustomerDeparture()int i;i=en.NType;DeQueue(qi,customer);TotalTime+=en.OccurTime-customer.ArrivalTime;if(!QueueEmpty(qi)GetHead(qi,customer); et.Occ

6、urTime=en.OccurTime+customer.Duration; et.NType=i; OrderInsert(ev,et,cmp); void Bank_Simulation()Link p; OpenForDay();/初始化 while(!ListEmpty(ev) DelFirst(ev,GetHead(ev),p); en.OccurTime=GetCurElem(p).OccurTime; en.NType=GetCurElem(p).NType; if(en.NType=Qu) CustomerArrived(); else CustomerDeparture();

7、 printf(顾客总数:%d,所有顾客总共耗时%d分钟,平均每人耗时%d分钟n,CustomerNum,TotalTime,TotalTime/CustomerNum); void main() printf(请输入银行营业时间长度单位(单位:分)n); scanf(%d,&CloseTime); Bank_Simulation(); 附:Queue.h#include#include#include#include#define TRUE 1#define FALSE 0#define OK 1# define ERROR 0#define INFEASIBLE -1typedef int

8、 status;typedef int Boolean;typedef structint ArrivalTime;/时间发生时刻 int Duration;/事件类型QElemtype;typedef struct QNode /单链队列 QElemtype data; QNode *next; *QueuePtr;struct LinkQueue QueuePtr front,rear;/对头队尾指针;/和栈一样,队列也是操作受限的线性表,只允许在队尾插入元素,在队头删除元素/为了便于插入元素,设立了队尾指针status InitQueue(LinkQueue &Q) if(!(Q.fro

9、nt=Q.rear=(QueuePtr)malloc(sizeof(QNode) exit(OVERFLOW); Q.front-next=NULL; return OK; status DestroyQueue(LinkQueue &Q) while(Q.front) Q.rear=Q.front-next; free(Q.front); Q.front=Q.rear; return OK; status ClearQueue(LinkQueue &Q) QueuePtr p,q; Q.rear=Q.front; p=Q.front-next; Q.front-next=NULL; whil

10、e(p) q=p; p=p-next; free(q); return OK; status QueueEmpty(LinkQueue Q)if(Q.front=Q.rear) return OK; else return FALSE; int QueueLength(LinkQueue Q) int i=0; QueuePtr p,q; p=Q.front; while(p!=Q.rear) i+; p=p-next; return i; status GetHead(LinkQueue Q, QElemtype &e)/若队列不空则用e返回Q的队头元素 if(Q.front=Q.rear)

11、 return ERROR; else e=Q.front-next-data;/这里的队头是Q.front-next-data哦 return OK; status EnQueue(LinkQueue &Q,QElemtype e)/e入队列是插入队尾哦 QueuePtr p; if(!(p=(QueuePtr)malloc(sizeof(QNode) exit(OVERFLOW); p-data=e; p-next =NULL; Q.rear-next=p; Q.rear=p; return OK; status DeQueue(LinkQueue &Q,QElemtype &e)/出队列

12、,并用e返回其值 QueuePtr p; if(Q.front=Q.rear) return ERROR; p=Q.front-next; e=p-data; Q.front-next=p-next; if(p=Q.rear) Q.rear=Q.front;/找回队尾指针 free(p); return OK; status QueueTraverse(LinkQueue Q,void(*vi)(QElemtype)/队头到队尾遍历 QueuePtr p; for(p=Q.front-next;p;p=p-next) vi(p-data); printf(n); return OK; void

13、 visit(QElemtype c) printf(%d , c); Shuxu.h#include#include#include#include#define TRUE 1#define FALSE 0#define OK 1# define ERROR 0#define INFEASIBLE -1typedef int status;typedef int Boolean;typedef struct int OccurTime;/时间发生时刻 int NType; /时间类型 Event,Elemtype;typedef struct LNode Elemtype data; LNo

14、de *next; *Link,*Position;struct LinkList Link head,tail; int len; ;status MakeNode(Link &p,Elemtype e)/分配由p指向的值为e的节点,并返回OK 如果分配失败,则返回ERROR p=(Link)malloc(sizeof(LNode); if(!p) return ERROR; p-data=e; return OK; status FreeNode(Link &p)free(p); p=NULL; return OK; status InitList(LinkList &L)Link p;p

15、=(Link)malloc(sizeof(LNode);if(p) p-next=NULL; L.head=L.tail=p; L.len=0; return OK; else return ERROR;status ClearList(LinkList &L) Link p,q; if(L.head!=L.tail) q=p=L.head-next; L.head-next=NULL; while(p!=L.tail) p=q-next; free (q); q=p; free(q); L.tail=L.head; L.len=0; return OK;status DestroyList(

16、LinkList &L) ClearList(L); FreeNode (L.head); L.tail=NULL; L.len=0; return OK; status InsFirst(LinkList &L,Link h,Link s)/h指向L的一个节点,把h当做头结点,将s所指的节点插入在第一个节点之前 s-next=h-next; h-next=s; if(h=L.tail) L.tail=h-next; L.len+; return OK;status DelFirst(LinkList &L,Link h,Link &q) q=h-next; if(q)/链表非空 h-next

17、=q-next; if(!h-next); L.tail=h; /补上表尾指针 L.len-; return OK; else return FALSE; status Append(LinkList &L,Link s) /将指针s所指的一串结点链接在线性表L之后,并改变链表L的尾指针向新的尾结点 int i=1; L.tail-next=s; while(s-next) s=s-next; i+; L.tail=s; L.len+=i; return OK;Position PriorPos(LinkList L,Link p)/已知p指向线性链表的一个结点,返回p所指结点的直接前驱的位置

18、,若无前驱则返回NULL Link q=L.head-next; if(q=p) return NULL; else while(q-next!=p) q=q-next; return q; status Remove( LinkList &L,Link &q)/删除线性链表的表尾结点并以q返回,改变尾指针为新的表尾结点 Link p=L.head; if(!L.head-next) q=NULL; return FALSE; while(p-next!=L.tail) p=p-next; q=L.tail; p-next=NULL; L.tail=p; L.len-; return OK;

19、status InsBefore (LinkList &L,Link &p,Link s)/已知p指向线性表L中的一个结点,将s所指结点插入p所指结点之前, /并修改指针p指向新插入的结点 Link q; q=PriorPos(L,p); if(!q) q=L.head; s-next=p; q-next=s; p=s; L.len+; return OK; status InsAfter(LinkList &L,Link &p,Link s)/已知p指向线性表L中的一个结点,将s所指结点插入p所指结点之后, /并修改指针p指向新插入的结点 if(p=L.tail) L.tail=s; s-n

20、ext=p-next; p-next=s; p=s; L.len+; return OK; status SetCurElem(Link p,Elemtype e)/已知p指向线性链表中的一个结点,用e更新p所指结点中数据元素的值 p-data=e; return OK; Elemtype GetCurElem(Link p) return p-data; status ListEmpty(LinkList L) if(L.len) return FALSE; else return TRUE;int ListLength(LinkList L) return L.len; Position

21、GetHead(LinkList L) return L.head;Position GetLast(LinkList L) return L.tail; Position NextPos(Link p) return p-next; status LocatePos(LinkList L, int i,Link &p)int j; if(iL.len) return ERROR; else p=L.head; for(j=1;jnext; return OK; Position LocateElem(LinkList L,Elemtype e,status(*compare)(Elemtyp

22、e,Elemtype) Link p=L.head; do p=p-next; while(p&!(compare(p-data,e); return p; status ListTraverse(LinkList L,void (*visit)(Elemtype) Link p=L.head-next; int j; for(j=1;jdata); p=p-next; printf(n); return OK;status OrderInsert(LinkList &L,Elemtype e,int (*cmp)(Elemtype,Elemtype) /已知L为有序线性表 将元素e按照非降序

23、插入在L中 Link o,p ,q; q=L.head; p=q-next; while(p!=NULL&cmp(p-data,e)next; o=(Link)malloc(sizeof (LNode); o-data=e; q-next=o; o-next=p; L.len+; if(!p) L.tail=o; return OK; status LocateElem(LinkList L,Elemtype e,Position &q,int(*com)(Elemtype,Elemtype) /若升序链表L中存在与E满足判定函数com取值为0的元素则q指示L /中第一个元素的值为e的结点位置,并返回TRUE否则q指示第一个与e满足判断函数 /compare()取值0的前驱的位置,并返回FALSE Link p=L.head,pp; do pp=p; p=p-next; while(p&(com(p-data,e)data,e)0) q=pp; return FALSE; else q=p; return TRUE;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1