答えて
もう少し詳細があると思います。また、2つの全く別の問題を提起します。両方の制限を同時に適用したいのですか、それぞれを個別に行う方法をお探しですか?それはラフ用語で、言った:
制限時間:これは明確で開始する、
IO
を使用せずには不可能です。あなたのゲームツリーのトラバーサル機能が純粋であると仮定すると、おそらくコントロールフローを決定する一連のタイムトラッキングと絡み合わないほうがいいでしょう。ここで最も簡単なのは、トラバーサルに漸進的に良い結果をもたらすストリームを作成し、それぞれの「最良の結果」をMVar
などに置き、別のスレッドで実行することです。時間制限に達すると、スレッドを強制終了してMVar
から現在の値を取得します。深さ制限:これを行うための最も徹底的な方法は、幅優先検索を単純に行うことでしょうか?それが何らかの理由で実行可能でない場合、現在の深度を示すカウンタを保持し、最大に達したときには深く続かないという明らかな解決策よりも優れた解決策はないと私は考えています。これは、それぞれの再帰呼び出しが
local (subtract 1)
のようにラップされているReaderスタイルのモナドを使用して、コードが潜んでいる可能性があることに注意してください。
深度制限については、深度カウンタを保持する代わりに、補助プルーニング機能を使用しますか?例えば'take'はリストを指定された長さに枝刈りします。 – dave4420
@ dave4420:真実ですが、もちろんカウンターをどこか別の場所に移動しているだけです。構造体が遅延して生成される可能性がある場合、それは同じものになり、枝刈り関数はより良くなります。ここで言及したように、最初はそうするでしょうが、ここでの質問は限られたリソースによって動機づけられているので、まとめてツリー全体を一度にメモリに保存することを避けるために関数を組み合わせる必要があります。 –
基本パッケージのtimeout
機能を使用すると、一定期間後に計算を終了させることができます。最も最近の結果がMVar
に格納されるように、より深い結果のストリームにtimeout
をインターリーブすることは、ハスケルにおける検索問題の比較的一般的なトリックです。
ハ、私は、タイムアウトがすでに存在していることを知らずにこれを正確に行うことを提案しました。それはかなり明白なアプローチなので、おっと...は分かったはずです。 –
あなたのトラバーサルにレイジーライターモナドを使用して、改善の回答リストを生成することもできます。これで、いくつかの基準でリストから最初の「十分な」または「これまでの」結果を取得するだけで、問題をいくらか簡略化しました。その上に記載されているtimeout
トリック、またはあなたが適切と考える他のアプローチを使用することができます。
- 1. 巨大なバイナリサイズ
- 2. 巨大なビットマップ
- 3. 巨大なラグimagepng
- 4. 巨大なmain.csファイル
- 5. 巨大なmysqldumpインポート
- 6. 巨大なクエリは、
- 7. は、巨大な値
- 8. 巨大なピクチャ(16000x16000)
- 9. 「巨大なバグが」
- 10. 巨大なメモリピーク - CGContextDrawImage
- 11. 巨大なJson Parser
- 12. Bitmap.Save、巨大なメモリリーク
- 13. 巨大なテキストを読む
- 14. 透明な巨大なページ
- 15. 巨大なボクセルで奇妙なNavMeshを焼く
- 16. コンストラクタの巨大なスイッチステートメント
- 17. スクロールイメージの巨大な遅延
- 18. OneDriveの巨大なストリーミングアップロード
- 19. 巨大なガベージオブジェクトの取得
- 20. 巨大なCPUインパクトLinkedBlockingQueue
- 21. 巨大なAS 3.0エクスプレッションフレーム
- 22. 巨大なLinkedListのトラバーサル
- 23. 巨大なファイルから
- 24. UIPickerViewと巨大なコンタクトリスト?
- 25. リストボックス(テーブル)の巨大なデータ
- 26. 巨大なデータベースのキャッシング
- 27. 巨大な時間経過)
- 28. 角の巨大なスタックトレース
- 29. gzipの巨大なファイル(〜30G)
- 30. AngularJS - 巨大な指示文
A *、min-max、alpha-beta、および最近のGOAPなどのアルゴリズムを検討してください。 –
ヒース、私は現在ミニマックスアルゴリズムを使用しています。しかし、大きな木では時間がかかります。 –