長谷ずIgelのAI3぀のミニマックス







00幎代埌半のボヌドゲヌムの本圓のブヌムの埌、ゲヌムの入ったいく぀かの箱が家族の䞭に残った。 それらの1぀は、元のドむツ語版のゲヌム「Hare and Hedgehog」です。 ランダム性の芁玠が最小化された数人のプレヌダヌ向けのゲヌムで、萜ち着いた蚈算ず数ステップで「先読み」するプレヌダヌの胜力が勝ちたす。



ゲヌムで頻繁に敗北したため、コンピュヌタヌの「むンテリゞェンス」を曞いお最高の動きを遞択したした。 知胜、理想的にはうさぎずハリネズミのグランドマスタヌず戊うこずができたすそしお、チェスではなくお茶、ゲヌムが簡単になりたす。 蚘事の残りの郚分では、開発プロセス、AIロゞック、および゜ヌスぞのリンクに぀いお説明したす。



ゲヌムのルヌルHare and Hedgehog



65セルの競技堎には、2〜6人の参加者からなる耇数のプレヌダヌチップがありたすもちろん、ドロヌむング、非正芏、倖芋、たあたあ。







むンデックス0開始および64終了のセルを陀き、各セルに配眮できるプレヌダヌは1人だけです。 各プレむダヌの目暙は、ラむバルに先んじおフィニッシュセルに進むこずです。



前進するための「燃料」はニンゞン、぀たりゲヌム通貚です。 開始時に、各プレむダヌは68個のニンゞンを受け取りたす。



ニンゞンに加えお、プレヌダヌは最初に3枚のサラダカヌドを受け取りたす。 サラダは特別な「アヌティファクト」であり、プレむダヌはフィニッシュの前に取り陀く必芁がありたす 。 サラダを取り陀きたすこれは、次のような特別なサラダケヌゞでのみ行うこずができたす



を含むプレヌダヌは、远加のニンゞンを受け取りたす。 その前に、あなたの動きをスキップしたす。 カヌドを離れるサラダの前にいるプレヌダヌが倚いほど、プレヌダヌが受け取るニンゞンが倚くなりたす10 x他のプレヌダヌに察するフィヌルドでのプレヌダヌの䜍眮。 ぀たり、2番目のフィヌルドに立っおいるプレむダヌは20個のニンゞンを受け取り、サラダのケヌゞを離れたす。



プレヌダヌの䜍眮がセルの番号ず䞀臎する堎合、レタスのセルず同様に、番号1から4のセルは数十のニンゞンをもたらすこずができたす1から4、番号1のセルはフィヌルドの4番目ず6番目の䜍眮にも適しおいたす。



プレむダヌは、ニンゞンのむメヌゞが付いたケヌゞに残り、このアクションのために10個のニンゞンを受け取るか䞎えるこずができたす。 なぜプレむダヌは「燃料」を䞎えなければならないのですか 実際には、プレヌダヌは最埌の移動埌に10個のニンゞンしか持おないずいうこずです2番目を終えるず20、3番目を終えるず30など。



最埌に、プレヌダヌは、 最も近い無料のハリネズミでNステップを螏むこずで10 x Nのニンゞンを埗るこずができたす最も近いハリネズミが忙しい堎合、そのような移動は䞍可胜です。



次の匏に埓っお、移動のコストは移動の数に比䟋せずに蚈算されたす切り䞊げ



 fracN+N22 、

ここで、Nは前方ぞのステップ数です。



したがっお、1぀のセルを進めるために、プレヌダヌは1぀のニンゞン、2぀のセルに3぀のニンゞン、3぀のセルに6぀のニンゞン、4に10、...、20のセルを進めるために210のニンゞンを䞎えたす。



最埌のセル-うさぎの絵のあるセル-は、ランダム性の芁玠をゲヌムに導入したす。 りサギのいるケヌゞの䞊に立っお、プレヌダヌはパむルから特別なカヌドを匕き、その埌いく぀かのアクションが実行されたす。 カヌドずゲヌムの状況に応じお、プレヌダヌはニンゞンを倱ったり、䜙分なニンゞンを入手したり、1タヌンスキップしたりする堎合がありたす。 「効果」のあるカヌドの䞭には、プレヌダヌにずっおより倚くのネガティブなシナリオがいく぀かあり、ゲヌムが慎重に蚈算されるこずを奚励しおいたす。



AIを䜿甚しない実装



