りサギずオオカミのゲヌムの䟋のミニマックス

画像 この蚘事の目的は、コンピュヌタヌゲヌム䞻に拮抗的 の「人工知胜」を構築および最適化するための基本的な方法の本質を明らかにするこずです。 うさぎずオオカミのゲヌムの䟋を䜿甚しお、Minimaxアルゎリズムずその最適化アルゎリズムAlpha Beta Cutoffを怜蚎したす。 テキストの説明に加えお、蚘事にはむラスト、衚、゜ヌスコヌド、既成のオヌプン゜ヌスのクロスプラットフォヌムゲヌムが含たれおおり、そこでむンテリゞェント゚ヌゞェントず競うこずができたす。

ゲヌム「りサギずオオカミ」


画像

チェス盀には、䞊郚に4匹のオオカミ黒いセルがあり、䞋郚に1匹のノりサギ黒いセルの1぀がありたす。 りサギが最初に歩きたす。 オオカミは䞋にしか行けず、りサギはどの方向にでも行けたすが、斜めに歩くこずができるのは1マスだけです。 ノりサギが䞊郚のセルの1぀に到達するず勝利し、オオカミはりサギを囲んだり抌したりした堎合りサギに行く堎所がない堎合に勝利したす。

読み続ける前に、 挔奏するこずをお勧めしたす。理解しやすいでしょう。

発芋的

実甚的な工孊甚語では、ミニマックス法は発芋的手法に基づいおおり、アルゎリズムの本質に移る前に怜蚎したす。

ミニマックスのコンテキストでは、あらゆる州のプレむダヌの勝利の確率を評䟡するために、ヒュヌリスティックが必芁です。 タスクはヒュヌリスティック評䟡関数を構築するこずです 。これは、遞択されたメトリックで、プレヌダヌがこの状態になった方法に䟝存するこずなく、特定の数字の配列で特定のプレヌダヌが勝぀確率の掚定倀を迅速か぀正確に指定できるようにするこずです。 私の䟋では、評䟡関数は0〜254の倀を返したす。0はうさぎの勝利、254はオオカミの勝利、䞭間倀は䞊蚘の2぀の掚定倀の補間です。 確率の掚定は確率ではなく、制限する必芁はありたせん、線圢、連続。

評䟡関数の䟋1 。 ノりサギが高ければ高いほど、勝぀チャンスが増えたす。 このようなヒュヌリスティックは、速床の芳点から効果的ですがO1、アルゎリズム的には完党に䞍適切です。 ノりサギの「高さ」は勝利の確率ず盞関したすが、ノりサギの䞻な目暙である「勝぀」を歪めたす。 この評䟡関数は、ノりサギに䞊に移動するように䌝えたすが、蚈算の深さが浅い堎合、障害に関係なくノりサギが䞊に移動し、トラップに陥りたす。

評䟡関数の䟋2 。 うさぎは勝぀可胜性が高く、凍ったオオカミで勝぀ための動きをする必芁が少なくなりたす。 これは、耇雑さOnのより扱いにくいアルゎリズムです。ここで、nはセルの数です。 移動数の蚈算は、幅優先怜玢になりたす。
画像

ご泚意 この蚘事で提䟛される゜ヌスは、読者がメむンアプリケヌションのコンテキスト倖でその本質を理解できるように倉曎されおいたす。 蚘事の最埌で信頌できる゜ヌスを探しおください。

幅優先怜玢を実行するコヌド、たたはむしろりサギから「距離」に等しい倀でマップを埋めるコヌド

this->queue.enqueue(this->rabbitPosition); while (!this->queue.empty()) { QPoint pos = this->queue.dequeue(); for (int i = 0; i < 4; i++) if (canMove(pos + this->possibleMoves[i])) { QPoint n = pos + this->possibleMoves[i]; this->map[ny()][nx()] = this->map[pos.y()][pos.x()] + 1; this->queue.enqueue(n); } }
      
      




評䟡関数の結果は、最も近い䞊䜍セルたでの「距離」に等しい倀、たたは到達できない堎合は254でなければなりたせん。 以䞋で説明する欠点にもかかわらず、ゲヌムで䜿甚されるのはこの経隓則です。

゜ヌスを芋お理解する人のために-泚意 アプリケヌションアヌキテクチャは、コヌドの他の郚分に圱響を䞎えるこずなく評䟡関数をやり盎すこずができるように蚭蚈されおいたす。 ただし、以前に遞択したメトリックを䜿甚する必芁がありたす。そうしないず、アルゎリズムは評䟡関数の指瀺を理解したせん。

ミニマックス

いく぀かの抂念ず衚蚘法を玹介したす。


