現在人気の2048ゲームでは、誰かが高確率(90%以上)でゲームに勝つことができるAIプログラムを実装しており、その作者はstackoverflowでAIアルゴリズムのフレームワークと実装のアイデアを簡単に紹介しました。ただし、この回答は主にヒューリスティック関数の選択に焦点を当てており、AI で使用されるコアアルゴリズムの詳細な説明は提供されていません。この記事は主に 2 つの部分に分かれています。最初の部分では、使用される基本的なアルゴリズム、つまりミニマックスとアルファベータ プルーニングを紹介し、2 番目の部分では著者の特定の実装を分析します。 基本アルゴリズム2048 は、本質的には情報対称型の 2 人用ゲーム モデルに抽象化できます (プレーヤーは 4 つの方向のいずれかに移動し、コンピューターが特定のスペースを 2 または 4 で埋めます)。ここで、「情報の対称性」とは、任意の瞬間に 2 人のプレイヤーが状況について完全に一貫した情報を持ち、移動戦略が次の状況についての推論のみに依存することを意味します。著者が使用するコア アルゴリズムは、チェス モデルで一般的に使用される、アルファベータ プルーニングを使用したミニマックスです。このアルゴリズムは、チェスなどの情報対称ゲーム AI でもよく使用されます。 ミニマックス次に、剪定なしのミニマックスを紹介します。まず、この記事では簡単な例を使用して、ミニマックス アルゴリズムの考え方と意思決定方法を説明します。 質問ここで、次のようなゲームを考えてみましょう。A、B、C の 3 つのプレートがあり、それぞれに 3 枚の紙幣が入っています。 A は 1、20、50 で配置され、B は 5、10、100 で配置され、C は 1、5、20 で配置されます。単位は「元」です。 A と B という 2 人の人物がいて、どちらも 3 枚の皿とそこに置かれた紙幣を自由に見ることができます。ゲームは 3 つのステップで構成されます。
A の目標は、できるだけ大きな額面の紙幣を手に入れることであり、B の目標は、できるだけ小さな額面の紙幣を手に入れることです。 次に、ミニマックスアルゴリズムを使用してこの問題を解決します。 基本的な考え方ゲーム関連の問題を解決するための自然な考え方は、パターンをツリーに整理することです。ツリーの各ノードはパターンを表し、親子関係は、親パターンから 1 ステップ進むだけで子パターンに到達できることを示します。 Minimax も例外ではありません。現在のパターンをルートとしてパターン ツリーを検索することで、次の選択肢を決定します。すべてのパターン ツリー検索アルゴリズムの中核は、各パターンの値の評価です。 Minimax アルゴリズムは、次の単純な考えに基づいてパターンの値を決定します。
上記の説明は少し抽象的ですので、以下の具体的な例を見てみましょう。 問題解決以下は、上記の例の問題のランドスケープ ツリーです。 問題のパターン例の数は非常に少ないため、完全なパターン ツリーを提供できることに注意してください。この場合、ミニマックス アルゴリズムのグローバル最適解を見つけることができます。実際には、パターンツリーは非常に大きく、コンピュータでさえ完全なツリーを提供することはできません。そのため、多くの場合、特定の深さまでしか検索できず、その後は局所的な最適解しか見つけることができません。 Aさんの視点から考えてみましょう。四角いノードは自分の番(A)であることを示し、三角形のノードは相手の番(B)であることを示します。 3 ラウンドのプレイ (こちら側 - 相手側 - こちら側) の後、最終ゲームが始まります。黄色の葉は、起こりうるすべての結果を表します。甲の立場からすると、最終的な利益は紙幣の額面金額で評価できるので、当然、甲が最終的に受け取る紙幣の額面金額を最終状況の価値として表すことができる。 次に、最後から 2 番目のノード層について考えます。これらのノードでは、選択する順番が回ってくるので、選択できる最大値パターンを導入する必要があります。これにより、各ノードの値は、その子ノードの最大値になります。 順番が回ってきたノードは最大ノードと呼ばれ、最大ノードの値は子ノードの最大値になります。 最後から 3 番目の層は、対戦相手が選択する番です。対戦相手は、私たちの価値を最小化する状況にするために全力を尽くすものと想定します。したがって、これらのノードの値は、子ノードの最小値によって決まります。順番が互いに変わるノードは、最小ノードと呼ばれます。 最後に、ルート ノードは最大ノードなので、その値はリーフ ノードの最大値によって決まります。最終的な完全な割り当てパターン ツリーは次のようになります。 ミニマックスアルゴリズムの手順を要約すると次のようになります。
上記の例では、ルート ノードの値は 20 です。つまり、相手が各ステップで完璧な決定を下した場合、上記のアルゴリズムに従って最終的に 20 元を獲得できます。これは、ミニマックス アルゴリズムに基づく私たちにとって最善の決定です。パターン変換パスは、下の図の赤いパスで示されています。 実際の問題におけるミニマックスについては、いくつかの点を再度強調します。
#p# アルファベータ剪定単純なミニマックス アルゴリズムの大きな問題は、計算の複雑さです。検索する必要があるノードの数は最大深度とともに指数関数的に増加し、アルゴリズムの効果は深度に関係することが多いため、アルゴリズムの有効性は大きく制限されます。 アルファベータプルーニングは、ミニマックスの補足および改良です。アルファベータプルーニングを使用した後は、最大深度 D 内のすべてのノードを構築して検索する必要がなくなります。構築プロセス中に、現在のパターンでより良いソリューションが見つからない場合は、このパターンとそれ以下の検索を停止します。これがプルーニングです。 アルファベータは、現時点でわかっている最良の選択肢を常に覚えておくというシンプルなアイデアに基づいています。現在のパターンから検索しても既知の最適ソリューションよりも優れたソリューションが見つからない場合は、このパターン ブランチの検索を停止 (剪定) し、親ノードに戻って検索を続行します。 アルファベータアルゴリズムは、ミニマックスのバリエーションとして考えることができます。基本的な方法は、ルートノードから始めて深さ優先方式でパターンツリーを構築することです。各ノードを構築するときに、このノードのアルファ値とベータ値が読み取られます。ここで、アルファは現在のノードを検索したときにわかっている最良の選択肢の下限を表し、ベータは、このノードから下方向に検索したときの最悪の結果の上限を表します。相手が状況を最悪の結果の 1 つに導くと想定されるため、ベータがアルファより小さい場合、ここからは最終的な結果がどうであろうと、その上限値が既知の最適解よりも低くなることを意味し、ここでより良い解を見つけることは不可能であるため、剪定が行われます。 以下でも上記の例を使用して、アルファベータプルーニングアルゴリズムの動作原理を紹介します。ルート ノードから始めて、Alpha-beta を使用する各ステップを詳しく説明します。
この時点で検索は完了し、このステップの戦略が得られました。つまり、ブランチ A を選択する必要があります。 通常のミニマックスでは 18 個のリーフ ノードが検索されるのに対し、ここでは 9 個のみが検索されることがわかります。アルファベータプルーニングを使用すると、同じ時間でミニマックスの検索深度を増やすことができ、より良い結果が得られます。そして、アルファベータの解は通常のミニマックスの解と一致します。 #p# 2048ゲームの実装ov3yが2048年に実装したAIを見てみましょう。プログラムのgithubはここにあり、メインプログラムはai.jsにあります。 モデリング上で述べたように、ミニマックスとアルファベータはどちらも情報対称性と交代ゲームに関するものです。ここで著者はゲームを次のように抽象化しています。
このように、2048 ゲームは対称情報を持つ 2 人用ゲームの問題としてモデル化されます。 パターン評価アルゴリズムの核心として、現状の価値をどのように評価するかが最も重要です。 2048 では、最終ゲームを除いて、中間パターンに対する非常に明白な価値評価指標がないため、パターンを評価するにはいくつかのヒューリスティック指標が必要です。スコアが高い「良い」パターンは簡単に勝利につながり、スコアが低い「悪い」パターンは簡単に失敗につながります。 著者らは、以下のようにいくつかのヒューリスティック指標を採用した。 単調性単調性とは、ブロックが左から右、上から下に増加または減少することを意味します。一般的に言えば、パターンは単調であればあるほど良いです。以下に、優れた単調なパターンの例を示します。
滑らかさ滑らかさは、各ブロックとそのすぐ隣のブロックの値の差を指し、差が小さいほど滑らかになります。たとえば、2 と 4 の隣は 2 と 128 の隣よりも滑らかです。一般的に、パターンが滑らかであればあるほど良いと考えられています。非常に滑らかな例を以下に示します。 スペース数これは簡単に理解できます。一般的に、空きスペースが少ないほど、プレイヤーにとって不利になるからです。したがって、スペースが多ければ多いほど良いと考えます。 隔離された空間の数この指標は、スペースが分離されている度合いを評価します。スペースが分散しているほど、パターンは悪くなります。 具体的には、2048-AI はパターンを評価する際に、これらのヒューリスティック指標に加重戦略を使用します。具体的なコードは次のとおりです。
興味のある学生は重みを調整して、どのような効果があるかを確認できます。 相手の選択を刈り込むこのプログラムでは、アルファベータ剪定に加えて、最小ノードで別のタイプの剪定が使用され、対戦相手の可能なすべての動きを検索する代わりに、最悪の状況を生み出す対戦相手の動きのみを考慮します (実際の 2048 でのコンピューターの選択はランダムです)。なぜなら、相手にとっての選択肢は「マス数×2」しかなく、すべて探索すると探索の深さが著しく制限されてしまうからです。 関連するプルーニング コードは次のとおりです。
検索の深さ2048-AI の実装では、検索の最大深度は制限されませんが、各「思考」の時間は制限されます。ここでタイムアウトを設定します。デフォルトは 100 ミリ秒です。この間、検索は 1 から開始され、到達可能な深さまで到達します。関連コード:
したがって、このアルゴリズムの効果は、実際には JavaScript エンジンを実行するマシンのパフォーマンスに依存します。もちろん、タイムアウト期間を長くするとより良い結果が得られますが、各ステップの速度は遅くなります。 アルゴリズムの改善現在、この実装の作成者は、2048 を正常に合成できる確率は 90% を超えていると主張していますが、4096 や 8192 を合成できる確率は高くありません。著者は、github プロジェクトの REAMDE で、次のような最適化の提案も行っています。
参考文献
オリジナルリンク: http://blog.codinglabs.org/articles/2048-ai-analysis.html 【編集者のおすすめ】
|
<<: [トイレに座ってアルゴリズムを読む] アルゴリズム 8: 賢い隣接リスト (配列の実装)
>>: JavaScript によるデータ構造とアルゴリズムの実装と応用: Stack/Recursion/Hanno
MITのエンジニアたちは、あらゆる表面を音源に変えることができる紙のように薄いスピーカーを開発した...
はじめに: AI 開発についてさらに詳しく知りたいですか? この記事では、AIプログラムを作成する際...
企業は現在、AIGC の可能性を活かすためにデータ、人材、プロセスを準備することが今後の課題であると...
7月3日、北京で百度AI開発者会議「Baidu Create2019」が開催された。この会議は「産業...
[[251814]]フォード、トヨタ、グーグル、アップルなどの大企業が自動運転車に投資していることは...
教育部が2019年3月に発表した新規登録学部専攻を例にとると、最も人気のある専攻は人工知能です。上海...
[[190049]]この記事は、4月27日にBig Data Talk WeChatコミュニティで...
今後10年間で世界を変える人工知能の4つの主要な発展トレンドの分析61歳のビル・ゲイツ氏は大学卒業生...
[[312069]] 1月2日のZhidongxiによると、Alibaba Damo Academy...
2021年10月20日、国家インテリジェントコネクテッドビークルイノベーションセンター(以下、「イノ...
プログラミング言語は流行ったり廃れたりするものですが、Java と C/C++ は変わりません。 [...