ゲヌムの「むンテリゞェンス」の開発の基瀎ずなる最初の実装では、各プレむダヌが人を動かすずいう遞択肢に限定しおいたした。



ゲヌムをクラむアントずしお実装するこずにしたした。静的な1ペヌゞのWebサむトで、その「ロゞック」はすべおJSに実装され、サヌバヌはWEB APIアプリケヌションです。 サヌバヌは.NET Core 2.1で蚘述され、Windows / Linux / Mac OSで実行できるdllファむルずいう1぀のアセンブリアヌティファクトを生成したす。



クラむアント郚分の「ロゞック」は最小限に抑えられたすGUIは玔粋に実甚的なため、UXも同様です。 たずえば、Webクラむアントはチェック自䜓を実行したせん-プレヌダヌによっお芁求されたルヌルが蚱可されおいるかどうか。 このチェックはサヌバヌで実行されたす。 サヌバヌは、プレむダヌに珟圚のゲヌム䜍眮から䜕ができるかをクラむアントに䌝えたす。



サヌバヌは、叀兞的なムヌアマシンです。 サヌバヌロゞックには、「接続されたクラむアント」、「ゲヌムセッション」などの抂念がありたせん。



サヌバヌは、受信したHTTP POSTコマンドを凊理するだけです。 「コマンド」パタヌンはサヌバヌに実装されおいたす。 クラむアントは、次のコマンドのいずれかの実行を芁求できたす。





2番目のチヌムの堎合、クラむアントはサヌバヌに珟圚のゲヌム䜍眮Dispositionクラスのオブゞェクト、぀たり次の圢匏の説明を送信したす。





サヌバヌは、远加情報を送信する必芁はありたせん-䟋えば、競技堎に関する情報。 チェスのスケッチを蚘録するように、ボヌド䞊の黒ず癜のセルの配眮をペむントする必芁はありたせん-この情報は定数ずしお扱われたす。



応答ずしお、サヌバヌはコマンドが正垞に完了したかどうかを瀺したす。 技術的には、クラむアントは、たずえば、無効な移動を芁求する堎合がありたす。 たたは、1人の参加者のために新しいゲヌムを䜜成しおみおください。これは明らかに意味がありたせん。



チヌムが成功した堎合、応答には、新しいゲヌムの䜍眮ず、キュヌ内の次のプレむダヌが行うこずができる移動のリスト新しい䜍眮の珟圚が含たれたす。



これに加えお、サヌバヌ応答にはいく぀かのサヌビスフィヌルドが含たれたす。 たずえば、りサギのカヌドのテキストは、察応するケヌゞのステップでプレむダヌによっお「匕き出された」。



プレむダヌタヌン



プレヌダヌのタヌンは敎数ずしお゚ンコヌドされたす



  1. 0、プレむダヌが珟圚の広堎に留たるこずを䜙儀なくされた堎合、

    1、2、... Nは1、... Nは前進、
  2. -1、-2、... -Mは1〜M個のセルを最も近い自由なハリネズミに戻したす。
  3. 1001、1002-ニンゞンセルにずどたり、このために10個のニンゞンを受け取る1001たたは䞎える1002こずを決定したプレヌダヌの特別なコヌド。


゜フトりェア実装



サヌバヌは、芁求されたコマンドのJSONを受信し、察応する芁求クラスの1぀に解析しお、芁求されたアクションを実行したす。



クラむアントプレヌダヌがチヌムに転送されたポゞションPOSからCMDコヌドを䜿甚しお移動を芁求した堎合、サヌバヌは次のアクションを実行したす。





芁求された移動CMDの蚱容性をチェックし、新しいポゞションを構築するロゞックは、私たちが望むよりも少し密接に接続されおいるこずが刀明したした。 このロゞックでは、蚱容可胜な動きを芋぀ける方法に共通点がありたす。 この機胜はすべお、TurnCheckerクラスによっお実装されたす。



チェック/実行メ゜ッドの入力時に、TurnCheckerはゲヌム䜍眮のクラスDispositionのオブゞェクトを受け取りたす。 Dispositionオブゞェクトには、プレヌダヌデヌタヘむズ[]ヘむズの配列、移動を行うプレヌダヌのむンデックス+ TurnCheckerオブゞェクトの操䜜䞭に入力されるサヌビス情報が含たれたす。



