Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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中有效地限制函数(anytime算法)的时间?_Java_Algorithm_Search_Minimax - Fatal编程技术网

如何在Java中有效地限制函数(anytime算法)的时间?

如何在Java中有效地限制函数(anytime算法)的时间?,java,algorithm,search,minimax,Java,Algorithm,Search,Minimax,我想用深度优先搜索来解决极大极小问题;然而,为了使我的算法能够完成并始终有一个解决方案,我使用了迭代DFS(因此,找到所有节点一层,然后两层,然后三层)。我希望能够在经过一定时间后中断搜索,但是,我似乎找不到一个好方法,除了将递归算法转换为具有堆栈的迭代算法,并检查每个循环的时间(这似乎效率低下)或者将结束时间传递到所有递归调用中,并在每个调用的开始处进行检查(这似乎比迭代调用更低效、更复杂) 除了Java8源代码之外,我不希望使用任何其他库 伪代码: function negamax(node

我想用深度优先搜索来解决极大极小问题;然而,为了使我的算法能够完成并始终有一个解决方案,我使用了迭代DFS(因此,找到所有节点一层,然后两层,然后三层)。我希望能够在经过一定时间后中断搜索,但是,我似乎找不到一个好方法,除了将递归算法转换为具有堆栈的迭代算法,并检查每个循环的时间(这似乎效率低下)或者将结束时间传递到所有递归调用中,并在每个调用的开始处进行检查(这似乎比迭代调用更低效、更复杂)

除了Java8源代码之外,我不希望使用任何其他库

伪代码:

function negamax(node, depth, α, β, color)
    if depth = 0 or node is a terminal node
        return color * the heuristic value of node
    bestValue := -∞
    childNodes := GenerateMoves(node)
    childNodes := OrderMoves(childNodes)
    foreach child in childNodes
        val := -negamax(child, depth - 1, -β, -α, -color)
        bestValue := max( bestValue, val )
        α := max( α, val )
        if α ≥ β
            break
    return bestValue

function search()
    depth := 0
    bestValue := null
    while (++depth > 0) // runs forever until interrupted
        bestValue := negamax( rootNode, depth, -∞, +∞, 1)
    return bestValue

function main()
    search();

您可以使用多线程概念。
例如:


希望有帮助。

您能展示一下您的代码吗?这样就更容易想出一些具体的解决办法。我会提供扩展Thread.class(或实现Runnable接口)和使用中断机制。我会使用@Battle#u Slug:使用标准的任务取消机制(在C中是CancellationToken,对Java不太确定),并让第二个线程(计时器)在一定时间后取消操作。我目前实际上没有任何代码,但我将添加一些伪代码。您可以使用作为必须触发算法停止的标志。检查每次运行时的标志。如果为真,则停止该算法。
stop
已停止<代码>睡眠不能保证1000毫秒已经过去,因为时间片可以给其他线程。你最好去别处计算一下时间。
Thread tempThread = new Thread("tempThread");
Thread originalThread = new Thread("DFSthread");
public void run() //run() of tempThread
{ 
 try{
      tempThread.sleep(1000); //you can add the limit you want here
      originalThread.stop();
}
catch(InterruptedException exc)
{
   System.out.println(exc);
}