我正在为竞赛编写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运行机器人,然后使用时间进行限制(假设计算机当时没有运行任何其他东西),但这是不可取的,因为它会显着降低我们的速度可能有游戏的结果.
我与机器人建立了一个接口,让他们对他们的算法做一次迭代,然后做一个简单的计数.
如果您需要硬盘时间/ CPU限制,那么在Java中管理它的方法就不那么多(简单)了.
您无法使用java测量cpu周期,但您可以测量CPU时间 - 这比仅使用挂钟时间有了很大的改进.
获取当前线程的cpu时间(来自标准的java.lang.management包)
ThreadMXBean tm = ManagementFactory.getThreadMXBean(); long cpuTime = tm.getCurrentThreadCpuTime();