Set up empty queue Set current time = 0 Schedule the arrival for the first custo
ID: 3535490 • Letter: S
Question
Set up empty queue
Set current time = 0
Schedule the arrival for the first customer for some arbitrary value (t_arrival = 0 will be okay)
Loop 0 to maxtime (use 720 minutes – 12 hours)
1. Check to see if the queue is not empty and current time = t_departure a. remove that customer at the head of the queue and print a message. You can also total wait times and count number of departing customers here for average at end.
b. Set t_departure = current time + service time of customer at the head of the queue.
c. If the queue is still not empty after removing the head, print a message that you are servicing the customer at the head and set t_departure to current time + service time of that customer.
2. If current time = t_arrival
a. increment customer number
b. obtain the service time of the new customer (random 1-4)
c. if queue is empty,
set departure time = to current time + service time of this customer
d. add this customer to queue
e. report the arrival and service time of this customer
f. schedule the arrival time of another customer by obtaining a random number (1-4) and set arrival_ time to current time + this value.
3. Increment current time
Calculate an average wait time in the queue by adding up all times waited in queue of departing customers
totalWaitTime += departureTime - aqueue.front().getArrivalTime()
and divide by the number of departed customers.
Set up a class of a customer with id number, service time, and arrival time. Add a parameterized constructor, all getters and setters, and a way to print the object(overload the << operator).
For the main method, use:
# include <queue> // before main
queue<Customer> aqueue; //inside main to start the empty queue
Explanation / Answer
#include queue
int main()
{
//initialize arrival and departure time
int custArrive, custLeave = 0;
//set clock to zero
int clock = 0;
// set count to second customer
int count = 2;
// variables to track earliest next arrival and earlist next departure
int earlyAr = 0;
int earlyDept = 0;
//variable to track next event
int earlyEvent = earlyAr;
//create list of customers
list <cust> l;
//create iterator for list
list<cust>::iterator i;
//create queue for checkout line
queue <cust> q;
//create stat object to store final statistics
stat s;
//create a customer object
cust c1;
//initilize with 1st cust data
c1.atime = 0;
c1.wtime = 0;
c1.s_checkout = start_checkout(0);
c1.id = 1;
//add to list
l.push_back(c1);
//determine earliest next event
custArrive = arr_time(clock);
earlyEvent = custArrive;
//update clock to time of next earliest event
clock = custArrive;
//Start of Simulation*********************
// while simulation is still running
while(clock < SIM_TIME)
{
// if customer is arriving
if(clock == custArrive)
{
// create object for customer
cust c;
//fill data fields
c.id = count;
c.atime = custArrive;
c.s_checkout = start_checkout( clock );
c.wtime = 0;
l.push_back( c ); // put into list
custArrive = arr_time( clock ); // calc next arrival
i = min_element(l.begin(), l.end(), cmp); // find first to enter checkout
count++; //increment customer id number
//set earliest next arrival
earlyAr = custArrive;
}
// if customer has finished picking items
else if(clock == i -> s_checkout)
{
//create object to move cust from list to queue
cust temp;
//copy values from list item to queue item
temp.id = i -> id;
temp.atime = i -> atime;
temp.wtime = i -> wtime;
temp.s_checkout = i -> s_checkout;
//insert element into queue
q.push(temp);
//if queue is empty(this is the only element about to be in queue)
if(q.size() == 1)
{
//set wait time to zero
q.front().wtime = 0;
//use dept_time to obtain departure time
custLeave = dept_time(clock);
}
//set departure as next earliest departure
earlyDept = custLeave;
}
// if customer departed
else
{
//remove customer from queue
cust c = q.front();
q.pop();
//use dept_time and update wtime of next cust in queue
q.front().wtime = clock - q.front().s_checkout;
clock += dept_time(clock);
//update stat structure
update_fin_stat( s, c, clock );
}
//determine next earliest event
// if list isnt empty
if(l.size() > 0)
{
i = min_element(l.begin(),l.end(), cmp); //find earliest checkout time
}
else
{
i -> s_checkout = (1000000); //set value to above sim-time
}
//if arrival is less than checkout time
if(earlyAr < i -> s_checkout)
{
earlyEvent = earlyAr; //earliest event is arrival
}
//else the checkout time is less than arrival
else
{
earlyEvent = i -> s_checkout; //earliest event is checkout
}
//if list not empty and departure less than earliest event
if (l.size() > 0 && earlyDept < earlyEvent)
{
earlyEvent = earlyDept; //earliest event is departure
}
// Set sim clock to next earliest event time
clock = earlyEvent;
}
print_fin_stat(s);
return 0;
}
// returns next arrival time
int arr_time (const int& clock)
{
int temp = ( rand()% ( MAX_INT_ARR - MIN_INT_ARR + 1 ) + MIN_INT_ARR );
temp += clock;
return temp;
}
// returns next departure time
int dept_time (const int& clock)
{
int temp = ( rand()% ( MAX_SERV - MIN_SERV + 1 ) + MIN_SERV );
temp += clock;
return temp;
}
// returns time to enter checkout line
int start_checkout (const int& clock)
{
int temp = ( rand()% ( MAX_PICK - MIN_PICK + 1 ) + MIN_PICK );
temp += clock;
return temp;
}
void update_fin_stat(stat& s, const cust& c, const int& clock)
{
//initialize variables for shop, wait, and service time
int shop = 0;
int wait = 0;
int serv = 0;
//calculate shop time, wait time, and service time
//calculate shop time
shop = c.s_checkout - c.atime; //checkout time - arrival time
//calculate wait time
wait = c.wtime;
//calculate serv time
serv = dept_time(clock) - c.wtime;
//update values in struct s
s.num_dept++;
s.tot_shop += shop;
s.tot_wait += wait;
s.tot_serv += serv;
//if number departed is multiple of sample int
if(s.num_dept % SAMPLE_INT == 0)
{
cout << "num = " << s.num_dept << " ";
cout << "id = " << c.id << " ";
cout << "shop = " << shop << " ";
cout << "wait = " << wait << " ";
cout << "serv = " << serv << " ";
cout << endl;
}
}
bool cmp (const cust& c1, const cust& c2)
{
return c1.s_checkout < c2.s_checkout;
}
void print_fin_stat(stat& s)
{
//print final stats
cout << "Number of Customers" << s.num_dept << endl;
cout << "Total Sim Time " << SIM_TIME << endl;
//compute averages
s.avg_shop = s.tot_shop / s.num_dept;
s.avg_wait = s.tot_wait / s.num_dept;
s.avg_serv = s.tot_serv / s.num_dept;
//print averages
cout << "Average Shop Time" << s.avg_shop << endl;
cout << "Average Wait Time" << s.avg_wait << endl;
cout << "Average Serv Time" << s.avg_serv << endl;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.