27

私の友人は、NetHack ボット (ローグライク ゲームをプレイするボット: NetHack) の構築を始めています。似たようなゲームである Angband 用の非常にうまく機能するボットがありますが、部分的に機能するのは、町に戻るのが簡単で、アイテムを獲得するために常に低レベルをスカムできるからです。

NetHack では、この問題ははるかに困難です。なぜなら、ゲームは大胆な実験に報いるものであり、基本的に 1,000 のエッジ ケースとして構築されているからです。

最近私は、スパムが作成されるのとほぼ同じ方法で、ある種の単純なベイジアン分析を使用することを提案しました。

基本的に、ボットは最初に、見つけたすべてのアイテムまたはクリーチャーで可能なすべてのアクションを試行し、その情報を保存することで、コーパスを構築します。時間が経つにつれて、適度にプレイ可能なモデルを生成できるようになります。

良いスタートとは何かという正しい方向性を示してくれる人はいますか? 私は間違ったツリーを吠えていますか、それともベイジアン分析の考え方を誤解していますか?

編集:私の友人は、python バインディングを可能にする彼の NetHack パッチの github リポジトリを作成しました。まだまだ原始的な状態ですが、興味のある方はどうぞ…

4

5 に答える 5

6

ベイジアン分析にはさらに多くのことが含まれますが、スパム フィルターでよく知られている単純ベイズ アルゴリズムは、すべての変数が本質的に互いに独立しているという 1 つの非常に基本的な仮定に基づいています。たとえば、スパム フィルタリングでは、通常、各単語が変数として扱われるため、電子メールに「バイアグラ」という単語が含まれている場合、その知識は、「薬」(または「フー」または「スパム」など)。興味深いことに、自然言語に関して言えば、この仮定は明らかに間違っていますが、それでも妥当な結果が得られます。

独立性の仮定を回避する方法の 1 つは、技術的に物事を組み合わせた変数を定義することです (「バイアグラを購入する」というトークンを検索するなど)。探す特定のケースを知っている場合はこれでうまくいきますが、一般的に、ゲーム環境では何も覚えていないことを意味します。そのため、移動したり、アクションを実行したりする必要があるたびに、これまでに行ったことから完全に独立しています。最も単純なゲームでさえ、これはゲームを学ぶ上で非常に非効率的な方法だと思います。

代わりに q-learning の使用を検討することをお勧めします。あなたが見つける例のほとんどは、とにかく単純なゲームです (壁、トラップ、モンスターなどを避けながらマップをナビゲートすることを学ぶなど)。強化学習は、オンラインの教師なし学習の一種であり、ゲーム (またはロボット) などの環境と対話するエージェントとしてモデル化できる状況で非常にうまく機能します。これは、環境内の各状態で最適なアクションが何であるかを把握しようとします (各状態には、「どこにいるのか」だけでなく、必要な数の変数を含めることができます)。秘訣は、ボットが適切な決定を下すのに十分なだけの状態を維持することです。前のアクションの可能な組み合わせごとに、状態の「スペース」に明確なポイントがありません。

より具体的に言えば、チェス ボットを構築する場合、チェスの動きのすべての可能な組み合わせのセットが非常に急速に成長するため、以前のすべての動きに基づいて決定を行う決定ポリシーを作成しようとすると、おそらく問題が発生するでしょう。 . すべてのピースがボード上のどこにあるかの単純なモデルでさえ、依然として非常に大きな状態空間であるため、追跡するものを単純化する方法を見つける必要があります。ただし、ボットが左側の用語を何度も何度も壁にしようとし続けないように、いくつかの状態を追跡できることに注意してください。

ウィキペディアの記事はかなり専門用語が多いですが、このチュートリアルは概念を実際の例に翻訳するのにはるかに優れています.

1 つの落とし穴は、提供する報酬を正の「強化」として定義できるようにする必要があることです。つまり、ボットが到達しようとしている状態を定義できる必要があります。そうしないと、ボットは永遠に続きます。

于 2010-01-26T07:38:02.850 に答える
4

