`
PatternCat
  • 浏览: 8695 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

1.离散系统模拟--简介

阅读更多
1.模拟机制:事件推动
  模拟开始的时候,先从初始化的事件数组(链表等)里面查找发生时间最小的事件,让其发生,然后安排相关事件的下一次发生的时间,以此才推进时间的前移。
2.关键的元素:
  (1)系统的状态:忙闲,故障是否发生
  (2)实体
  (3)事件的个数和类型
  (4)事件的初始值
3.实例:
  一个理发师,FIFO,顾客到达的时间间隔e(5),平均服务时间e(4)
  事件:顾客的到达和离开
  实体:顾客和理发师
  指标:平均等待时间

事件分析:
(1)到达事件:
   1.安排下一个到达事件的发生时间;
   2.若设备忙,队伍长度+1,进入等待队伍,记录该顾客的开始等待的时间
     若设备闲,则占用设备,设置设备为忙,安排其服务完成离开的时间
(2)离开事件:
   1.完工数+1;
   2.若等待队伍为空,则设备设置成闲的状态,设置下一个离开时间的发生时间无穷(即不发生离开事件)
     若等待队伍不空,则安排队首的占用设备,队伍长度-1,计算它的等待时间,然后安排它服务完成离开的时间。
(3)C程序模拟:
  main函数:
int main()
{
    initSimulation();

    while(isEnd!=1){
        switch(MinEvents()){
            case 1:
              arrive();break;
            case 2:
              depart();break;
            case 3:
              endSimulation();break;
            }
        }
   // cout<<totalTime;
    cout <<"平均队伍长度:"<<sumQueueLength/totalTime<<endl;
    return 0;
}

   到达事件:
void arrive(){

  if(status==1){
    //统计队伍长度
    // sumQueueLength+=queueLength*(events[0]-lastEventTime);
     cout<<endl;
    // cout<<"sumQueueLength+=queueLength*(events[0]-lastEventTime);"<<sumQueueLength<<"+="<<queueLength<<"*("<<events[0]<<"-"<<lastEventTime<<");"<<endl;
     queueLength++;
    //修改lastEventTime
  //  lastEventTime=events[0];

     queue_l++;
     queue[queue_l]=events[0];

   }else if(status==0){
       status=1;
       ser_l++;
       events[1]=events[0]+ser[ser_l];
       }

     printEventList(events[0],"arrive");

     arr_l++;
     events[0]+=arr[arr_l];

    }


离开事件:
void depart(){

    finishNum++;
    float original_events1=events[1];


    if(queueLength>0){

        //统计队伍长度
      //  sumQueueLength+=queueLength*(events[1]-lastEventTime);
        cout<<endl;
      //  cout<<"sumQueueLength+=queueLength*(events[0]-lastEventTime);"<<sumQueueLength<<"+="<<queueLength<<"*("<<events[1]<<"-"<<lastEventTime<<");"<<endl;
        queueLength--;
      //修改lastEventTime
     //   lastEventTime=events[1];


         if(queue_s<=queue_l)
                  waitingTime+=events[1]-queue[queue_s];
          queue_s++;

         ser_l++;
           events[1]+=ser[ser_l];

        }else {
               queueLength=0;
                status=0;
               totalTime=events[1];
               events[1]=INFINITE;

            }

    printEventList(original_events1,"depart");

    }



等待时间的统计:
在离开事件里面,若有队首元素占用设备,则统计其等待时间。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics