Моделирование асинхронной игровой среды - PullRequest
2 голосов
/ 30 сентября 2011

Идея состоит в том, чтобы смоделировать среду для агентов.В самом простом случае это выглядит примерно так:

  1. Система запрашивает у агента следующее действие
  2. Агент отвечает (например, «двигаться влево!»)
  3. Системапереводит агента в соответствующее состояние

Однако у меня возникают проблемы с реализацией этого асинхронным образом (с многопоточностью и т. д.).

В настоящее время моя система выглядит следующим образом:

void Start(){
   while(true && !gameOver){
       askAgent()
       moveAgent()

       if(agentState == terminalState){ 
          gameOver = True;
       }

   }
 }

Очевидно, это блокирует поток, в котором он запущен.(Что еще более неприятно, так это то, что я использую OSGi, поэтому ни один пакет не должен занимать все время обработки!)

Кроме того, я хотел бы, чтобы система реагировала на новых агентов, появляющихся в среде, и взаимодействовала сих (моя среда выполнения, OSGi, уже имеет возможность уведомлять меня, если что-то появляется или исчезает из системы) что-то вроде:

void setAgent(Agent agent){
       system.addAgentToEnvironment(agent);
       system.simulateAgent(agent);
}

Вместо того, чтобы просто бежать из главного сразу ...

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

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Вам определенно понадобится некоторая защита данных (возможно, в основном списке агентов и некоторая защита для каждого отдельного агента и его данных).

Кроме этого, я бы следовал этой модели:

while (waiting for events)
  spawn thread to respond to event // add agent, calculate and perform move, etc.
  // even better would be to enqueue the event into a thread pool

  if (terminal)
    break // end game

НТН

0 голосов
/ 30 сентября 2011

Чтобы помочь вам подумать о будущем приложения, я призываю вас использовать две петли.

long then = System.currentTimeMillis();
for(Agent a : agents) {
    agent.calcuateNextMove(getEnvironment());
}

for(Agent a : agents) {
    agent.performNextMove(getEnvironment());
}
long now = System.currentTimeMillis();
sleep(TIME_STEP_DURATION + now - then); // give you a steady frame rate in relation to real time

Этот фрагмент дает вам две вещи.сделаны независимо от других ходов на том же шаге.Таким образом, на ваш текущий ход не влияют те, кто случайно переехал до вас.

Агент просто существует, и ему просто говорят вычислить его следующий ход на основе среды, которую вы ему предоставляете.Это делает невероятно простым изменение состояний, копирование агентов в несколько сред и создает иллюзию того, что среда отличается от реальной.Например, у вас может быть filterFor(Environment e, Agent a), который создает макетированную версию среды для этого конкретного агента.Как носить пьяные очки или повязку на глаза или что-то в этом роде.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...