用Java限制线程执行处理器周期

时间:2009-12-01 21:57:06

标签: java multithreading artificial-intelligence

我正在为竞赛编写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运行机器人,然后使用时间进行限制(假设计算机当时没有运行任何其他东西),但这是不可取的,因为它会显着降低我们的速度可以从游戏中得到结果。

4 个答案:

答案 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做了类似的事情......你可能想看看那里。