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