fViはg Viずは異なり、 gViはViに関する情報のみを䜿甚し、 fViはVikおよびその他の状態も再垰的に䜿甚したす。

この方法は、 Vi状態からの移動を遞択する問題を解決するように蚭蚈されおいたす。 確率掚定が歩行しおいるプレヌダヌにずっお最も有益である動きを遞択するこずは論理的です。 メトリックでは、オオカミの堎合-最倧評䟡、ノりサギの堎合-最小。 そしお、評䟡は次のように考慮されたす。


この方法は垞識に基づいおいたす。 私たちは自分の勝利Pの評䟡を最倧化するように歩きたすが、少なくずも䜕かを蚈算するためには、敵の歩き方を知る必芁があり、敵は圌の勝利の評䟡を最倧化するように歩きたすP評䟡を最小化するため。 蚀い換えれば、敵がどのように歩くかを知っおおり、この方法で確率掚定を構築できたす。 敵が同じ評䟡関数を持っおいる堎合、アルゎリズムが最適であり、最適に動䜜するこずを瀺す時です。 この堎合、むンテリゞェンスは誀算の深さず評䟡関数の品質に䟝存したす。

䟋を挙げたしょう。
画像

この䟋では、プレヌダヌは野りサギで、コンピュヌタヌはオオカミで遊んでいたす。 野りサギが歩き回った埌、コンピュヌタヌはミニマックスアルゎリズムを実行したす。この䟋では、深さ1でアルゎリズムは䜕をしたすか そしお誰が知っおいたすか アルゎリズムはオオカミのすべおの可胜な動きを通過し、圌らのために勝利の確率の掚定倀を受け取りたす。 前述のように、この評䟡は、同じミニマックスアルゎリズムの起動で構成されたすが、他の状態では、すでに別のプレヌダヌの動きがあり、既に最倧化ではなく最小化が行われおいたす。 これはすでに2番目のレベルで、指定された深さ1の最埌のレベルになりたす。それ以降、ミニマックスアルゎリズムは開始されたせんが、ヒュヌリスティック評䟡関数を返したす。

この䟋は、䞋から芋るず理解しやすくなりたす。 2番目のレベルでは、ヒュヌリスティック掚定倀を取埗する状態がありたす数倀で蚘述されおいたす。 2番目のレベルでは、最初のレベルがそれぞれ等玚を取埗し、次のレベルでチェックされるものから最小倀を遞択したす。 たあ、れロレベルは、最初のレベルによっお圌に䞎えられたものから、最倧評䟡を遞択したす。

すべおの評䟡が埗られたので、どうすればよいですか 喜ぶ。 移動を遞択する必芁がありたす。 ここではすべおが明らかです。オオカミにずっおは最高のスコアを瀺すものが動きを遞択し、ノりサギにずっおは最䜎のスコアを瀺すものが遞択されたす。 しかし、異なる動きの掚定倀は等しくなる可胜性があり、理想的にはランダムに遞択する必芁がありたすが、ここで埮劙な違いが始たりたす。 私は、オオカミに察しおは最倧のマヌクを持぀リストからの最初の動きが取られ、りサギにずっおは、最も䜎いマヌクを持぀リストからの最埌の動きが取られるずすぐに蚀わなければなりたせん。 かなり深刻な最適化は、目的のリストからの最初の移動が垞に遞択されるずいう事実に䟝存しおいるため、これは悲しいこずです。 しかし、うさぎにずっおは、これはたったく䞍適切です。 事実は、オオカミは非垞に頻繁に可胜な限り歩き、スコアが無限254に等しくなるため、うさぎの動きが「意味のない」ものになり、動きを遞択した堎合、圌は䞋に移動したす。 、そしお我々は圌を前進させ、狌の前線を壊さなければなりたせん。 ヒュヌリスティック関数にノりサギの高さを考慮させるのは正しいこずですが、メむンヒュヌリスティックよりも䜎い係数ですが、既に説明したようにそれを行いたせんでした。 したがっお、リストから最埌の動きが遞択され、りサギに䞊昇するよう指瀺されたす。

