Здравствуйте. Подскажите как доработать задачу:
Создать имитационную модель «причал морских катеров».
Необходимо вводить следующую информацию:
1. Среднее время между появлениями пассажиров на причале в разное время суток.
2. Среднее время между появлениями катеров на причале в разное время суток.
3. Тип остановки катер (конечная или нет).
Необходимо определить:
1. Среднее время пребывание человека на остановке.
Оставшаяся часть задания:
Необходимо определить:
2. Достаточный интервал времени между приходами катеров, чтобы на остановке
находилось не более N людей одновременно.
3. Количество свободных мест в катере является случайной величиной.
Также прошу подсказать по счет рефакторинга метода "runSimulation".
Как его интуитивно разделить на другие методы, так чтобы код был читабельным.
/**
* Главный класс
*/
public class Main {
public static void main(String[] args) {
long avgPassengerInterval = 60000; // 1 минута - 60000 мс
long avgBoatInterval = 120000;
PierSimulation simulation = new PierSimulation(avgPassengerInterval, avgBoatInterval);
simulation.runSimulation(1000);
}
}
/**
* Класс, представляющий пассажира.
*/
public class Passenger {
private final long arrivalTime;
/**
* Конструктор для создания нового пассажира.
* @param arrivalTime время прибытия пассажира на причал.
*/
public Passenger(long arrivalTime){
this.arrivalTime = arrivalTime;
}
/**
* Получает время прибытия пассажира.
* @return время прибытия
*/
public long getArrivalTime(){
return arrivalTime;
}
}
/**
* Класс, представляющий катер.
*/
public class Boat {
/**
* Вместимость (катер расширяться не может!)
*/
private final int capacity;
/**
* Является ли остановка конечной. (Тип остановки катер (конечная или нет))
*/
private final boolean isTerminal;
/**
* Конструктор для создания нового катера.
* @param capacity вместимость катера
* @param isTerminal конечная ли остановка
*/
public Boat(int capacity, boolean isTerminal) {
this.capacity = capacity;
this.isTerminal = isTerminal;
}
/**
* Получает вместимость катера.
* @return вместимость
*/
public int getCapacity() {
return capacity;
}
/**
* Проверяет, является ли остановка конечной.
* @return true, если остановка конечная, иначе false
*/
public boolean getIsTerminal() {
return isTerminal;
}
}
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
/**
* Основной класс для симуляции работы причала.
*/
public class PierSimulation {
/**
* Пассажиры.
*/
private final Queue<Passenger> passengerQueue = new LinkedList<>();
/**
* Рандом.
*/
private final Random random = new Random();
/**
* Среднее время прибытия пассажиров (мс). (Среднее время между появлениями пассажиров на причале в разное время суток)
*/
private final long avgPassengerInterval;
/**
* Среднее время прибытия катеров (мс). (Среднее время между появлениями катеров на причале в разное время суток).
*/
private final long avgBoatInterval;
/**
* Конструктор для создания новой симуляции пирса.
* @param avgPassengerInterval среднее время прибытия пассажиров
* @param avgBoatInterval среднее время прибытия катеров
*/
public PierSimulation(long avgPassengerInterval, long avgBoatInterval) {
this.avgPassengerInterval = avgPassengerInterval;
this.avgBoatInterval = avgBoatInterval;
}
/**
* Генерация свободных рандомных мест в катере.
* @return рандомное кол-во мест.
*/
private int generateFreeSeats(){
return random.nextInt(11);
}
/**
* Метод по запуску симуляции.
* @param iteration - количество итераций - этапов,
* currentTime - текущее время,
* totalWaitingTime - общее время ожидания,
* averageWaitingTime - среднее время ожидания,
* nextPassengerTime - время следующего пассажира,
* getArrivalTime - получает время прибытия пассажира,
* nextBoatTime - время следующего отплытия,
* generateRandomTime - генерирует рандомное время на основе среднего интервала,
* newPassenger - новый пассажир,
* passengerQueue - очередь пассажиров,
* totalPassengersProcessed - общее количество обработанных пассажиров,
* avgPassengerInterval - среднее время прибытия пассажиров (мс),
* avgBoatInterval - среднее время прибытия катеров (мс),
* arrivingBoat - прибывающий катер.
*/
public void runSimulation(int iteration){
long currentTime = 0;
long totalWaitingTime = 0;
long totalPassengersProcessed = 0;
for (int i = 0; i < iteration; i++) {
long nextPassengerTime = currentTime + generateRandomTime(avgPassengerInterval);
Passenger newPassenger = new Passenger(nextPassengerTime);
passengerQueue.add(newPassenger);
long nextBoatTime = currentTime + generateRandomTime(avgBoatInterval);
Boat arrivingBoat = new Boat(generateFreeSeats(), random.nextBoolean());
while (!passengerQueue.isEmpty() && nextBoatTime >= passengerQueue.peek().getArrivalTime()) {
Passenger passenger = passengerQueue.poll();
totalWaitingTime += nextBoatTime - passenger.getArrivalTime();
totalPassengersProcessed++;
}
currentTime = nextBoatTime;
}
double averageWaitingTime = totalPassengersProcessed > 0 ? (double) totalWaitingTime / totalPassengersProcessed : 0;
System.out.printf("Среднее время прибытия пассажиров на остановке: %.2f секунд", averageWaitingTime / 1000);
}
/**
* Генерирует рандомное время на основе среднего интервала.
* @param average Среднее значение интервала времени (мс)
* @return случайное время в (мс) на основе экспоненциального распределения
*/
private long generateRandomTime(long average){
return (long) (-Math.log(1.0 - random.nextDouble()) * average);
}
}
Пока выходит результат:
Среднее время прибытия пассажиров на остановке: 124,56 секунд
Спасибо.