Какова лучшая архитектура для этого симулятора? - PullRequest
6 голосов
/ 10 октября 2011

Мне нужно сделать симулятор на Java, который будет имитировать езду на автомобиле по шоссе. На трассе должно быть 3 полосы, на каждой полосе есть машины с постоянной скоростью. На этой трассе есть один агент, который должен проехать, а не врезаться в любую другую машину. Подробное описание можно найти в этой статье в разделе 2.5 и на рисунке 5.

Это изображение из упомянутой бумаги и показывает внешний вид шоссе:

enter image description here

Моя цель - написать только симулятор (и 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);

И это ужасно и безобразно.

Так что мне нужна небольшая помощь от умных людей здесь. Может кто-нибудь дать мне ссылку на книгу, статью, что-нибудь о симуляторах / архитектуре? Или объясните мне, что я делаю не так?

Я не программист, и этот проект является частью факультативного курса на факультете под названием Разработка программного обеспечения .

Ответы [ 2 ]

6 голосов
/ 12 октября 2011

Я бы рекомендовал спроектировать интерфейс агента с формальным представлением интеллектуального агента в уме : с точки зрения симуляции, это черный ящик, который получает воспринимает из своего окружения (например, данные датчика), а затем принимает решение об определенном действии (например, для управления автомобилем влево или вправо)

Исходя из этого определения и в предположении простого дискретного пошагового моделирования , ваш класс агента может выглядеть следующим образом:

public abstract class BaseAgent {
    public AgentAction act(HighwayPerception hwyPerception);
}

, где AgentAction будет типом, представляющим действия, которые агент может решить выполнить за один шаг (в самом простом случае это будет перечисление со значениями STEER_LEFT, STEER_RIGHT и т. Д. - - для более сложных задач вы можете определить целую иерархию классов с AgentAction как суперкласс / интерфейс). Задачей симулятора является интерпретация объектов AgentAction, возвращаемых агентом, и изменение состояния его среды (т. Е. Объекта Highway) соответственно.

Параметр HighwayPerception, с другой стороны, представляет все, что агент способен воспринимать на текущем временном шаге: например, насколько быстро автомобиль (getMySpeed()) или расстояние до следующего автомобиля (getNearestCarInLane(int laneNumber)). Это исключает непосредственное соединение агента с его окружением (т. Е. Highway) - что важно, поскольку оно разделяет проблемы : только агенты воспринимают их окружение принимает решение о действиях, а не взаимодействует с ним напрямую. Опять же, задачей симулятора является создание восприятий для агента с учетом текущего состояния его среды.

Наконец, этот дизайн также облегчает управление агентами . Класс HighwayPercept должен быть спроектирован так, чтобы его можно было использовать только для чтения данных, которые агент должен уметь воспринимать , чтобы не влиять на окружающую среду напрямую. Напротив, агент в вашем первоначальном дизайне имеет доступ к Highway объекту как таковому и поэтому может попытаться обмануть , например, see автомобилей на несколько миль вперед и соответственно спланировать свой маршрут, или просто поменять положение других машин на трассе. Это никогда не должно быть возможно , даже если вы не очень заботитесь о безопасности, потому что такие вещи могут также произойти непреднамеренно и могут быть сложными для отладки.

В зависимости от ваших требований, ваша архитектура, конечно, может быть гораздо более сложной . Дополнительную информацию должно быть легко получить из литературы по системам мультиагентного моделирования (это обобщение вашей проблемы, т.е. можно смоделировать несколько агентов для управления на твоей трассе). В этой области проводится много исследований, и есть несколько инструментов для мультиагентного моделирования, на которые вы, возможно, захотите взглянуть (например, Repast ).

0 голосов
/ 10 октября 2011

Лично я бы инкапсулировал Шоссе, которое должно содержаться в Симуляторе. Если на симуляторе более 1 автомагистрали, то я предполагаю, что агент будет находиться на любом из объектов автомагистрали, поэтому агент может принадлежать симулятору и связываться с автомагистралью. Но симулятор должен быть шаблоном фасада, поэтому все, что вам нужно сделать, это создать симулятор и, возможно, при желании передать ему конфигурацию, чтобы вам не приходилось с ними иметь дело. У каждого агента должен быть метод run (), и в имитаторе должен быть поток, который вызывает run () для каждого содержащегося в нем агента, или вы можете выполнить ручной шаг в Simulation, который вызывает run () один раз для каждого агента (например, Пошаговый симулятор).

...