1


0

スレッドを使用せずにタイムアウトしますか? MiniMax-Treeの反復的な深化

スレッドを使用せずに反復深化検索の実行時間を制限するにはどうすればよいですか?

現在、この単純な実装を使用していますが、効率的ではなく、特定の期間内に終了しないこともあります。

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

2 Answer


2


スレッド化を避けたい場合、タイムスタンプを `doSearch()`メソッドに渡す必要があります。 現在の時刻を(定期的に)チェックし、期間がしきい値を超えている場合、例外を発生させるか、失敗したケースを返します。


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