例二 排队问题的系统模拟 算法3.6 void CustomerArrived(eventList evL, Queue Q, Event en ) { // 处理顾客进门事件 Random(durtime, intertime); nextAT = en.occurTime + intertime; // 下一顾客到达时刻 if (nextAT<closeTime) { newAEvent = ( nextAT, 'A'); // 新的进门事件 MakeNode(newp, newAEvent); LocateElem(evL, newAEvent, compare); Insafter(evL, newp); // 插入事件表 } |
evL 为事件表,表中的第1个事件为(0,'A')。 durtime 为当前进门的顾客理发所需时间,intertime 为下一个顾客即将进门的间隔时间。 |
|||
if (freeChair) { //
顾客即刻开始理发 dT = en.occurTime + durtime; newDEvent = (dT, 'D'); // 新的出门事件 MakeNode(newp, newDEvent); LocateElem(evL, newDEvent, compare); Insafter(evL, newp); // 插入事件表 |
freeChair 的初值即为 chairNum。 | |||
totalTime += durtime; //
累计逗留时间 --freeChair; } else { // 顾客排队等候 newCustomer = (en.occuTime, durtime); EnQueue(Q, newCustomer); } ++customerNum; // 统计顾客总人数 totalQLength += QueueLength(Q); // 累计排队的长度 } // CustomerArrived 算法3.7 void CustomerDeparture(eventList evL, Queue Q, Event en) { // 处理顾客出门事件 if (!DeQueue(Q, cm)) ++FreeChair; // 无人等候理发 else { // 排头顾客出列开始理发 dT = en.occurTime + cm.duration; newDEvent = (dT, 'D'); // 新的出门事件 MakeNode(newp, newDEvent); LocateElem(evL, newDEvent, compare); Insafter(evL, newp); // 插入事件表 totalTime += (dT - cm.arrivalTime); // 累计逗留时间 } totalFreeChair += freeChair; // 累计空椅数 } // CustomerDeparture |
TotalTime、customerNum 和 totalQLength 的初值均为0。 |