競技堎は、SingleMapずしお実装されるFieldMapクラスを蚘述したす。 このクラスには、セルの配列ず埌続の蚈算を簡玠化/高速化するために䜿甚されるオヌバヌヘッド情報が含たれおいたす。



パフォヌマンスに関する考慮事項
TurnCheckerクラスの実装では、ルヌプを回避するために、可胜な限り詊みたした。 実際、䞀連の蚱容される移動/移動の実行を取埗するメ゜ッドは、準最適な移動の怜玢手順䞭に数千数䞇回呌び出されたす。



したがっお、たずえば、次の匏を䜿甚しお、プレヌダヌがN個のニンゞンを䜿甚しお前進できるセルの数を蚈算したす。



return ((int)Math.Pow(8 * N + 1, 0.5) - 1) / 2;
      
      





セルiがプレむダヌの1人によっお占有されおいるかどうかを確認し、プレむダヌのリストをたどりたせんこのアクションはおそらく䜕床も実行する必芁があるためですが、事前に入力された[cell_index、busy_cage_ flag]ずいう圢匏の蟞曞に目を向けたす。



指定されたハリネズミのセルが、プレヌダヌが占有しおいる珟圚のセルに最も近い背埌にあるかどうかを確認するずき、芁求された䜍眮を[cell_index、nearest_back_dezh] _index]圢匏の蟞曞の倀ず比范したす。



AIによる実装



サヌバヌによっお凊理されるコマンドのリストに1぀のコマンドが远加されたす。プログラムによっお遞択された準最適な移動を実行したす。 このコマンドは、「プレむダヌの移動」コマンドを少し修正したもので、実際には移動フィヌルド CMD は削陀されおいたす。



頭に浮かぶ最初の決定は、発芋的手法を䜿甚しお「可胜な限り最良の」動きを遞択するこずです。 チェスずの類掚により、このポゞションに䜕らかのレヌティングを蚭定するこずで、ムヌブで埗られた各ゲヌムポゞションを評䟡できたす。



発芋的䜍眮評䟡



たずえば、チェスでは、評䟡を行うのは非垞に簡単です開口郚の荒野に登るこずなく少なくずも、3ポヌンの階士/ビショップの倀、ルヌク5のポヌン、クむヌン9、およびキングintの倀を取るこずにより、ピヌスの合蚈「コスト」を蚈算できたす.MaxValueポヌン。 掚定倀を改善するのは簡単です。たずえば、それに远加する補正係数-係数/指数たたは他の関数を䜿甚





マットの䜍眮に特別な評䟡が䞎えられたす。チェックメむトがコンピュヌタヌを眮いた堎合はint.MaxValue 、チェックメむトが人を眮いた堎合はint.MinValueです。



チェスプロセッサに次の動きを遞択するように呜じた堎合、そのような評䟡のみに基づいお、プロセッサはおそらく最悪の動きを遞択したせん。 特に





もちろん、そのようなコンピュヌタヌの動きは、わずかな意味で動きをする盞手ずの成功のチャンスを圌に残したせん。 コンピュヌタヌはプラグを無芖したす。 さらに、圌はおそらくクむヌンをポヌンず亀換するこずをheしたせん。



それにもかかわらず、チェスの珟圚のプレヌ䜍眮のヒュヌリスティック評䟡のアルゎリズムチャンピオンプログラムの栄冠を䞻匵するこずなくは、非垞に透明です。 あなたはゲヌムHare and Hedgehogに぀いお蚀うこずはできたせん。



䞀般的な堎合、Hare and the Hedgehogのゲヌムでは、かなりがやけた栌蚀が機胜したす。「 ニンゞンを増やしおレタスを枛らしお、さらに先に進む方が良い 」。 ただし、すべおがそれほど簡単ではありたせん。 たずえば、プレむダヌがゲヌムの途䞭でサラダカヌドを1枚持っおいる堎合、このオプションは非垞に有効です。 しかし、サラダカヌドでフィニッシュラむンに立っおいるプレヌダヌは、明らかに負けおいる状態になりたす。 評䟡アルゎリズムに加えお、駒ぞの脅嚁がチェスの䜍眮のヒュヌリスティック評䟡でカりントできるのず同じように、さらに䞀歩螏み蟌む機䌚を埗たいず思いたす。 たずえば、前のプレヌダヌの数を考慮しお、レタスセル/ポゞションセル1〜4を離れるプレヌダヌが受け取るニンゞンのボヌナスを考慮する䟡倀がありたす。



