3

五目並べを再生するCプログラムを作成しています。ミニマックス検索を使用して、最適な動きを決定します。ただし、最適な動きを検索できるのは10秒間のみです。検索機能が10秒の検索に費やした時間を判断する方法。例またはドキュメントへのリンクを提供していただければ幸いです。

4

5 に答える 5

5
#include <time.h>
time_t start_time = time(NULL);
while (((int)(time(NULL) - start_time)) < 10) {
  //search
}

つまり、私の頭に浮かぶのは。ただし、テストされていません。

于 2010-10-16T21:07:13.817 に答える
3

あなたの問題は時間関数そのものではないと思います。再帰的なMinmaxアルゴリズムについておっしゃいました。ミニマックスアルゴリズムの停止基準は、指定された検索深度です。時間ベースの停止基準が必要な場合は、反復深化フレームワークを使用してアルゴリズムを拡張し、時間が経過した場合は再帰的なMinmax関数がセンチネル値を返すようにする必要があります。

于 2010-10-16T21:26:53.537 に答える
3

唯一の時間チェックは仕事をしません!ミニマックスは再帰的な深さ優先探索アルゴリズムであり、明らかにはるかに優れた動きがある場合は30秒かけて非常に間違った動きを調べ、最後の1秒間で良い動きを見つけることができます。

あなたは短時間でかなり良い動きを見つけるいくつかのアルゴリズムを使用する必要があります、そしてそれから、より多くの時間が利用可能になると、それは解決策を改善します!幅優先探索戦略に合わせて、ミニマックス(またはアルファベータ)アルゴリズムを変更する必要があります。そうすれば、いつでもかなり良い動きでカットすることができます。

于 2011-08-09T11:31:43.367 に答える
1

あなたはalarm信号を使うことができます。シグナルハンドラにと呼ばれるグローバルフラグを設定させokWereDoneNow、検索を開始、確認、リセットするだけです。

タイマー関数に対するこれの利点は、検索の反復ごとに1回の比較のみが必要なことです。信号の作業は費用がかかりますが、実行は1回だけです。集中的な、おそらくCPUにバインドされた繰り返しの操作では、これは大きな利点になる可能性があります。しかし、私の言葉を信じないでください-テストしてください!

于 2010-10-16T21:09:12.110 に答える
0

time.hでtime()関数を使用できます。通常、戻り値は秒単位です。そうでない場合でも、同じヘッダーからdifftime()を使用するだけで済みます。

これは、必要な機能に関する優れたリソースです。

上記のリンクはC++リファレンスサイトからのものですが、そのヘッダーと例はすべてCコードです。

于 2010-10-16T21:08:46.527 に答える