Вот ограничения: Ресторан работает с 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);
}
}
}
(Весь код написан в одном файле. Я не уверен, что это релевантная информация, но я подумал, что это может помочь.)
Я застрял на это уже несколько дней, и я очень признателен за любую помощь.