関数ずしお最終グレヌドを導きたした



E = Ks * S + Kc * C + Kp * P、



ここで、S、C、PはサラダカヌドSずプレむダヌの手にあるニンゞン©を䜿甚しお蚈算されたグレヌドであり、Pは移動距離にわたっおプレむダヌに䞎えられるスコアです。



Ks、Kc、Kpは察応する補正係数ですこれらに぀いおは埌で説明したす。



最も簡単な方法は、移動したパスのマヌクを決定するこずです

P = i * 3、ここでiはプレヌダヌが配眮されおいるセルのむンデックスです。



Cニンゞンのグレヌディングはすでに難しくなっおいたす。



特定のC倀を取埗するには、3぀の関数のいずれかを遞択したす C0、C1、C2 1぀の匕数手のニンゞンの数から。 関数Cのむンデックス[0、1、2]は、競技堎でのプレヌダヌの盞察的な䜍眮によっお決たりたす。









機胜0ず1は䌌おいたす。プレヌダヌの手にあるニンゞンの「倀」は、手のニンゞンの数が増えるず埐々に枛少したす。 ゲヌムはめったにPlyushkinsを奚励したせん。 ケヌス1枡されたフィヌルドの半分では、ニンゞンの倀は少し速く枛少したす。



反察に、機胜2プレヌダヌは終了できたすは、プレヌダヌの手の各ニンゞンに倧きな眰金負の係数倀を課したす。ニンゞンが倚いほど、ペナルティ係数が倧きくなりたす。 にんじんが過剰であるため、ゲヌムのルヌルによりフィニッシュは犁止されおいたす。



プレヌダヌの手のニンゞンの量を蚈算する前に、レタスのセル/セル番号1からのタヌンあたりのニンゞンを考慮しお指定したす... 4。



「 レタス 」グレヌドSも同様の方法で掚定されたす。 プレヌダヌの手のサラダの量0〜3に応じお、機胜が遞択されたす S0、S1、S2 たたは S3 。 関数の匕数 S0−S3 。 -再び、プレヌダヌが移動した「盞察」パス。 ぀たり、サラダが前面に残っおいるセルの数プレヌダヌが占有しおいるセルに察しお







曲線 S0 -レタスの手札が0枚のプレヌダヌの堎合、プレヌダヌの前のレタス现胞の数0〜5の評䟡関数S、

曲線 S1 -1枚のサラダカヌドを手に持っおいるプレヌダヌなどず同じ機胜



したがっお、最終評点E = Ks * S + Kc * C + Kp * Pでは、以䞋が考慮されたす。





そしお、最倧のヒュヌリスティックスコアを持぀次の動きを遞択するコンピュヌタヌのプレむ方法を次に瀺したす。







原則ずしお、デビュヌはそれほど悪くありたせん。 ただし、このようなAIに良いゲヌムを期埅するこずはできたせんゲヌムの途䞭たでに、緑色の「ロボット」は繰り返し動き始め、最埌にはハリネズミの前埌に動きを数回繰り返し、最終的に終了したす。 偶然のせいで、圌はプレヌダヌの埌ろでフィニッシュしたす。



実装ノヌト
掚定倀の蚈算は、特別なクラス-EvaluationCalculatorによっお管理されたす。 ニンゞンに盞察的な䜍眮を評䟡するための関数-サラダカヌドは、蚈算機クラスの静的コンストラクタヌの配列にロヌドされたす。 入力時に、䜍眮掚定方法は、䜍眮オブゞェクト自䜓ずプレヌダヌのむンデックスを受け取りたす。この芖点から、アルゎリズムによっお䜍眮が評䟡されたす。 ぀たり、仮想ポむントが考慮されるプレヌダヌに応じお、同じゲヌムの䜍眮が耇数の異なる評䟡を受けるこずができたす。



決定朚ずミニマックスアルゎリズム



敵察的なミニマックスゲヌムでは、意思決定アルゎリズムを䜿甚したす。 私の意芋では、アルゎリズムはこの投皿翻蚳で説明されおいたす。



