Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,当时间用完时中断递归_Java_Recursion_Timer_Break_Chess - Fatal编程技术网

在java中,当时间用完时中断递归

在java中,当时间用完时中断递归,java,recursion,timer,break,chess,Java,Recursion,Timer,Break,Chess,我正在为象棋类游戏实现人工智能。我打算使用递归来尝试电路板的所有可能状态,并选择“最佳动作” 由于每次移动的时间限制,每当达到时间限制时,我需要一些机制来打破这些递归过程。当然,在进行递归调用之前,我可以继续检查时间,如果当前时间接近极限,则可以中断,但这是对程序性能的权衡 如果有一种方法可以在计时器结束时中断这些递归过程,那就太好了。然而,由于我是Java新手,我不知道在Java中是否有这样做的方法?你能给出一个示例代码吗 检查时间,例如System.currentTimeMillis每次通话

我正在为象棋类游戏实现人工智能。我打算使用递归来尝试电路板的所有可能状态,并选择“最佳动作”

由于每次移动的时间限制,每当达到时间限制时,我需要一些机制来打破这些递归过程。当然,在进行递归调用之前,我可以继续检查时间,如果当前时间接近极限,则可以中断,但这是对程序性能的权衡


如果有一种方法可以在计时器结束时中断这些递归过程,那就太好了。然而,由于我是Java新手,我不知道在Java中是否有这样做的方法?你能给出一个示例代码吗

检查时间,例如System.currentTimeMillis每次通话大约花费200纳秒。然而,如果这对您来说太多,您可以让另一个线程设置一个标志停止

已经有一种机制可以做到这一点

ExecutorService es = Executors.newSingleThreadExecutor();
Future f = es.submit(new Runnable() {
    @Override
    public void run() {
        long start = System.nanoTime();
        while(!Thread.interrupted()) {
            // busy wait.
        }
        long time = System.nanoTime() - start;
        System.out.printf("Finished task after %,d ns%n", time);
    }
});
try {
    f.get(1, TimeUnit.SECONDS); // stops if the task completes.
} catch (TimeoutException e) {
    f.cancel(true);
}
es.shutdown();
印刷品

Finished task after 1,000,653,574 ns

注意:您不需要每次启动/停止Executor服务。

检查时间,例如System.currentTimeMillis每次呼叫的费用约为200纳秒。然而,如果这对您来说太多,您可以让另一个线程设置一个标志停止

已经有一种机制可以做到这一点

ExecutorService es = Executors.newSingleThreadExecutor();
Future f = es.submit(new Runnable() {
    @Override
    public void run() {
        long start = System.nanoTime();
        while(!Thread.interrupted()) {
            // busy wait.
        }
        long time = System.nanoTime() - start;
        System.out.printf("Finished task after %,d ns%n", time);
    }
});
try {
    f.get(1, TimeUnit.SECONDS); // stops if the task completes.
} catch (TimeoutException e) {
    f.cancel(true);
}
es.shutdown();
印刷品

Finished task after 1,000,653,574 ns

注意:您不必每次都启动/停止Executor服务。

我认为没有什么好方法可以不检查您是否可以继续

即使你查过时间。。。如果还有8毫秒,会发生什么。你能保证你的递归调用会在这段时间内完成吗?你会检查每一小步之后的时间吗?这可能会增加很多额外的开销

一种方法是在一个线程中运行executionrecursion逻辑,在另一个线程中运行计时器。当计时器完成时,它会调用执行线程上的中断。在工作线程中,每次完成递归时,都会保存所需的状态。然后,如果它被中断,返回上次保存的状态


这只是对一种方法的简单描述。。绝不是最好的方法

我不认为有任何好的方法不包括检查是否可以继续

即使你查过时间。。。如果还有8毫秒,会发生什么。你能保证你的递归调用会在这段时间内完成吗?你会检查每一小步之后的时间吗?这可能会增加很多额外的开销

一种方法是在一个线程中运行executionrecursion逻辑,在另一个线程中运行计时器。当计时器完成时,它会调用执行线程上的中断。在工作线程中,每次完成递归时,都会保存所需的状态。然后,如果它被中断,返回上次保存的状态


这只是对一种方法的简单描述。。决不是最好的方法,您可以使用布尔标志来设置AI任务何时必须停止


创建一个将运行AI任务的线程,该线程将在每次递归调用之前检查一个布尔变量。检查布尔变量比调用方法获取时间更有效。在有限的时间内执行父线程睡眠。唤醒后,设置布尔标志以停止子线程。

您可以使用布尔标志来设置AI任务何时必须停止


创建一个将运行AI任务的线程,该线程将在每次递归调用之前检查一个布尔变量。检查布尔变量比调用方法获取时间更有效。在有限的时间内执行父线程睡眠。唤醒后,设置布尔标志以停止子线程。

我建议您看看这个问题:还有这个问题:为什么不将时间作为参数传递给递归调用?然后进行基本情况检查,看时间是否已用完,并在此时返回最佳解决方案。在我看来,检查变量的值对总体性能的影响可以忽略不计。我建议您看看这个问题:还有这个问题:为什么不将时间作为参数传递给递归调用?然后进行基本情况检查,看看时间是否用完了,然后返回此时的最佳解决方案。在我看来,检查变量的值,时间对整体性能的影响可以忽略不计。啊,这看起来是一个很好的方法。。。我没有太多使用Futures,看起来有一个很好的中断机制;返回一个值,跨多个线程运行/排队多个任务。如果您可以拆分搜索,您可能可以使用机器中的所有内核;啊,这看起来是个很好的方法。。。我没有太多使用Futures,看起来有一个很好的中断机制;返回一个值,跨多个线程运行/排队多个任务。如果可以分割搜索,则可以使用计算机中的所有核心。 ;