私は現在、人工知能クラスの最終プロジェクトに取り組み始めています (コンピューター サイエンスの学士号の一環として)。このプロジェクトでは、人工知能の分野で興味深い問題を選択し、クラスから 1 つまたは複数のトピックを展開して、それを解決する必要があります。後で結果を説明するレポートを作成し、レポートと作成したコードの両方を提出します。
明らかに、私たちは古典的な問題の研究において最先端に匹敵することは期待されていませんが、珍しい問題を(かなりの程度まで)調べて解決することを期待されています(このアプローチを選択するほとんどの人は、単純なコンピューターを解決することを選択するか、 AI研究コミュニティによってまだ完全に解決されていないボードゲームなど)、またはより一般的な問題を斬新な方法で調査し、おそらく新しい興味深いヒューリスティックまたは既存のアルゴリズムへの変更を提案します. 後者の場合、最新の研究結果を上回ることは期待されておらず、新しい視点を提供するだけです。
私のパートナーと私がこのプロジェクトのために選んだテーマは倉庫番で、これは私たちを 2 番目のグループに分類します (これは死ぬほど研究されていません。なぜなら、共通のテスト セットの 3 分の 2 しか最高のソルバーで解決できないからです。この問題に対する最先端のソルバーは複雑すぎて、パートタイムの 2 週間のプロジェクトでそれらに近づこうとは思えません)。検索問題のアプローチを使用して倉庫番の問題を解決したいと考えています。
とにかく、倉庫番ソルバーの実装を開始する前に、実行を意図した検索ベースのソルバーの実装に使用するのに、私たちがよく知っている数少ない言語 (C、C++、Java、および Python) のどれがより適しているか疑問に思い始めました。非常に大きな検索空間での検索 (倉庫番には非常に深い検索ツリーがあり、解決するのに 300 回以上の移動が必要な問題と、非常に高い分岐係数 [一部の問題では 100 以上] があります。この高い分岐係数は、次の場合に達成されることに注意してください。プレイヤーの移動ではなく、ストーン\ボックスの移動のみが考慮されるため、各状態で、4 つの方向のいずれかに任意のストーンを移動できます)。
私がこの問題を検討し始めた主な理由は、人工知能に関する別のコース (製品設計への AI 技術の適用を扱う) で、可能なすべての部屋デザインの状態空間を検索して部屋を設計する自動ルーム デザイナーを作成したためです。 (指定された部屋のサイズと家具のセットを使用して) 最高スコアの状態を返します (いくつかのヒューリスティックによって測定されます)。このプログラムは Java で書かれており、実行のたびに数万の検索ノードを検索しただけでメモリ不足になりました。これが起こった主な理由は、そのプロジェクトに非常にオブジェクト指向のアプローチを選択したためだと思います。それは Java で書かれており、すべての検索状態はオブジェクトによって表され、そのようなすべての状態は、サーチャー オブジェクトによって到達されると、
さて、問題の一部はメモリ集約型アルゴリズム (A*) の使用と、それを実装するために選択した方法にあることがわかりましたが、Java の使用も問題の一部であったかどうか疑問に思っています。
1. 検索問題と検索アルゴリズムを実装する場合、一般的にどのプログラミング手法がより適しているか? (オブジェクト指向、関数型、またはその他)
2. 検索問題と検索アルゴリズムを実装する場合、Java、C、C++、または Python のどのプログラミング言語がより適していますか? (他の言語も可能ですが、その構文が前述の言語のいずれかに非常に類似している場合に限られます)
具体的には、これらの言語のどの機能とプロパティを使用して、非常に大きな検索空間をメモリ (および実行時間) 効率的な方法で検索することを目的とした問題解決ツールを実装できますか?