私たちは、プログラムにいく぀かの動きを「芋る」こずを教えたす。 珟圚の䜍眮からそしお、背景はアルゎリズムにずっお重芁ではありたせん-プログラムがムヌア機ずしお機胜するこずを思い出しおください、番号1の番号が付けられおいるず仮定するず、プログラムは2぀の動きをするこずができたす。 2぀のポゞション、2ず3を取埗したす。次に、プレむダヌのタヌン-人䞀般的な堎合-敵が来たす。 2番目の䜍眮から、盞手には3぀の動きがあり、3番目からは2぀の動きしかありたせん。 次に、再び移動する順番はプログラムに圓おはたり、合蚈で5぀の可胜な䜍眮から10の移動を行うこずができたす。







コンピュヌタヌの2回目の移動の埌、ゲヌムが終了し、受信した䜍眮のそれぞれが、1番目ず2番目のプレヌダヌの芖点から評䟡されたずしたす。 そしお、すでに評䟡アルゎリズムを実装しおいたす。 ベクトルの圢で各最終䜍眮ツリヌの葉9 ... 18を評䟡したしょう [v0、v1] 、

どこで v0 -最初のプレヌダヌに぀いお蚈算されたスコア、 v1 -2番目のプレヌダヌのスコア







コンピュヌタヌは最埌の動きをするため、オプション[9、10]、[11]、[12、13]、[14、15、16]、[17、18]の各サブツリヌを遞択したすそれは圌に良い評䟡を䞎えたす。 問題はすぐに発生したす。どの原則によっお「最良の」ポゞションを遞択すべきでしょうか。



たずえば、2぀の動きがあり、その埌に栌付け[5; 5]および[2; 1]。 最初のプレヌダヌを評䟡したす。 次の2぀の遞択肢がありたす。





私の゜フトりェア実装では、グレヌド遞択アルゎリズムグレヌドベクトルをi番目のプレヌダヌのスカラヌ倀にマッピングする関数をカスタムパラメヌタヌにしたした。 さらなるテストにより、驚くべきこずに、最初の戊略の優䜍性-最倧絶察倀による䜍眮の遞択が瀺されたした vi 。



゜フトりェア実装の機胜
AITurnMakerクラスの蚭定で最適なグレヌドを遞択する最初のオプションが指定されおいる堎合、察応するメ゜ッドのコヌドは次の圢匏になりたす。



  int ContractEstimateByAbsMax(int[] estimationVector, int playerIndex) { return estimationVector[playerIndex]; }
      
      





2番目の方法-競合他瀟の䜍眮に察する最倧倀-は少し耇雑に実装されおいたす。



  int ContractEstimateByRelativeNumber(int[]eVector, int player) { int? min = null; var pVal = eVector[player]; for (var i = 0; i < eVector.Length; i++) { if (i == player) continue; var val = pVal - eVector[i]; if (!min.HasValue || min.Value > val) min = val; } return min.Value; }
      
      







遞択した掚定倀図で䞋線が匕かれおいるは、レベルアップに転送されたす。 ここで、アルゎリズムが遞択する埌続の䜍眮を把握しお、敵が䜍眮を遞択する必芁がありたす。







敵は明らかに、自分にずっお最高の栌付けを持぀䜍眮ベクトルの2番目の座暙が最倧の倀を取る䜍眮を遞択したす。 これらの掚定倀は、グラフで再び䞋線が匕かれおいたす。



最埌に、非垞に最初の動きに戻りたす。 コンピュヌタヌが遞択し、圌はベクトルの最初の座暙が最倧の動きを奜む







したがっお、問題は解決されたした-準最適な動きが芋぀かりたした。 ツリヌ䞊のリヌフ䜍眮の100のヒュヌリスティックスコアが将来の勝者を瀺しおいるずしたす。 それから、私たちのアルゎリズムは間違いなく可胜な限り最高の動きを遞択したす。



ただし、ヒュヌリスティックスコアは、ゲヌムの最終䜍眮が評䟡された堎合にのみ100正確です。1人たたは耇数のプレむダヌが終了し、勝者が決定されたす。 したがっお、Nの動きを先読みする機䌚があれば、同じ匷さのラむバルを獲埗するのに必芁な数だけ、最適な動きを遞択できたす。



しかし、2人のプレヌダヌの兞型的なゲヌムは、平均で玄30-40動きたす3人のプレヌダヌ-箄60動きなど。 各ポゞションから、プレむダヌは通垞玄8の動きをするこずができたす。 したがっお、30の動きの可胜な䜍眮の完党なツリヌは、およそ

830 = 1237940039285380274899124224ピヌク



実際には、PCで〜100,000ポゞションのツリヌを構築および「解析」するには玄300ミリ秒かかりたす。 コンピュヌタヌの応答を1秒以䞋にしたい堎合、7〜8レベル移動でツリヌの深さの制限が䞎えられたす。



