Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

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;

}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote