超时没有使用线程? MiniMax-Tree的迭代深化

时间:2010-02-16 16:48:55

标签: c# time

如何在不使用线程的情况下限制迭代加深搜索的执行时间?

目前我使用这个简单的实现,但效率不高,有时甚至不会在给定的时间范围内终止..

timer.Start();
best = doSearch();
timer.Stop();
dpuble time = timer.Duration;
while (time*1000 < 400)
{
   timer.Start();
   best = doSearch();
   timer.Stop();
   time += timer.Duration;
}

2 个答案:

答案 0 :(得分:2)

如果您想避免线程化,则需要将时间戳传递到doSearch()方法中。它可以(定期)检查当前时间,如果持续时间超过某个阈值,则提出异常或返回失败的案例。

答案 1 :(得分:0)

您想如何终止执行?你想退出程序,还是只是停止搜索?如果你没有破坏你的过程,你可以这样做:

 var timer = new Timer(new TimeSpan(0, 0, 400));
 timer.Elapsed += { throw new Exception("Time's up!"); }
 timer.Start();
 doSearch();
 timer.Stop();

但我认为你想要更合理的东西。在这种情况下,您可能必须在doSearch内执行此操作。我假设该方法是迭代的或递归的,在这种情况下,您可以将开始时间存储在实例变量中,然后检查迭代/递归中众所周知的点的已用时间。例如:

private DateTime _start;
private TimeSpan _maxTime = new TimeSpan(0, 0, 400);

public void TimedSearch()
{
    _start = DateTime.Now;
    DoSearch();
}

public void DoSearch()
{
    while (notFound)
    {
        if (DateTime.Now - _start > _maxTime)
            return;

        // search code
    }
}