zoukankan      html  css  js  c++  java
  • 离散事件模拟

    #include<stdio.h>
    #include<stdlib.h>
    #define CLOSETIME 1000
    #define M 3
    typedef struct QueueNode{
    int arrivetime;
    int duration;
    struct QueueNode *next;
    }QueueNode;

    typedef struct QueueHeader{
    QueueNode *front,*rear;
    int length;
    }QueueHeader;
    typedef struct EventNode{
    int occurTime,eventType;
    struct EventNode *next;
    }EventNode;

    typedef struct EventList{
    struct EventNode *front,*rear;
    int eventNum;
    }EventList;

    QueueHeader q[M+1];
    EventList *eventlst;
    int seed=300;
    int generate(EventNode **p)
    {
    *p=(EventNode*)malloc(sizeof(EventNode));
    if(!(*p))
    {printf("allocation error!");return -1;}
    return 0;
    }
    void InsertEvent(EventList *eventlst,int occurTime,int etype)
    {
    EventNode *p,*q,*qre;
    p=(EventNode*)malloc(sizeof(EventNode));
    p->occurTime=occurTime;p->eventType=etype;
    eventlst->eventNum++;
    q=eventlst->front;qre=NULL;
    while(q&&occurTime>q->occurTime)
    {
    qre=q;q=q->next ;
    }
    if(!qre) {p->next=eventlst->front;eventlst->front=p;}
    else {p->next =q;qre->next =p;}
    if(eventlst->eventNum==1) eventlst->rear=p;
    }

    void DeleteEvent(EventList *eventlst,EventNode **event)
    {
    EventNode *p;
    p=eventlst->front;
    eventlst->front=p->next;
    if(--eventlst->eventNum<1) eventlst->rear=eventlst->front;
    *event=p;
    }

    void EnQueue(QueueHeader *swindow,int t1,int t2)
    {
    QueueNode *p;
    p=(QueueNode*)malloc(sizeof(QueueNode));
    p->arrivetime=t1;p->duration=t2;
    swindow->length++;
    if(swindow->length==1)
    {
    p->next=NULL;swindow->front=p;swindow->rear=p;
    }
    else
    {
    swindow->rear->next=p;swindow->rear=p;
    }
    }

    void DeQueue(QueueHeader *swindow,QueueNode *f)
    {
    QueueNode *p;
    if(swindow->length>0)
    {
    f->arrivetime=swindow->front->arrivetime;
    f->duration=swindow->front->duration;
    p=swindow->front;swindow->front=swindow->front->next;
    swindow->length--;
    if(swindow->length==0) swindow->rear=NULL;
    free(p);
    }
    }
    void random(int *durtime,int *intevaltime)
    {
    *durtime=rand()+1; *intevaltime=rand()+1;
    }

    int rand()
    {
    int k=(int)(((double)seed/32767)*10000)%29;
    seed=(13107*seed+6553)%32767;
    return k;
    }

    int Minlength()
    {
    int minx,k,i;
    minx=q[1].length;k=1;
    for(i=2;i<M+1;++i)
    if(q[i].length<minx)
    {minx=q[i].length;k=i;}
    return k;
    }

    void main()
    {
    int durtime,inteval,totaltime=0;
    int i,c,count=0;
    QueueNode f;
    EventNode *pe,*event;
    eventlst=(EventList*)malloc(sizeof(EventList));
    if(eventlst==NULL) return;
    if(generate(&pe)==-1) return;
    pe->occurTime=0;pe->eventType=0;
    pe->next=NULL;
    eventlst->front=pe;eventlst->rear=pe;
    eventlst->eventNum=1;
    for(i=1;i<M+1;i++)
    {
    q[i].front=q[i].rear=NULL;
    q[i].length=0;
    }
    while(eventlst->eventNum>0)
    {
    DeleteEvent(eventlst,&event);
    if(event->eventType==0)
    {
    printf("A client entered!");
    count++;
    random(&durtime,&inteval);
    if((event->occurTime+inteval)<CLOSETIME)
    InsertEvent(eventlst,event->occurTime+inteval,0);
    c=Minlength();
    EnQueue(&q[c],event->occurTime,durtime);
    printf("Insert to window %d", c);
    printf("(arrive time:%d duration:%d)\n",event->occurTime,durtime);
    if(q[c].length==1)
    InsertEvent(eventlst,event->occurTime+durtime,c);
    }
    else
    {
    i=event->eventType;
    DeQueue(&q[i],&f);
    printf("service window%d: A client left!\n",i);
    totaltime+=event->occurTime-f.arrivetime;
    if(q[i].length!=0)
    InsertEvent(eventlst,event->occurTime+q[i].front->duration ,i);
    }
    }
    printf("\n Total Customers:%d\n",count);
    printf("Average duration:%d\n",totaltime/count);
    }
    Live together,or Die alone!
  • 相关阅读:
    洛谷P4175 网络管理
    洛谷P2605 基站选址
    洛谷P3723 礼物
    bzoj3771 Triple
    洛谷P3321 序列统计
    bzoj2194 快速傅里叶之二
    1109课堂内容整理
    响应式网页
    表单隐藏域有什么作用?
    1106课堂笔记
  • 原文地址:https://www.cnblogs.com/hzhida/p/2354755.html
Copyright © 2011-2022 走看看