2011-09-29 51 views
2

這個想法是爲代理模擬環境。在最基本的情況下,它看起來喜歡這樣的:建模異步遊戲式環境

  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); 
} 

而不是從主只是運行直了......

我知道這是非常混亂,我不知道我是否甚至提出正確的問題 - 所以任何提示o ñ我可以看看的架構或方法非常感謝。

回答

2

您肯定需要一些數據保護(可能在代理的主列表上,以及對每個代理及其數據的某種保護)。

除此之外,我會按照這種模式:

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

+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

對不起,我無法解釋我的代理並不實際執行動作 - 系統會爲他們。這是爲了防止「作弊」 - 他們可以移動到任何他們想要的地方...所以是... – drozzy