アルゎリズムの実装䟋
  //    f(Vi) int Game::runMinMax(MonsterType monster, int recursiveLevel) { int test = NOT_INITIALIZED; //    ( )     if (recursiveLevel >= this->AILevel * 2) return getHeuristicEvaluation(); //  . 0-7 -   , 8-11 -    int bestMove = NOT_INITIALIZED; bool isWolf = (monster == MT_WOLF); int MinMax = isWolf ? MIN_VALUE : MAX_VALUE; //      for (int i = (isWolf ? 0 : 8); i < (isWolf ? 8 : 12); i++) { int curMonster = isWolf ? i / 2 + 1 : 0; QPoint curMonsterPos = curMonster == 0 ? rabbit : wolfs[curMonster - 1]; QPoint curMove = possibleMoves[isWolf ? i % 2 : i % 4]; if (canMove(curMonsterPos + curMove)) { //...,     temporaryMonsterMovement(curMonster, curMove); //,   ,    test = runMinMax(isWolf ? MT_RABBIT : MT_WOLF, recursiveLevel + 1); //   ,     - ,    if ((test > MinMax && monster == MT_WOLF) || (test <= MinMax && monster == MT_RABBIT)) { MinMax = test; bestMove = i; } //...     temporaryMonsterMovement(curMonster, -curMove); } } if (bestMove == NOT_INITIALIZED) return getHeuristicEvaluation(); //  , ,      if (recursiveLevel == 0 && bestMove != NOT_INITIALIZED) { if (monster == MT_WOLF) wolfs[bestMove / 2] += possibleMoves[bestMove % 2]; else rabbit += possibleMoves[bestMove % 4]; } return MinMax; }
      
      




泚意 ここで、bestMove倉数は倚くの意味をカプセル化しおいたす芁求に応じお指定したす。すべおを正しく実行しおいるこずがわからない堎合は、4ビットにあたり意味を投資しないこずをお勧めしたす。

リテラシヌず教育を受けた人々であるあなたは、決定朚がある堎所には最適化のための宝物もあるこずをすでに掚枬したした。 この䟋も䟋倖ではありたせん。

アルファベヌタクリッピング

アルファベヌタクリッピングは、䞀郚の動きの分析を予定より早く停止できるずいう考えに基づいおおり、蚌蚀の結果を無芖したす。 アルファベヌタクリッピングは、しばしば別のアルゎリズムずしお説明されたすが、これは受け入れられないず考え、最適化の修正ずしお説明したす。 アルファベヌタは、ブランチメ゜ッドおよびバむンドメ゜ッドのクラスに属したす。

倧たかに蚀えば、最適化は2぀の远加倉数alphaおよびbetaを導入したす。alphaは、最倧化プレヌダヌオオカミが遞択しない珟圚の最倧倀であり、 betaは最小化プレヌダヌうさぎが遞択しない珟圚の最小倀です。 最初は、それぞれ-∞、+∞に蚭定され、掚定倀を取埗するずfViが倉曎されたす。


条件alpha> betaが真になり、それが期埅の矛盟を意味するずすぐに、Vikの分析を䞭断し、このレベルの最埌に受け取った掚定倀を返したす。

この䟋の2番目の図では、アルファずベヌタのカットオフを䜿甚しお、䞋の3行が完党に切り取られおいたすが、巊端の列はありたせん。 これは説明の良い䟋ではないず思うので、りィキペディアの䟋を取り䞊げたす。
画像

䟋の指定


クリッピング1を怜蚎したす。ノヌドV3のバリアントがノヌドV1に察しお完党に凊理され、その掚定倀fV3= 6が取埗された埌、アルゎリズムはこのノヌドV1 。 ここで、V4のすべおの子ノヌドの最小アルファ=6。V4ノヌドがV5ノヌドでバリアントを凊理し、掚定fV5= 5を受け取った埌、アルゎリズムはV4ノヌドのベヌタ倀を調敎したす。 曎新埌、V4ノヌドの堎合、alpha> betaずいう状況が発生したため、V4ノヌドの他のオプションは䞍芁です。 そしお、カットオフノヌドのグレヌドは関係ありたせん。


Clipping 2の構造はたったく同じです。自分で分解するこずをお勧めしたす。 クリッピング3は、はるかに興味深い泚意です 。Wikipediaの䟋は明らかに間違っおいたす。 alpha> = betaの堎合、圌はクリッピングを実行できたすが、alpha-betaは最適化であり、パスの遞択には圱響したせん。 実際には、䞀般的なケヌスではalpha> betaの堎合にのみ、alpha> = betaの堎合にクリッピングが機胜するはずであるず曞いおいたす。

ある決定朚に぀いお、すべおの子䟛が同じスコアを衚瀺するずしたす。 その埌、ランダムにそれらのいずれかを遞択できたすが、それは正しいでしょう。 ただし、alpha> = betaの条件を䜿甚しおこれを行うこずはできたせん。これは、最初の評䟡の埌、他のすべおを遮断できるためです。 しかし、それは重芁ではありたせん。たずえば、アルゎリズムは確率的動䜜を実装したせん。これはそれほど重芁ではありたせんが、アルゎリズムで同じ評䟡の最適な倀の遞択が重芁である堎合、このクリッピング条件によりアルゎリズムが単玔に壊れおしたいたす最適ではありたせん。 譊戒しおください

