我们的想法是为代理商建立一个环境模型。在最基本的情况下,它看起来像这样:
但是,我在异步方式(使用线程等)实现它时遇到了麻烦。
目前我的系统如下:
void Start(){
while(true && !gameOver){
askAgent()
moveAgent()
if(agentState == terminalState){
gameOver = True;
}
}
}
显然,这会阻止正在运行的线程。 (更令人尴尬的是我使用OSGi,所以任何一个捆绑都不应该占用所有的处理时间!)
另外,我希望系统能够对出现在环境中的新代理做出反应,并与它们进行交互(我的运行时,OSGi,已经具有通知我,如果某些内容出现或从系统中消失的话),例如:< / p>
void setAgent(Agent agent){
system.addAgentToEnvironment(agent);
system.simulateAgent(agent);
}
而不是直接从主要跑道......
我知道这非常令人困惑,而且我不确定我是否正确地提出了这个问题 - 所以我对建筑或方法的任何提示都非常感激。
答案 0 :(得分: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
答案 1 :(得分: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
这段代码为您提供了两件事。
filterFor(Environment e, Agent a)
为该特定代理程序创建环境的模拟版本。喜欢戴着醉酒护目镜或眼罩或其他东西。