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");

}



等待时间的统计:
在离开事件里面,若有队首元素占用设备,则统计其等待时间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值