゜フトりェア実装の機胜
䜍眮のツリヌを構築し、最適な動きを芋぀けるには、明らかに再垰的なメ゜ッドが必芁です。 メ゜ッドの入力には、珟圚の䜍眮芚えおいるように、プレヌダヌが移動しおいるず珟圚のツリヌレベル移動番号がありたす。 アルゎリズムの蚭定で蚱可されおいる最倧レベルに達するず、関数は各プレヌダヌの「芖点」からのヒュヌリスティックな䜍眮掚定ベクトルを返したす。



重芁な远加 珟圚のプレむダヌが終了したら、ツリヌの䞋の䞋降も停止しなければなりたせん。 それ以倖の堎合他のプレむダヌの䜍眮に察しお最適な䜍眮を遞択するアルゎリズムが遞択されおいる堎合、プログラムはフィニッシュで長時間「螏み鳎らし」、盞手を「あざける」こずができたす。 さらに、この方法で、゚ンドゲヌムのツリヌのサむズをわずかに小さくしたす。



ただ最終的な再垰レベルに達しおいない堎合は、可胜な移動を遞択し、各移動の新しい䜍眮を䜜成しお、珟圚のメ゜ッドの再垰呌び出しに枡したす。



ミニマックスはなぜですか
プレむダヌの元の解釈では垞に2です。 プログラムは、最初のプレヌダヌの䜍眮からのみスコアを蚈算したす。 したがっお、「最適な」ポゞションを遞択する堎合、むンデックス0のプレヌダヌは最倧評䟡のポゞションを探し、むンデックス1のプレヌダヌは最小レヌティングを探したす。



私たちの堎合、栌付けはベクトルである必芁がありたす。これにより、N人のプレむダヌのそれぞれが「芖点」から評䟡できるようになりたす。



AIのチュヌニング



コンピュヌタヌず察戊する私の緎習は、アルゎリズムがそれほど悪くないが、それでも人間に劣るこずを瀺したした。 私は2぀の方法でAIを改善するこずにしたした。





ミニマックスアルゎリズムの最適化



䞊蚘の䟋では、䜍眮8の怜蚎を拒吊し、ツリヌの2〜3頂点を「保存」できたす。







朚の呚りを䞊から䞋、巊から右ぞ歩きたす。 䜍眮2から始たるサブツリヌをバむパスしお、移動1-> 2の最適な掚定を掚定したした[3、2]。 䜍眮7にルヌトを持぀サブツリヌをバむパスしお、珟圚の移動3-> 7に最適な評䟡を決定したした[2、4]。 コンピュヌタヌ最初のプレヌダヌの芳点からは、スコア[2、4]はスコア[3、2]よりも悪いです。 たた、コンピュヌタヌの察戊盞手は、ポゞション8のスコアに関係なく、ポゞション3からの移動を遞択するため、ポゞション3の最終スコアは、3番目のポゞションで埗られたスコアよりもアプリオリに悪くなりたす。 したがっお、䜍眮8にルヌトを持぀サブツリヌは構築できず、評䟡できたせん。



Minimaxアルゎリズムの最適化されたバヌゞョンは、䜙分なサブツリヌを切り取るこずができるため、アルファベヌタクリッピングアルゎリズムず呌ばれたす 。 このアルゎリズムを実装するには、゜ヌスコヌドを少し倉曎する必芁がありたす。



゜フトりェア実装の機胜
2぀の敎数パラメヌタヌが、TurnMakerクラスのCalcEstimateメ゜ッドに远加で枡されたす。最初はint.MinValueに等しいalphaず、int.MaxValueに等しいbetaです。 さらに、考慮䞭の珟圚の移動の掚定倀を受信した埌、フォヌムの擬䌌コヌドが実行されたす。



  e = _[0] //        (  )  (e > alpha) alpha = e   (e < beta) beta = e  (beta <= alpha)    
      
      







゜フトりェア実装の重芁な機胜
定矩䞊、アルファ-ベヌタクリッピング法は、「クリヌンな」ミニマックスアルゎリズムず同じ゜リュヌションに぀ながりたす。 意思決定のロゞックが倉曎されたかどうかを確認するためにたたは結果が移動である、ロボットが2人の察戊盞手ごずに8回の移動合蚈16回の移動を行い、結果の䞀連の移動を保存するナニットテストを䜜成したした。クリッピングオプションを無効にしたした。



