2012-03-22 78 views
1

我在与跳棋类似的游戏中进行alpha beta修剪的游戏树搜索,但在确定我的最佳举措方面,我获得了严格的5秒限制。我希望递归在分配时间到来之前输入基本情况。在Java中,如何在一段时间后结束递归?

如何检查我有多少时间离开,或者当我的时间差不多完成时更改布尔值?

+0

只是一个idea.Take一个静态变量,并根据您的要求使用。 – 2012-03-22 09:56:33

+0

有没有一个内置的java类,你会推荐用来跟踪时间?你将如何实现它?此外,感谢您的回复 – 2012-03-22 09:59:41

回答

0

在每个步骤中,使用System.currentTimeMillis()获取当前时间,并将其与递归开始之前保存的时间进行比较。

0

你可以创建一个新的线程来计数,并在5秒钟内改变一个可以从其他地方检查的布尔值。这样的事可能吗?

Executors.newCachedThreadPool().execute(new Runnable() { 
        public void run() { 
          Thread.sleep(5000); 
          timeout = true; 
}}); 
+0

所以我会初始化超时为false,在我开始取消之前运行此权利,然后检查它是否属于我的基本情况? – 2012-03-22 10:05:34

+0

你会工作的。另外@dldnh的解决方案也将工作我猜。 – Giannis 2012-03-22 10:07:15

+0

好的,谢谢你的男人! – 2012-03-22 10:13:06

0

有很多方法可以做到这一点。正如其他帖子中所建议的,您可以使用System.currentTimeMillis(),并根据您通过递归调用传递的long startTime变量进行检查,或者在执行递归函数时以某种方式提供给它。 你可以使用RunnableCallable翻转一个标志或在5000ms后运行回调sleep(),但我认为这可能是矫枉过正。

上次没有这样的事情,我使用了一种叫做StopWatchGuava class,它提供了一个名为elapsedMillis()不错的方法,让你经过的毫秒数,因为你开始你的StopWatch。这种方法最像System.currentTimeMillis(),但要求稍微少一点的锅炉板。如果引入番石榴作为依赖项不是一种选择,那么你总是可以自己实现一个类似的类,在任何情况下,它都可以简单地使用System.currentTimeMillis()