次の最適な方向に向けたパックマンキャラクターAIの提案


9

まず、これはPacManのAIであり、ゴーストではありません

アイコンの周りでPacManを再生するAndroidライブ壁紙を書いています。画面タッチによるユーザーの提案をサポートしていますが、ゲームの大部分はAIによって行われます。私はゲームのすべてのプログラミングを99%完了していますが、PacMan自身のAIはまだ非常に弱いです。PacManの次の移動方向を決定するための優れたAIの開発に協力を求めています。

私の最初の計画はこれでした:

  1. 各方向のスコアカウンターをゼロの値で初期化します。
  2. 現在の位置から開始し、BFSを使用して、キューに追加することにより、可能な4つの初期方向に外側に移動します。
  3. キューから要素をポップし、それがまだ「見られていない」ことを確認し、それが有効なボード位置であることを確認し、対応する初期方向スコアに、以下に基づいて現在のセルの値を追加します。

    1. ドットあり:プラス10
    2. パワーアップ:プラス50
    3. 果物を持っている:プラスの果物の価値(レベルによって異なります)
    4. おびえた幽霊がいる:プラス200
    5. 幽霊がパックマンに向かっている:200を引く
    6. パックマンから逃げる幽霊がいる:何もしない
    7. ゴーストが垂直に移動している:50を引く
    8. セルへのステップ数に基づいて、セルの値にパーセンテージを掛けます。最初の方向からのステップが多いほど、セルの値はゼロに近づきます。

    現在のセルから3つの可能な方向をエンキューします。

  4. キューが空になったら、4つの可能な初期方向のそれぞれについて最高のスコアを見つけ、それを選択します。

紙の上ではそれは良さそうに聞こえましたが、幽霊はパックマンを非常に急速に取り囲み、1つが彼に到達するまで、彼は同じ2つまたは3つの細胞で前後にぴくぴく動いています。ゴーストプレゼンスの値を調整しても、効果はありません。私の最も近いドットBFSは、ゲームが終了する前に少なくともレベル2または3に到達できます。

適切なAIを開発するためのコード、考え、リソースへのリンクを探しています。できれば前の2つです。これを今週末に市場でリリースしたいので、ちょっと急いでいます。どんな助けでも大歓迎です。


参考までに、これは当初StackOverflowに投稿されました


これの多くはゴーストAIに依存します。元のゲームとまったく同じAIアルゴリズムを使用している場合は、パックマンにすでに発見されている多くのパターンの1つを実行させるだけでよく、ルックアップテーブル以外にAIは必要ありません。ゴーストがパックマンですぐに近づいている場合、問題はパックマンAIが弱すぎるのではなく、ゴーストAIが良すぎることにあると考えましたか?
イアンシュライバー2010

@IanゴーストAIはゲームとまったく同じですが、ボードレイアウトは同じではありません。これは、アイコンレイアウト(4x4など)に隣接する単純なグリッドレイアウトです。現在のPacManは、それ自体とドットの間にゴーストがない、最も近いドットです。間にドットがある限り、ゴーストに直接向かいます。おそらく、最も近いドットよりも数歩先を見て、それが良い方向であるかどうかを判断する必要があるだけでしょう。この方向探索ロジック全体は、すべてのセルの移動で発生する必要があるため、比較的単純かつ高速でなければなりません。
Jake Wharton、

コラボレーションの拡散を調べてください。tiが何らかの形であなたを助けるかもしれません。
user712092 2011

回答:


3

タンデムの山登りアルゴリズムの考え方は良いです。もう1つは、A *のバリエーションで、次のNターンで最高スコアを取得する方法を確認するためにいくらか変更されます。

与えるスコア値は「移動にかかるコスト」と考えることができます。つまり、基本的には正しい方向に進んでいますが、必要な結果が得られるまで値を微調整する必要があります。

一般的な(PacMan固有ではない)用語では、適切な値を割り当てる必要があります

  • 他の男に負傷。
  • 別の男を殺した。
  • 他の目標を達成した(殺害以外)
  • 負傷した。
  • 殺された。

次に、将来のNターンの最大スコアにつながる動きを探します。また、X(たとえば、死亡のコスト)を下回るスコアにつながる動きは、Nが未来に変わるのを避けたい場合もあります。

すべての可能な動きをスコアリングしたら、それが将来どの程度うまくいくかについてのボーナスを追加し、それが将来どれだけ悪い結果になるかを差し引いて、アレイを並べ替えて最高の動きをするだけです。

どうなるか教えてください!



0

検索を実行します。

  • ノード/状態:パックマンの場所、ゴーストの場所、ペレットの場所、合計スコア、合計寿命。
  • 遷移:パックマンは上、下、左、または右に移動します。パックマンが壁に移動し、場所を完全に変更した場合(いくつかの非常に興味深いストール戦略につながる可能性があります)。パックマンが幽霊に当たった場合、命を取り除き、彼と幽霊を原点に移動します。
  • コスト:パックマンがペレット1に移動した場合、空のスペース2に移動した場合。
    コストは自明ではないため、少しトリッキーです。私が説明したコスト関数は、パックマンがレベルを完了するのを促します。これは可能な戦略を排除し、ボーナスフルーツが現れるのを待っているだけです。しかし、私はAIパックマンがより低いスコアを生成しても、迷路を終わらせたいと思います。
  • 目標:最大スコアに達しました。つまり、すべてのペレット、果物、パワーペレットが食べられます。

A *またはUCSは、目標を探すときに最適です。状態/遷移/目標を説明した方法は、AIが死を回避したり果物を求めたりすることを特に考慮する必要がないパックマンの素晴らしい散歩道を見つけるでしょう。それはそれ自体でそれを行います。ゲームは完全に確定的であるため、パックマンの開始位置から「検索」して、終了までの最適な歩行経路(すべてのペレットが消費される)を事前計算として見つけ、AIパックマンがその経路を歩くだけで、オンザフライAIはできません。このアプローチの主な欠点は、CPU時間とメモリ消費量で簡単に手に負えなくなる可能性があることです。

完全な検索を実行するためにCPUとメモリを使用する代わりに、その場で部分検索を実行できます。

UCS / A *は引き続き使用できますが、Nノードの検査が完了したら検索を停止し、これまでに見つかった最適なパスを使用します。このアプローチはN、速度と精度のバランスを見つけるために調整できるという点で優れています。

私が特に気に入っているもう1つの方法は、モンテカルロツリー検索です。この方法では、パックマンにN動きのランダムウォークを実行させます。各ランダムウォークの後、彼の最初の動きと最終スコアを記録します。Mランダムウォークを実行します(または、時間切れになるまで、またはこれまで何でもします)。ランダムウォークの平均が最も良い最初の動きを選びます。

これらの部分検索には重大な欠点があります。UCSで検索して、パックマンが最初のNノードでまったくスコアを付けない場合、彼は行き詰まり、すべての動きが同じように悪いです。
パックマンを食べていないペレットに近づけるようにヒューリスティックが注意を払っている限り、A *にはこの問題はありません。
ランダムウォークが食べられていないペレットに向かって偏っていて、スコアリングの前にランダムウォークが停止しない場合(つまり、パックマンのスコアが0の場合、ランダムウォークは続行します)、MCTSはこの問題を回避できる可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.