次に、同じテストで、クリッピングオプションを有効にしお手順を繰り返したした。 その埌、䞀連の動きが比范されたした。 動きの䞍䞀臎は、アルファ-ベヌタクリッピングアルゎリズムの実装に゚ラヌがあるこずを瀺したすテストに倱敗したした。



マむナヌアルファベヌタクリッピングの最適化



AI蚭定でクリッピングオプションを有効にするず、䜍眮ツリヌの頂点の数が平均3倍枛少したした。 この結果は倚少改善される可胜性がありたす。



䞊蚘の䟋では







䜍眮3の頂点を持぀サブツリヌの前に䜍眮2の頂点を持぀サブツリヌを調べたので、「䞀臎」したした。シヌケンスが異なる堎合、「最悪」のサブツリヌから始めお、次の䜍眮を怜蚎しおも意味がないずいう結論に達したせんでした。



原則ずしお、ツリヌでのクリッピングはより「経枈的」であるこずが刀明し、同じレベル぀たり、iポゞションからのすべおの可胜な移動の子孫頂点は、珟圚の深く芋ないで䜍眮掚定によっお既に゜ヌトされおいたす。 蚀い換えるず、ヒュヌリスティックな芳点から最高の動きはより良い最終グレヌドを獲埗する可胜性が高いず想定しおいたす。 したがっお、「最悪の」サブツリヌの前に「最良の」サブツリヌが考慮されるように、䜕らかの確率でツリヌを゜ヌトしたす。これにより、より倚くのオプションを切り捚おるこずができたす。



珟圚の䜍眮の評䟡は、費甚のかかる手順です。 以前に終端䜍眮葉のみを評䟡するのに十分だった堎合、ツリヌのすべおの頂点に察しお評䟡が行われたす。 ただし、テストで瀺されたように、行われた評䟡の総数は、考えられる動きの最初の䞊べ替えを行わなかったバリアントよりもただわずかに少なかった。



゜フトりェア実装の機胜
アルファ-ベヌタクリッピングアルゎリズムは、元のミニマックスアルゎリズムず同じ動きを返したす。 これは、私たちが曞いた単䜓テストをチェックし、2぀の動きのシヌケンスを比范したすクリッピングありずなしのアルゎリズムの堎合。 ゜ヌトを䜿甚したアルファベヌタクリッピングは、䞀般的な堎合、準最適な動きずしお異なる動きを瀺す堎合がありたす。



倉曎されたアルゎリズムの正しい動䜜をテストするには、新しいテストが必芁です。 倉曎にもかかわらず、䞊べ替えのあるアルゎリズムは、元のMinimaxアルゎリズムずしお䞊べ替えのないアルゎリズムずたったく同じ最終掚定ベクトル 図の䟋では[3、2]を生成する必芁がありたす。



テストでは、䞀連のテスト䜍眮を䜜成し、「最適な」移動に埓っおそれぞれから遞択し、゜ヌトオプションをオンたたはオフにしたした。 次に、2぀の方法で埗られた評䟡ベクトルを比范したした。



さらに、ツリヌの珟圚の最䞊郚にある可胜性のある各移動の䜍眮はヒュヌリスティック評䟡によっお䞊べ替えられるため、最悪のオプションの䞀郚をすぐに砎棄するように考えおいたす。 たずえば、チェスプレヌダヌは、ポヌンヒットの代わりにルヌクを䜿甚するムヌブを怜蚎できたす。 ただし、状況を3、4 ...前方に深く「展開」するこずにより、䟋えば、察戊盞手が女王の叞教を攻撃しおいる堎合、圌はすぐに遞択肢に気付くでしょう。



AI蚭定では、「最悪のオプションのクリッピング」ベクトルを蚭定したす。 たずえば、圢匏[0、0、8、8、4]のベクトルは、次のこずを意味したす。





アルファベヌタクリッピングアルゎリズムの゜ヌトがオンになり、クリッピング蚭定で同様のベクトルが䜿甚されるず、プログラムは玄300ミリ秒を費やし、「より深く」8歩進む準最適な動きを遞択し始めたした。



ヒュヌリスティック最適化



ツリヌの頂点の䜍眮がかなりの量で繰り返され、準最適な動きを求めお「深く」先を芋据えおいるにもかかわらず、AIにはいく぀かの匱点がありたした。それらの1぀を「りサギのわな」ず定矩したした。



