2011-09-29 3 views
2

아이디어는 에이전트를위한 환경을 모델링하는 것입니다. ("이동 왼쪽!"예를 들어)비동기 게임과 유사한 환경 모델링

  1. 시스템
  2. 에이전트가 응답 다음 조치에 대한 에이전트를 요청
  3. 시스템이 적절한 상태
  4. 에 에이전트를 이동 : 가장 기본적인 경우는 좋아하는이 보인다

그러나 비동기 방식 (스레딩 등)으로이 문제를 구현하는 데 문제가 있습니다.

현재 내 시스템은 다음과 같습니다

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

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

    } 
} 

을 분명히,이 블록이 실이가 실행 중입니다. (OSGi를 사용하는 것이 당황 스럽다. 따라서 모든 단일 번들로 모든 처리 시간을 단축해서는 안된다!)

또한 시스템이 환경에 나타나는 새로운 에이전트에 반응하고 그들과 교전하고 싶습니다.

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

대신에 단지 바로 주에서 실행 ...

나는 이것을 알고 : 뭔가를 (무언가가 나타나거나 시스템에서 사라지면 내 런타임은 OSGi는 이미 저를 통지의 시설이 있습니다) 매우 혼란스럽고, 질문을 올바르게 제기하고 있는지 확신 할 수 없습니다. n 내가 볼 수있는 아키텍처 또는 접근법은 크게 감사하겠습니다.

답변

2

분명히 어떤 데이터 보호가 필요합니다 (아마도 에이전트의 마스터 목록과 각 개별 에이전트와 그 데이터에 대한 보호 기능이 필요합니다). 그 외에는

, 내가 모델의 종류에 따라 다음과 같습니다

+0

"이벤트 대기 중"이 현재 쓰레드를 차단하지 않습니까? – drozzy

+0

아이디어는 마스터 스레드와 작업자 스레드가 있다는 것입니다. 내가 게시하는 코드는 거의 작동하지 않는 마스터 스레드 용입니다. 그렇습니다. 이벤트가 끝날 때까지 기다리지 만 이벤트가 생기고 아이가 이벤트를 처리 할 때까지만 기다리게됩니다. – dbeer

0

응용 프로그램의 미래에 대해 생각할 수 있도록 두 개의 루프를 사용하는 것이 좋습니다.

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 

이 스 니펫은 두 가지를 제공합니다.

  1. 동일한 단계에서 다른 이동과 독립적으로 이동합니다. 이렇게하면 이전에 일어난 사람들에 의해 영향을받은 현재 이동이 없습니다.
  2. 에이전트가 존재하기 만하면 에이전트가 제공하는 환경을 기반으로 다음 이동을 계산하도록합니다. 따라서 상태를 변경하고, 에이전트를 여러 환경으로 복사하고, 환경이 실제와 다르다는 환상을주는 것은 매우 쉽습니다. 예를 들어, 특정 에이전트에 대한 환경의 조롱 된 버전을 만드는 filterFor(Environment e, Agent a)이있을 수 있습니다. 술취한 고글이나 눈가리개 등을 쓰는 것.
+0

죄송합니다

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 

HTH를, 나는 내 에이전트의 실제 이동을 수행하지 않는 것이 설명하는 데 실패 - 시스템이 그들을 위해 그것을 수행 . 이것은 "속임수"를 방지하기 위해서입니다 - 그들이 원하는 곳으로 이동할 수있는 곳은 ... 그래서 ... – drozzy