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

时间:2015-02-17 05:55:04

标签: java algorithm search minimax

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

我不想使用除Java 8源之外的任何其他库。

伪代码:

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();

1 个答案:

答案 0 :(得分:1)

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

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);
}

希望它有所帮助。