前例があります。巨大な rog-o-matic プログラムは悪党のふりをすることに成功し、Yendor のお守りを持って数回戻ってきました。残念ながら、rogue はソースではなくバイナリでしかリリースされなかったため (MicroVAX で 4.3BSD システムをセットアップできない限り) 死んでしまい、rog-o-matic はどのクローンも再生できなくなりました。エミュレーションに十分に近いものではないため、ハングするだけです。

しかし、log-o-matic は、それが達成したことだけでなく、コードの読みやすさとそのアルゴリズムの理解可能な知性のために、私のお気に入りのプログラムだと思います。それは「遺伝的継承」を使用しました。新しいプレーヤーは、以前の成功したプレーヤーのペアから好みの組み合わせを継承し、ランダムなオフセットを加えてから、マシンと対戦しました。より成功した選好は遺伝子プールで上に移動し、あまり成功しなかった選好は下に移動します。

最近はソースを見つけるのが難しいかもしれませんが、「ロゴマティック」を検索すると、パスが表示されます。

于 2010-01-22T13:37:10.663 に答える
4

ほとんどの NetHack は非常に文脈に依存しているため、ベイジアン分析でうまくいくとは思えません。常に悪い考えであるアクションはほとんどありません。ほとんどの人は、「正しい」状況では命の恩人でもあります (極端な例は、コカトリスを食べることです。それは悪いことです。飢えていて、現在、石に耐性のあるモンスターに変化している場合を除きます。その場合、コカトリスを食べることが正しいことです)。 )。ゲームに勝つには、これらの「ほとんど悪い」アクションのいくつかが必要です (たとえば、レベル 1 の階段を上ったり、わざとトラップに落ちてゲヘノムに到達したりします)。

あなたが試すことができるのは、「メタ」レベルでそれをやろうとすることです。さまざまな「基本動作」の中からランダムに選択するようにボットを設計します。次に、これらのボットがどのように機能するかを測定してみてください。次に、生存を促進すると思われる行動の組み合わせを抽出します。ベイジアン分析は、ゲームの幅広いコーパスとその「成功レベル」の中でそれを行うことができます. たとえば、「短剣を拾う」と「モンスターとの戦闘を避ける」という行動がある場合、分析により、これら 2 つの行動がうまく適合することが示されると思います。そのようなミサイルを収集せずにモンスターにミサイルを投げると、おそらくより悪い結果になります。

これは、学習ゲーマーが rec.games.roguelike.nethack でよく求めるものを模倣しています。ほとんどの質問は次のようなものです。または「ダンジョンの奥深くに行く前に、私のキャラクターはどのレベルになるべきですか?」. これらの質問に対する答えは、プレーヤーが他に何をしているかに大きく依存し、絶対的な答えはありません。

ここでの難点は、生存時の成功をどのように測定するかです。死ぬまでの時間を単純に最大化しようとすると、最初のレベルを離れることのないボットを好むことになります。それらは長生きするかもしれませんが、ゲームに勝つことは決してありません. キャラクターが死ぬまでの深さで成功を測る場合、最高のボットは、熱狂的に掘り進む考古学者 (つるはしから始める) になります。

于 2010-01-28T16:30:54.283 に答える
3

どうやら、かなりの数の Nethack ボットが存在するようです。このリストをチェックしてください:

于 2010-02-25T22:06:24.443 に答える
1

Nethackでは、未知のアクションは通常ブール効果を持ちます-あなたが得るか失うかのどちらかです。ベイジアンネットワークは「ファジー論理」値に基づいています。アクションは、特定の確率でゲインを与える可能性があります。したがって、ベイジアンネットワークは必要ありません。「発見された効果」のリストと、それらが良いか悪いかを確認するだけです。

コカトリスをもう一度食べる必要はありませんか?

全体として、ボットにスターターとしてどの程度の「知識」を与えたいかによって異なります。あなたは彼にすべてを「難しい方法」で学んでもらいたいですか、それとも彼が詰められるまで彼にネタバレを与えますか?

于 2010-01-22T01:29:30.187 に答える