我正在为竞赛编写AI测试框架。参与者提交与给定界面匹配的Bot类。然后所有的机器人都玩转弯游戏。每一次,我都想做以下事情:
For every bot B:
start a thread that runs at most N cycles and does B.getNextMove()
wait for all threads to complete
Make all moves (from each bot).
我的困难在于“最多N次循环”。我可以按时间限制所有机器人(比如每回合半秒),但这意味着有些人可以获得比其他人更多的处理器周期,并且不允许严格的“你的机器人应该能够做出决定:转向X时间“在比赛中的要求。
如上所述,这是Java。有任何想法吗?我一直在关注并发和锁定,但这并不是正确的方向。此外,有可能不在Parralel运行机器人,然后使用时间进行限制(假设计算机当时没有运行任何其他东西),但这是不可取的,因为它会显着降低我们的速度可以从游戏中得到结果。
答案 0 :(得分:5)
我与机器人建立了一个界面,让他们对他们的算法做一次迭代,然后做一个简单的计算。
如果您需要硬盘时间/ CPU限制,那么在Java中管理它的方法就不那么多(简单)了。
您无法使用java测量cpu周期,但您可以测量CPU时间 - 与仅使用挂钟时间相比,这是一个巨大的改进。
获取您使用的当前线程的cpu时间(来自标准java.lang.management包)
ThreadMXBean tm = ManagementFactory.getThreadMXBean();
long cpuTime = tm.getCurrentThreadCpuTime();
答案 1 :(得分:1)
由于您正在控制机器人执行并明确地自己调用,为什么不计算迭代? e.g。
public class Botcaller extends Thread
{
private Bot bot;
int cycles_completed;
public static final int MAX_ALLOWED_CYCLES=...;
public void run()
{
while (cycles_completed <MAX_ALLOWED_CYCLES)
{
bot.move;
cycles_completed++;
yield()
}
}
}
答案 2 :(得分:0)
我认为从Java这个低级别控制线程是非常困难的。我不知道如何安全地停止正在运行的线程。
另一种选择是让每个机器人在任何时间运行。每个bot有一个线程,但每秒轮询主线程中的位置。如果他们没有在那个“回合”中更新位置,那么他们会错过并且必须等待下一个。确保每个机器人看到的世界状态是由主线程控制的状态。
这种方法的好处在于,如果他们想做更复杂的事情,它会让机器人牺牲轮次。
答案 3 :(得分:0)
我认为Robocode做了类似的事情......你可能想看看那里。