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");
}
等待时间的统计:
在离开事件里面,若有队首元素占用设备,则统计其等待时间。