我正在为比赛编写AI测试框架。参与者提交与给定接口(interface)匹配的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的机器人,然后使用时间进行限制(假设计算机当时没有运行其他任何东西),但这是不可取的,因为这会大大减慢我们的速度。可能会从游戏中获得结果。
最佳答案
我会与机器人建立一个接口(interface),让它们对算法进行1次迭代,然后做一个简单的计数。
如果您需要困难的时间/cpu限制,则没有太多(简单)的方法可以在Java中进行管理。
您无法使用Java测量CPU周期,但可以测量CPU时间-与仅使用挂钟时间相比,这是一个巨大的改进。
获取您要使用的当前线程的cpu时间(来自标准java.lang.management包)
ThreadMXBean tm = ManagementFactory.getThreadMXBean();
long cpuTime = tm.getCurrentThreadCpuTime();