2011-06-21 28 views
4

私はゲームツリー全体が歩くには大きすぎます。巨大なゲームツリーを歩く

時間制限または深さ制限に達するまでツリーを評価する関数を作成するにはどうすればよいですか?

+0

A *、min-max、alpha-beta、および最近のGOAPなどのアルゴリズムを検討してください。 –

+0

ヒース、私は現在ミニマックスアルゴリズムを使用しています。しかし、大きな木では時間がかかります。 –

答えて

7

もう少し詳細があると思います。また、2つの全く別の問題を提起します。両方の制限を同時に適用したいのですか、それぞれを個別に行う方法をお探しですか?それはラフ用語で、言った:

  • 制限時間:これは明確で開始する、IOを使用せずには不可能です。あなたのゲームツリーのトラバーサル機能が純粋であると仮定すると、おそらくコントロールフローを決定する一連のタイムトラッキングと絡み合わないほうがいいでしょう。ここで最も簡単なのは、トラバーサルに漸進的に良い結果をもたらすストリームを作成し、それぞれの「最良の結果」をMVarなどに置き、別のスレッドで実行することです。時間制限に達すると、スレッドを強制終了してMVarから現在の値を取得します。

  • 深さ制限:これを行うための最も徹底的な方法は、幅優先検索を単純に行うことでしょうか?それが何らかの理由で実行可能でない場合、現在の深度を示すカウンタを保持し、最大に達したときには深く続かないという明らかな解決策よりも優れた解決策はないと私は考えています。これは、それぞれの再帰呼び出しがlocal (subtract 1)のようにラップされているReaderスタイルのモナドを使用して、コードが潜んでいる可能性があることに注意してください。

+0

深度制限については、深度カウンタを保持する代わりに、補助プルーニング機能を使用しますか?例えば'take'はリストを指定された長さに枝刈りします。 – dave4420

+0

@ dave4420:真実ですが、もちろんカウンターをどこか別の場所に移動しているだけです。構造体が遅延して生成される可能性がある場合、それは同じものになり、枝刈り関数はより良くなります。ここで言及したように、最初はそうするでしょうが、ここでの質問は限られたリソースによって動機づけられているので、まとめてツリー全体を一度にメモリに保存することを避けるために関数を組み合わせる必要があります。 –

6

基本パッケージのtimeout機能を使用すると、一定期間後に計算を終了させることができます。最も最近の結果がMVarに格納されるように、より深い結果のストリームにtimeoutをインターリーブすることは、ハスケルにおける検索問題の比較的一般的なトリックです。

+0

ハ、私は、タイムアウトがすでに存在していることを知らずにこれを正確に行うことを提案しました。それはかなり明白なアプローチなので、おっと...は分かったはずです。 –

1

あなたのトラバーサルにレイジーライターモナドを使用して、改善の回答リストを生成することもできます。これで、いくつかの基準でリストから最初の「十分な」または「これまでの」結果を取得するだけで、問題をいくらか簡略化しました。その上に記載されているtimeoutトリック、またはあなたが適切と考える他のアプローチを使用することができます。

関連する問題