うさぎトラップ
. ( 8 — 10 15), . “” ( !):



  • 7,
  • , , . , , , .


. 䟋を挙げたす。







54 (43), — 10 55 . AI, , (61), 28 . , 6 9 ( 10 ).



, ( ), , 4 — 6 . , , , AI ?



, , . AI . , , . “ ” :



65 — “” , , . , , , () .



補正係数



前に、珟圚の䜍眮の発芋的掚定のための公匏を䞎える

E = Ks * S + Kc * C + Kp * P、

私は蚀及したが、補正因子に぀いおは説明しなかった。



実際には、匏自䜓ず関数のセットの䞡方が、いわゆる 「垞識。」少なくずも、掚定倀が可胜な限り適切になるように、このような係数Ks、Kc、Kpを遞択したす。評䟡の「劥圓性」を評䟡する方法は芋積りは無次元の量であり、別の芋積りずのみ比范できたす。補正係数を改善する唯䞀の方法を思い぀くこずができたした。次の圢匏のデヌタを含むCSVファむルに保存されたいく぀かの「研究」をプログラムに入れたしたC0..C2,S0..S5











  45;26;2;f;29;19;0;f;2 ...
      
      





この行は、文字通り次を意味したす。





プログラムに20個のスケッチを入れた埌、ゲヌムWebクラむアントにそれらを「ダりンロヌド」し、スケッチされた各スケッチを゜ヌトしたした。スケッチを分析しお、「勝者」を決めるたで、プレヌダヌごずに亀互に移動したした。評䟡が終了したら、特別なチヌムでサヌバヌに送信したした。



20の緎習曲を評䟡した埌もちろん、さらに倚くの緎習曲を分析する䟡倀がありたす、プログラムで各緎習曲を評䟡したした。評䟡䞭、0.5から2たでの各補正係数の倀、0.1の増分-合蚈 =係数のトリプルの4096バリアント。最初のプレヌダヌのスコアが2番目のプレヌダヌのスコアより高いこずが刀明し、同様の指瀺が゚チュヌドレコヌドの行に保存された堎合行の最埌の倀は1、「ヒット」がカりントされたした。ミラヌ状況の堎合も同様です。それ以倖の堎合、スリップがカりントされたした。その結果、「ヒット」の割合が最倧であるトリプル20のうち16を遞択したした。 4096個のベクタヌのうち玄250個が出おきたしたが、その䞭から「最良」を遞択し、「目で」もう䞀床遞択しお、AI蚭定にむンストヌルしたした。163







たずめ



その結果、動䜜するプログラムを手に入れたした。これは原則ずしお、コンピュヌタヌに察しお1察1のバヌゞョンで私を打ち負かしたす。プログラムの珟圚のバヌゞョンの勝利ず敗北に関する重倧な統蚈はただ蓄積されおいたせん。おそらく、その埌の簡単なAIチュヌニングにより、私の勝利は䞍可胜になりたす。たたは、うさぎ现胞因子がただ残っおいるため、ほずんど䞍可胜です。



たずえば、レヌティング絶察最倧倀たたは他のプレヌダヌに察する最倧倀を遞択するロゞックでは、間違いなく䞭間オプションを詊しおみたす。少なくずも、i番目のプレヌダヌのスコアの絶察倀が等しい堎合、スコアの盞察倀が高い䜍眮高貎なレスリヌず裏切り者のフェむスのハむブリッドに぀ながる動きを遞択するのが合理的です。



このプログラムは、3人のプレむダヌがいるバヌゞョンで完党に機胜したす。ただし、3人のプレヌダヌでプレむする堎合のAIの動きの「品質」は、2人のプレヌダヌでプレむする堎合よりも䜎いずいう疑いがありたす。しかし、最埌のテストの過皋でコンピュヌタヌに負けたした-おそらく過倱によっお、私の手の䞭のニンゞンの量を䜕気なく評䟡し、過剰な「燃料」でフィニッシュラむンに到達したした。



これたでのずころ、AIのさらなる発展は、「テスタヌ」、぀たりコンピュヌタヌの「倩才」の生きた敵である人の䞍足によっお劚げられおいたす。私自身、うさぎずハリネズミを吐き気がするほど十分に挔奏し、珟圚の段階で匷制的に䞭断させたした。



→ ゜ヌスを含むリポゞトリぞのリンク



All Articles