A *、BFS、DFSなどの他に、パックマンで一般的に使用されている他の優れた経路探索アルゴリズム/ヒューリスティックは何ですか?私が言及したものは、パックマンが見つけられる果物が複数ある場合には機能しないと思います。
可能な限り少ない歩数で迷路を完成させるためにPacManが使用できるいくつかの優れた経路探索アルゴリズムが必要です。ガイドラインを探してみましたが、今のところうまくいきません。マンハッタン距離のA *はどこでも言及されていますが、取得できるフルーツが1つ(または2つ、またはおそらく数個?)の迷路でのみ機能します。
ところで、周りに幽霊がいないと仮定して、物事をシンプルに保つために。
最短パスを探しているとコメントしている。この問題は、平面グラフの [〜#〜] tsp [〜#〜] のバリエーションであり、したがって NP-Hard です。
問題を解決できるが 許容 ではない_A*
_の可能なヒューリスティック関数:[したがって、見つかったパスが最適であることが保証されていません]:
すべての果物からエージェントまでのマンハッタン距離の合計。
_#fruits
_の許容ヒューリスティックを使用することもできますが、これには時間がかかります。
あなたが最適を探しているなら、まあ-それは難しいです。 果物のすべての順列を試すで、移動に必要な合計距離を確認できます。このソリューションは果物の数の階乗であり、20より大きい場合-素朴なブルートフォースを使用する場合-時間がかかりすぎます。 問題をTSPに削減することで、どういうわけかそれを改善し、ダイナミックプログラミングソリューションを使用することもできます。
許容できないヒューリスティックソリューションを改善して any-time algorithm を提供することもできます。
減少するヒューリスティック関数を使用して_A*
_を繰り返し実行:h(v) = h'(v) / m
、ここで_h'
_はA *の最後の反復でのヒューリスティック関数、および_m > 1
_。これにより、ある時点で、ヒューリスティック関数h
が許容されることが保証され、見つかったソリューションが最適になります。ただし、各反復には、前の反復よりもはるかに長い時間が予想されます[指数関数的に長くなります。]
迷路の外観を知っているなら私のために働いたヒューリスティック:
x
と呼びましょう。y
と呼びましょう。次に、答えは単に_x + y
_です。
実際の距離はマンハッタン距離ではなく、迷路内のreal
距離です。迷路の外観がわかっている(すべての壁を知っているなど)ので、計算できます(必要に応じて事前計算もできます)。壁は変化しないため、この情報(迷路内のいくつかの2点間の実際の距離)は静的です。
この_x + y
_式の解釈は次のようになります。
x
-どちらにしても、少なくとも最後にこの距離を移動する必要がありますy
-2つの最も遠い果物のいくつかにいる間、戻る必要がないように、それに近い食べ物を収集することをお勧めしますこれをBerkeley AIクラスプロジェクトの一部として解決している場合、2点間の実際の距離の計算には、すでに実装されているbfsの実装を使用している関数mazeDistance(pos1, pos2, gameState)
を使用できます。また、このヒューリスティックは、少なくともテストケースでは許容および一貫性です。ちなみに、このヒューリスティックを使用して、trickySearch
迷路で376ノードを拡張することができました。
マンハッタンの距離を使用して、最も近いおおよその食べ物を見つけましたが、私のヒューリスティックでは、自分の位置から最も近い食べ物までの実際の距離を使用しました。これに、自分の位置または最も近いフードポイントと行または列を共有しないすべてのフードポイントに1を追加しました。
私の位置または最も近い食品の位置と行または列を共有する食品ポイントは、私の位置から最も近い食品に移動するときに食べられ、Iveはすでに2行目に述べた実際の距離でこれのコストをカウントしました。
つまり、簡単に言うと:heuristic = mazeDistance(私の位置、最も近い推定食品)+除外されたポイント
これは許容され、一貫していた。これにより、5500ノードを拡張し、FoodHeuristicで5/4を獲得しました。 https://github.com/sukritiverma1996/Intro-to-AI-course
私はこれが古いことを知っていますが、おそらくこの問題を解決しようとしている他の多くの人々がいるでしょう(バークレーの無料AIクラスの一部です)。力ずくの提案がたくさんあるので、かなり近づくかなり単純なものに貢献します。 許可されています:
編集:これが許容できるヒューリスティックであるという以前の主張は誤りです。ごめんなさい!
適度なサイズの迷路で、少数の果物を強引に倒すことができます。
n
フルーツ間のすべてのペアワイズ距離を取得するには、A *のO(n^2)
実行が必要です。)展開するノードの数を減らして実行時間を気にしない場合は、最小スパニングツリーを使用することをお勧めします。エッジのコストはmazeDistanceであり、priorityQueueを使用する必要があります。訪問したノードにノードを追加するたびに、すべてのフードノードが訪問先ノードに追加されるまで、追加されたばかりのノードに最も近いノード、次に訪問先ノードに追加します。 AIコースの問題を処理している場合、展開されたノードは非常に低くなります。
すべてのドット問題を食べるために、私はヒューリスティック値を、すべてのフードポイントから現在のパックマンの位置までのすべてのマンハッタン距離の最大値として使用しました。パックマンがゴールポイントに到達するには、少なくともこの距離を移動する必要があるため、これは許容されます。単一の点からのマンハッタン距離ヒューリスティックは常に一定であるため、これも一定です。トリッキーな検索問題で9551個の検索ノードを拡張しました。
コーナーの食品問題の場合、パックマンからの最初の最も近い食品の合計としてヒューリスティックを使用します。パックマンをこの食品の位置に移動し、前の手順を繰り返して、すべての食品ペレットが食べられるようにします。これは貪欲なアプローチであり、許容可能で一貫している必要はありませんが、これは特別なシナリオであり、すべてのケースを考慮することにより、このヒューリスティックが許容可能で一貫していることを示すことができます。中程度の検索問題で485ノードを拡張しました。
これがBerkeley AIプロジェクト用であると仮定します。
一般的なケースでは、すべてのドットを訪れる最短経路を見つけることはNP困難です。ただし、それが実際に難しいことを意味するものではありません。その理由は 固定パラメータの扱いやすいアルゴリズム があり、提供されるパックマン迷路は、解決が容易なグラフの場合に該当するためです。
特に、特定のブランチ幅の場合、動的プログラミングの単純なアプリケーションによって、グラフのサイズの時間多項式(ただし、グラフのブランチ幅の指数関数)で最短パスを見つけることができます。任意のグラフは大きな枝幅を持つことができるので、これはNP硬度に違反しませんが、小さい枝幅を持つグラフのみを対象とする場合に問題を効率的に解決できることを意味します。提供されるパックマン迷路は接続性が悪いため、枝の幅が狭くなっています。
詳細は この投稿を参照 。
特定のゲーム状態で、md(x)
がパックマンからノードx
までのマンハッタン距離であるとすると、minmd(X)
をxmin
のすべてのx
に対してX
s.t md(xmin)<=md(x)
を返す関数と見なします。 X
をパックマンが食べ残した食べ物のセットにしましょう。
考えるよりも-壁のないパックマンの世界のリラックスを考えた場合、pacmanはmd(xmin)
未満を歩くことができず、xmin=minmd(X)
は果物を食べるために(そしてパックマンがそれを食べるためにxminに移動した後)彼はmd(xmin1)
以上xmin1=minmd(X-{xmin})
以上に行く必要がある別の果物を食べたいです。 pacmanがxminからxmin1までxmin2まで歩いたmdsの合計を返します。これはリラクゼーションの最適な解決策なので、素晴らしい許容とcosistentヒューリスティック関数!
考慮すべきもう1つの点は、壁を考慮すれば、より優れたヒューリスティックを得ることができるということです。これは非常に難しい問題なので、あまり取り上げませんでしたが、パックマンを次の最適なフルーツで長方形にバインドすると、境界の長方形を出て、そのような壁ごとにそうしている間に少なくとも2つのアクションを払って再び境界線の長方形を出て再び入る必要があるため、それらの間に完全な垂直または水平の壁線がある場合、彼は少なくとも2つのアクションを支払う必要があります。これはさらに調査することができ、この四角形により多くの特別な機能を見つけることもできます。
編集:
このヒューリスティックは認められません。@ Alon Gouldmanに見ていただきありがとうございます。