user3774047
user3774047

Reputation:

queue simulation to calculate customer waiting time

I've been working away at this problem for the past 10-12 hours, and was wondering if you guys could help me debug/point me in the right general direction. The object of the program is to simulate a fast food store queue-line, which I'm attempting to accomplish using:

PriorityQueue (FIFO) data structure

I've consulted with colleagues, on-campus tutoring services, professors and the given course textbook: "Java How To Program: Deitel & Deitel" to no avail.

The provided pseudocode for the problem is as follows (I'm not trying to get you to do it for me):

BigBurger Inc. wants to see if having a single person at the counter both to take orders and to serve them is feasible. At each BigBurger, customers will arrive and get in line. When they get to the head of the line they will place their order, which will be assembled and served to them. Then they will leave the BigBurger and the next person in line will be able to order.
We need to know how long a customer may be forced to wait before he or she can place an order. Given a script that lists each customer for a typical day, we want to calculate the maximum customer waiting time. Each customer in the script is characterized by an arrival time (measured in minutes after the store opened) and a service duration (the number of minutes between ordering and getting the food).
Create a class BigBurger that contains method maxWait that is given a int[] arrival and a int[] service describing all the customers and returns the maximum time spent by a customer between arriving and placing the order. Corresponding elements of arrival and service refer to the same customer, and they are given in the order in which they arrive at the store (arrival is in non-descending order).
If multiple customers arrive at the same time they will all join the line at the same time, with the ones listed earlier ahead 
of ones appearing later in the list.
Definition
    
Class:
BigBurger
Method:
maxWait
Parameters:
int[], int[]
Returns:
int
Method signature:
int maxWait(int[] arrival, int[] service)
(be sure your method is public)
    
Constraints-
arrival will contain between 1 and 50 elements inclusive-
service will contain the same number of elements as arrival-
the elements of arrival will be in non-decreasing order-
each element of arrival will be between 1 and 720 inclusive-
each element of service will be between 1 and 15 inclusive

Examples    
{3,3,9}
{2,15,14}
Returns: 11
Two customers arrive at time 3. The first one waits 0 time, orders, and is served after 2 minutes, leaving at time 5. The second one then orders and is served at time 20. Meanwhile a customer arrives at time 9 and waits until the second customer leaves. This last customer then orders at time 20, and is served and leaves at time 20+14 = 34. The first customer waited 0 minutes, the second waited 2 minutes (from time 3 to time 5), and the last customer waited 11 minutes (from time 9 to time 20).
    

I have researched for example on the net, usually arrival time is calculated using system nano time or using a random method, but here in this case the arrival time and service time is already provided in the examples and I have to calculate the total wait time of each customer. Please guide me through this as I am new to coding.

The issues I'm experiencing:

Unable to print maxWaitTime for the customer when I call return maxWaitTime in the method maxWait(int[], int[])

Here is my code:

import java.util.*;


public class QueueProgram 
{
    static int[] arrival = {3,3,9};
    static int[] service = {2,15,14};

    int waitTime;
    int finishTime;
    int serviceTime;
    static int index;


    Queue<Integer> Customers = new LinkedList<Integer>();


    public int maxWait(int[] arrival, int[] service)
    {
        //this.arrival = arrival;
        //this.service = service
        int maxWaitTime = 0;
        int[]finishTime = new int[arrival.length];

        for(int i=0; i<arrival.length;i++)
        {
            int startTime;
            index = i;
            if(index == 0)
            {
                 startTime = arrival[index];
                 System.out.println(startTime);
            }
            else
            {
                startTime = Math.max(arrival[i],finishTime[i-1]);
            }
            finishTime[i] = startTime + service[i];
            waitTime = finishTime[i] - service[i] - arrival[i];

            if(waitTime > maxWaitTime)
            {
                maxWaitTime = waitTime;
            }
        }
        return maxWaitTime;
    }

    public static void main(String[] args) 
    {
        QueueProgram q = new QueueProgram();
        q.maxWait(arrival, service);
    }

}

Upvotes: 1

Views: 10547

Answers (2)

Meena Chaudhary
Meena Chaudhary

Reputation: 10715

variable index is redundant, i already represents array index. Secondly, waitTime can be calculated as finshTime[i-1]-arrival[i], no need to calculate startTime. Lesser operations better space and time complexity.

try this:

   for(int i=0; i<arrival.length;i++)
    {       
      if(i != 0) { 
        waitTime = finishTime[i-1] - arrival[i];
        if(waitTime > maxWaitTime)
        { maxWaitTime = waitTime;}
      }
      finishTime[i] = arrival[i] + service[i];         
    }

Upvotes: 0

user3774047
user3774047

Reputation:

import java.util.*;


public class QueueProgram 
{
    static int[] arrival = {3,3,9};
    static int[] service = {2,15,14};

    int waitTime;
    int finishTime;
    int serviceTime;
    static int index;

    Queue<Integer> Customers = new LinkedList<Integer>();   

    public int maxWait(int[] arrival, int[] service)
    {
        //this.arrival = arrival;
        //this.service = service
        int maxWaitTime = 0;
        int[]finishTime = new int[arrival.length];

        for(int i=0; i<arrival.length;i++)
        {
            int startTime;
            index = i;
            if(index == 0)
            {
                 startTime = arrival[index];
                 //System.out.println(startTime);
            }
            else
            {
                startTime = Math.max(arrival[i],finishTime[i-1]);
            }
            finishTime[i] = startTime + service[i];
            waitTime = finishTime[i] - service[i] - arrival[i];

            if(waitTime > maxWaitTime)
            {
                maxWaitTime = waitTime;
            }
        }
        return maxWaitTime;
    }

    public static void main(String[] args) 
    {
        QueueProgram q = new QueueProgram();
        q.maxWait(arrival, service);
        System.out.println("Maximum wait time is: " + q.maxWait(arrival, service));
    }

}

Upvotes: 1

Related Questions