#include <iostream> #include <cstdlib> #include <ctime> #include "H12_6.h" const int MIN_PER_HR = 60; bool newcustomer(double x); int main() { using std::cout; using std::cin; using std::endl; using std::ios_base; std::srand(std::time(0)); cout << "Case Study: Bank of Heather Automatic Teller\n"; cout << "Enter maximum size of queue: "; int qs; cin >> qs; cout << "Enter the number of simulation hours: "; int hours; cin >> hours; long cyclelimit = MIN_PER_HR*hours; Item temp; double perhour=1; long lastturnaways=0; long lastcustomers=0; long lastserved=0; long lastsum_line1=0; long lastsum_line2=0; long lastline_wait=0; while(true) { Queue line1(qs); Queue line2(qs); double min_per_cust; min_per_cust=MIN_PER_HR/perhour; long turnaways=0; long customers=0; long served=0; long line_wait=0; int wait_time1=0; long sum_line1=0; int wait_time2=0; long sum_line2=0; for(int cycle=0;cycle<cyclelimit;cycle++) { if(newcustomer(min_per_cust)) //是否有顾客要加入队列 { if(line1.isfull()&&line2.isfull()) turnaways++; else if(line1.queuecount()>line2.queuecount()) { customers++; temp.set(cycle); line2.enqueue(temp); } else { customers++; temp.set(cycle); line1.enqueue(temp); } } if(wait_time1<=0&&!line1.isempty()) //前一个操作完毕 { line1.dequeue(temp); wait_time1=temp.ptime(); line_wait+=cycle-temp.when(); served++; } if(wait_time2<=0&&!line2.isempty()) //前一个操作完毕 { line2.dequeue(temp); wait_time2=temp.ptime(); line_wait+=cycle-temp.when(); served++; } if(wait_time1>0) wait_time1--; if(wait_time2>0) wait_time2--; sum_line1+=line1.queuecount(); sum_line2+=line2.queuecount(); } if((double) line_wait/served>1) break; else { lastturnaways=turnaways; lastcustomers=customers; lastserved=served; lastsum_line1=sum_line1; lastsum_line2=sum_line2; lastline_wait=line_wait; } perhour++; } cout << "average wait time lower than 1 minutes needs " << perhour << " customers per hour.\n"; if(lastcustomers>0) { cout << "customers accepted: " << lastcustomers << endl; cout << " customers served: " << lastserved << endl; cout << " turnaways: " << lastturnaways << endl; cout << "average queue1 size: "; cout.precision(2); cout.setf(ios_base::fixed,ios_base::floatfield); cout << (double) lastsum_line1/cyclelimit << endl; cout << "average queue2 size: "; cout << (double) lastsum_line2/cyclelimit << endl; cout << " average wait time: " << (double) lastline_wait/lastserved << " minutes\n"; } else cout << "No customers!\n"; cout << "Done!\n"; return 0; } bool newcustomer(double x) { return(std::rand()*x/RAND_MAX<1); }