Мне нужно сделать симулятор на Java, который будет имитировать езду на автомобиле по шоссе. На трассе должно быть 3 полосы, на каждой полосе есть машины с постоянной скоростью. На этой трассе есть один агент, который должен проехать, а не врезаться в любую другую машину. Подробное описание можно найти в этой статье в разделе 2.5 и на рисунке 5.
Это изображение из упомянутой бумаги и показывает внешний вид шоссе:
Моя цель - написать только симулятор (и GUI), а не логику агента. Теперь я хотел бы спроектировать архитектуру этого симулятора, и здесь мне нужна помощь.
Моя идея, как может выглядеть API агента:
public abstract class BaseAgent {
public abstract void run()
public abstract void onCrash();
}
Агент (автомобиль) на шоссе должен быть потомком этого класса. На каждом этапе симулятор вызывает функцию run()
, где находится логика агентов. В этой функции агент может вызывать такие функции, как:
goLeft();
goRight();
getNearestCarInLane(int lane_no);
getMySpeed();
Таким образом, на каждом шаге агент может решить, оставаться ли ему в текущем ряду, или он поворачивает налево или направо. И это все, что может сделать агент.
Так что это агентское API, но я не знаю, как спроектировать остальную часть симулятора. Моя первая попытка симулятора архитектуры была:
class Agent — descendant of BaseAgent, can ride on highway.
class Highway — stores position of all cars on highway.
class Simulator — creates instance of agent and highway; in every step, call agent’s `run()` and monitors any car crash.
Это не очень хорошая архитектура. В каком классе должны быть методы goLeft()
, goRight()
и getNearestCarInLane()
? Потому что эти методы должны быть в классе BaseAgent
, но должны знать положение каждого автомобиля на шоссе. В итоге у меня было что-то вроде этого:
Simulator s = new Simulator();
Highway h = new Highway();
Agent a = new Agent();
s.setAgent(a);
s.setHighway(h);
a.setHighway(h);
h.setAgent(a);
И это ужасно и безобразно.
Так что мне нужна небольшая помощь от умных людей здесь. Может кто-нибудь дать мне ссылку на книгу, статью, что-нибудь о симуляторах / архитектуре? Или объясните мне, что я делаю не так?
Я не программист, и этот проект является частью факультативного курса на факультете под названием Разработка программного обеспечения .