1

チェスのようなゲームにAIを実装しています。ボードの可能なすべての状態を試し、「最良の動き」を選択するために再帰を使用するつもりです。

移動ごとの時間制限があるため、時間制限に達するたびにこれらの再帰的手順から抜け出すための何らかのメカニズムが必要です。もちろん、再帰呼び出しを行う前に時間をチェックし続け、現在の時間が制限に近い場合はブレークアウトすることができますが、それは私のプログラムのパフォーマンスとのトレードオフです。

タイマーが終了するたびに、これらの再帰的な手順から抜け出す方法があれば素晴らしいと思います。しかし、私はJavaを初めて使用するので、Javaでそうする方法があるかどうかわかりません。サンプルコードを教えてください。:)

4

3 に答える 3

3

時間を確認します。たとえば、System.currentTimeMillis()は、呼び出しごとに約200nsのコストがかかります。ただし、これで問題が解決しない場合は、別のスレッドに停止するフラグを設定させることができます。

これを行うメカニズムはすでにあります。

ExecutorService es = Executors.newSingleThreadExecutor();
Future f = es.submit(new Runnable() {
    @Override
    public void run() {
        long start = System.nanoTime();
        while(!Thread.interrupted()) {
            // busy wait.
        }
        long time = System.nanoTime() - start;
        System.out.printf("Finished task after %,d ns%n", time);
    }
});
try {
    f.get(1, TimeUnit.SECONDS); // stops if the task completes.
} catch (TimeoutException e) {
    f.cancel(true);
}
es.shutdown();

プリント

Finished task after 1,000,653,574 ns

注:ExecutorServiceを毎回開始/停止する必要はありません。

于 2011-05-05T16:10:35.113 に答える
2

続行できるかどうかを確認することなく、これを行うための良い方法はないと思います。

8 milliseconds時間を確認したとしても…残っているとどうなりますか。その時間内に再帰呼び出しが終了することを保証できますか?小さなステップごとに時間をチェックしますか(これにより、多くの余分なオーバーヘッドが追加される可能性があります)?

1つの方法は、実行(再帰)ロジックを1つのスレッドで実行し、タイマーを別のスレッドで実行することです。タイマーが完了するinterrupt()と、実行スレッドでが呼び出されます。ワーカースレッドでは、再帰を完了するたびに、必要な状態を保存します。その後、中断された場合は、最後に保存された状態を返します。

それはそれを行うための1つの方法の簡単な説明です..決して最良の方法ではありません

于 2011-05-05T16:15:41.850 に答える
0

ブールフラグを使用して、AIタスクを停止する必要があるタイミングを設定できます。

AIタスクを実行するスレッドを作成します。このスレッドは、各再帰呼び出しの前にブール変数をチェックします。ブール変数をチェックする方が、メソッドを呼び出して時間を取得するよりも効率的です。親スレッドを限られた時間スリープさせます。ウェイクアップ後、ブールフラグを設定して子スレッドを停止します。

于 2011-05-05T16:23:03.913 に答える