Моделирование очередей в ресторане в колледже - PullRequest
0 голосов
/ 09 февраля 2020

Вот ограничения: Ресторан работает с 6 утра до 23:59 дня ежедневно (следовательно, открывается в минуту 360).

В среднем, клиент приходит в ресторан каждые 5 минут. (Следовательно, 20% шансов клиента за одну минуту.)

Ресторану требуется от 2 до 7 минут, чтобы выполнить заказ клиента, и потому что только один человек управляет всем рестораном, следующий клиент в очереди будет подан только после того, как еда будет подана предыдущему клиенту.

В то время как ресторан пытается обслуживать всех в том порядке, в котором они пришли, некоторым группам людей предоставляется приоритет. Пожилые люди будут обслуживаться до юниоров; юниоры до второкурсников; второкурсники перед первокурсниками.

Пока что я реализовал приведенный ниже код, используя Java Приоритетные очереди и Карты. Я пытался идентифицировать каждого клиента по времени его прихода (начиная с 360 и далее) и его оценки. Тем не менее, я впервые использую приоритетные очереди и карты, и я не очень уверен, правильно ли я поступаю - на самом деле, она возвращает эту ошибку ниже, которую я не знаю, как исправить, несмотря на обращение к API и некоторые другие java ресурсы:

Исключение в потоке "main" java .lang.ClassCastException: java .base / java .util.AbstractMap $ SimpleEntry нельзя преобразовать в java .base / java .lang.Comparable

import java.util.*;
import java.util.PriorityQueue;
import java.util.Comparator; 
import java.util.Map; 

class CustomerComparator implements Comparator<Customer>
{
   public int compare(Customer c1, Customer c2)
   {
      if(c1.grade < c2.grade)
         return 1; 
      else if(c1.grade > c2.grade)
         return -1;
      else
         return 0;  
   }
}

class Customer
{
   public int grade;
   public double waitingTime;
   
   public Customer(int grade, double waitingTime)
   {
      this.grade = grade;
      this.waitingTime = waitingTime;
   }
   
   public int getGrade()
   {
      return grade;
   }
   
   public double getWaitingTime()
   {
      return waitingTime; 
   }
}

public class RestaurantPriority
{
   public static Queue<Map.Entry<Integer, Integer>> Restaurant = new PriorityQueue<Map.Entry<Integer, Integer>>();
   public static int waitingTime = 2 + (int)(Math.random() * ((7 - 2) + 1));
   
   public static void main(String[] args)
   {
      RestaurantPriority(); 
   }
   
   public static void RestaurantPriority()
   {
      double rand = 0.0;
      boolean newCustomer = false;
      for(int i = 360; i<1440; i++)
      {
         if(Restaurant.isEmpty())
            waitingTime = 2 + (int)(Math.random() * ((7 - 2) + 1));
         if(i == 1439)
         {
            while(!Restaurant.isEmpty())
            {
               waitingTime--;
               if(waitingTime == 0)
               {
                  Restaurant.remove();
                  waitingTime = 2 + (int)(Math.random() * ((7 - 2) + 1));
               }
               System.out.println(i + ": " + Restaurant); 
               i++;
            }
         }
         rand = Math.random();
         if(rand >= 0.0 && rand < 0.2)
            newCustomer = true; 
         else
            newCustomer = false;
         if(newCustomer)
         {
            int grade = 0;
            double rand2 = Math.random();
            if(rand >= 0.0 && rand < 0.25)
               grade = 1;
            else if(rand >= 0.25 && rand < 0.5)
               grade = 2;
            else if(rand >= 0.5 && rand <0.75)
               grade = 3;
            else
               grade = 4; 
            Restaurant.add(new AbstractMap.SimpleEntry(grade,i)); 
         }
            
         if(!Restaurant.isEmpty())
         {
            waitingTime--;
            if(waitingTime == 0)
               Restaurant.poll(); 
         }
         if(!Restaurant.isEmpty() && waitingTime == 0)
         {
            waitingTime = 2 + (int)(Math.random() * ((7 - 2) + 1));
         }
         if (i<1439)
            System.out.println(i + ": " + Restaurant); 
      }
   }
}
(Весь код написан в одном файле. Я не уверен, что это релевантная информация, но я подумал, что это может помочь.)

Я застрял на это уже несколько дней, и я очень признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Вы хотите сохранить клиентов в очереди, а не карты. Чтобы приоритетная очередь знала, как их заказать, вам нужно предоставить ей компаратор. Еще одним более элегантным решением может быть использование класса Random вместо Math.random (). Случайный может дать вам целое число с определенной верхней границей. Кроме того, вам не нужен именованный компаратор.

PS Пожалуйста, попробуйте использовать соглашение об именовании java. https://www.oracle.com/technetwork/java/codeconventions-135099.html

    public static void RestaurantPriority() {
        Random random = new Random();
        Queue<Customer> customers = new PriorityQueue<>(Comparator.comparingInt(o -> o.grade));
        double servingTime = 0;
        for (int i = 360; i < 1440; i++) {
            if(servingTime <= 0 && !customers.isEmpty()){
                servingTime = customers.poll().waitingTime;
            }
            if (random.nextDouble()<0.20) {
                customers.add(new Customer(
                    random.nextInt(4),
                    random.nextInt(5)+2)
                );
            }
            servingTime--;
        }
    }

0 голосов
/ 09 февраля 2020
public class RestaurantPriority {

public static Queue<Customer> Restaurant = new PriorityQueue<Customer>(new CustomerComparator());
public static int waitingTime = 2 + (int) (Math.random() * ((7 - 2) + 1));

public static void main(String[] args) {
    RestaurantPriority();
}

public static void RestaurantPriority() {
    double rand = 0.0;
    boolean newCustomer = false;
    for (int i = 360; i < 1440; i++) {
        if (Restaurant.isEmpty()) {
            waitingTime = 2 + (int) (Math.random() * ((7 - 2) + 1));
        }
        if (i == 1439) {
            while (!Restaurant.isEmpty()) {
                waitingTime--;
                if (waitingTime == 0) {
                    Restaurant.remove();
                    waitingTime = 2 + (int) (Math.random() * ((7 - 2) + 1));
                }
                System.out.println(i + ": " + Restaurant);
                i++;
            }
        }
        rand = Math.random();
        if (rand >= 0.0 && rand < 0.2) {
            newCustomer = true;
        } else {
            newCustomer = false;
        }
        if (newCustomer) {
            int grade = 0;
            double rand2 = Math.random();
            if (rand >= 0.0 && rand < 0.25) {
                grade = 1;
            } else if (rand >= 0.25 && rand < 0.5) {
                grade = 2;
            } else if (rand >= 0.5 && rand < 0.75) {
                grade = 3;
            } else {
                grade = 4;
            }
            Restaurant.add(new Customer(grade, i));
        }

        if (!Restaurant.isEmpty()) {
            waitingTime--;
            if (waitingTime == 0) {
                Restaurant.poll();
            }
        }
        if (!Restaurant.isEmpty() && waitingTime == 0) {
            waitingTime = 2 + (int) (Math.random() * ((7 - 2) + 1));
        }
        if (i < 1439) {
            System.out.println(i + ": " + Restaurant);
        }
    }
}}
...