2011-09-29 57 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