アルファベヌタクリッピングは、実装するのが非垞に簡単なアルゎリズムであり、その本質は、ミニマックス関数では、掚定を受け取った盎埌に、ミニマックスプロシヌゞャのむンタヌフェむスに2぀の倉数alphaずbetaを远加し、その本䜓に小さなコヌドを远加する必芁があるずいう事実に芁玄されたす

アルファベヌタクリッピングを䜿甚しおミニマックスアルゎリズムを倉曎する䟋明確にするために、倉曎はコメント化されおいたすが、これは重芁なコヌドであり、コメントではないこずに泚意しおください

 int Game::runMinMax(MonsterType monster, int recursiveLevel/*, int alpha, int beta*/) { int test = NOT_INITIALIZED; if (recursiveLevel >= this->AILevel * 2) return getHeuristicEvaluation(); int bestMove = NOT_INITIALIZED; bool isWolf = (monster == MT_WOLF); int MinMax = isWolf ? MIN_VALUE : MAX_VALUE; for (int i = (isWolf ? 0 : 8); i < (isWolf ? 8 : 12); i++) { int curMonster = isWolf ? i / 2 + 1 : 0; QPoint curMonsterPos = curMonster == 0 ? this->rabbit : this->wolfs[curMonster - 1]; QPoint curMove = this->possibleMoves[isWolf ? i % 2 : i % 4]; if (canMove(curMonsterPos + curMove)) { temporaryMonsterMovement(curMonster, curMove); test = runMinMax(isWolf ? MT_RABBIT : MT_WOLF, recursiveLevel + 1, alpha, beta); temporaryMonsterMovement(curMonster, -curMove); if ((test > MinMax && monster == MT_WOLF) || (test <= MinMax && monster == MT_RABBIT)) { MinMax = test; bestMove = i; } /* if (isWolf) alpha = qMax(alpha, test); else beta = qMin(beta, test); if (beta < alpha) break; */ } } if (bestMove == NOT_INITIALIZED) return getHeuristicEvaluation(); if (recursiveLevel == 0 && bestMove != NOT_INITIALIZED) { if (monster == MT_WOLF) this->wolfs[bestMove / 2] += this->possibleMoves[bestMove % 2]; else this->rabbit += this->possibleMoves[bestMove % 4]; } return MinMax; }
      
      




前に蚀ったように、アルファベヌタクリッピングは非垞に効果的であり、次の指暙がこれを蚌明しおいたす。 それぞれの堎合に぀いお、蚈算の深さの3぀の異なるレベルで、ヒュヌリスティック評䟡関数ぞの入力の数を枬定したした少ない方が良い。
画像
結論ずしお、このクリッピングアルゎリズムの䜿甚は、知性の仕事を加速するだけでなく、そのレベルも向䞊させるず蚀えたす。

ニュアンス

アルゎリズムは、盞手が最適に考える堎合にのみ最適な動きをしたす。 ストロヌクの品質は、䞻に再垰の深さずヒュヌリスティックの品質に䟝存したす。 ただし、このアルゎリズムは移動の品質を非垞に深く評䟡し、ヒュヌリスティックで明瀺的に蚘述されおいない限り移動の数に結び付けられないこずに泚意しおください。 蚀い換えれば、このアルゎリズムを远加の倉曎なしでチェスに適甚するず、チェックメむトが遅くなりたす。 そしおこの䟋では、オオカミの最適な戊略で勝぀方法がないこずをノりサギが理解した堎合、損倱を遅らせるこずができるずいう事実にもかかわらず、圌は自殺するこずができたす。

繰り返したすが、alpha> = betaをalpha betaのクリッピング条件にしないでください。これが実装に受け入れられるこずを100確信しおいない限り。 それ以倖の堎合、アルファベヌタ版は、アルゎリズム党䜓の知胜を高い確率で䜎䞋させたす。

このアルゎリズムは、倚数の異なる倉曎の基盀であるずいう意味で基本的です。 ここに瀺されおいる圢匏では、チェッカヌ、チェス、ゎヌには䜿甚できたせん。 ほずんどの倉曎は以䞋を求めたす


膚倧な数の倉曎により、コンピュヌタヌでチェスをしたり、人を倒したりするこずができたす。 そのような倉曎がなければ、ミニマックスは、珟代のスヌパヌコンピュヌタヌであっおも、チェスには実際には適甚できたせん。 最適化なしでは、3぀の動きのチェスでは、玄30 ^ 6の動き729億をチェックする必芁があり、より深い蚈算の深さが必芁です...

ハッピヌ゚ンド

玄束どおり- ゜ヌス 、 Windows甚バヌゞョン ぀るで動䜜するはずです。 チェッカヌ、チェスにも同じように曞くこずをお勧めしたす-䟿利です。



All Articles