チェスのようなAIは、ターンベースの戦略ゲームでは本当に適用できませんか?


13

明らかに、移動の完全なツリーにmin-maxアルゴリズムを適用しようとすると、小さなゲームにしか機能しません(すべてのチェス愛好家に謝罪します。ボードが多くの場合100タイルより広く、サイドのすべてのピースが同時に移動できる典型的なターンベースの戦略ゲームでは、min-maxアルゴリズムは適用できません。

各深さでNボード構成に制限する部分的な最小-最大アルゴリズムでは十分ではないのではないかと思っていましたか?遺伝的アルゴリズムを使用すると、評価機能に適した多くのボード構成を見つけることができる場合があります。願わくば、これらの構成が長期的な目標に適していることを願っています。

これが以前に考えられていなかったなら、私は驚いたでしょう、そして、試みました。ありますか?どのように機能しますか?


1
Collaborative Diffusionを試すことができます。値をグリッドに拡散し、敵がグリッドを山登りします。少なくとも経路探索には有効です。より多くの値を拡散(別々に?)し、より洗練された山登り(複数の値に基づいて次に進むべき場所を選択)を行った場合...
user712092

何についてのアルファベータPrunning?min-maxのより良いバージョンです。
user712092

Alpha-Beta Prunningは、一種の最小値と見なされます。
Joh

はい、そうです。しかし、それはもっと速いはずです。あなたに役立つかどうかわからない
...-user712092

私はその考えをあきらめました。私は、さまざまなイベントにどのように反応するかについての具体的な指示の代わりに制約を使用する「ゆるい」スクリプトAIに傾いています。GAまたはその他の最適化アルゴリズムが適切にスマートな動作を提供できることを期待しています。
ジョー

回答:


5

それはゲームの仕組みに依存します。ゲームツリーmin-maxは全体的には適用できない場合がありますが、一部の領域では適用される可能性があります。地図上の一部の場所は戦略的に重要であることが一般的です。Min-maxは、これらの場所のいずれを制御するかについて戦略的なレベルで適用される場合があります。戦術的なレベルでは、各戦略的位置の周りのxの正方形について、min-maxを使用して、ユニットがそれをキャプチャして防御する方法を決定することができます。


9

これはミニマックスアルゴリズムではありませんが、Killzone AIの責任者は、一部のチェスAIも使用する位置評価関数に基づいて論文をリリースしました。

エージェントの現在の知識に基づいてボード上のポジションを選択するだけなので、非常に簡単です。そのため、エージェントの健康状態が低い場合、敵の範囲外にいることが望ましいため、敵から遠く離れた位置ほど高いスコアが与えられます。

この論文はAI Game Programming Wisdom 3にあり、Dynamic Tactical Position Evaluationというタイトルが付いています。

論文の草案は、オンラインでこちらで見つけることができます:http :
//www.cgf-ai.com/docs/straatman_remco_killzone_ai.pdf

お役に立てば幸いです。


2

十分だとは思いません。特定のN構成、いくつ、どの構成を選択するかは、複雑なものでは事実上不可能です。ゲームが無限のリソースまたは同様のものを備えている場合、そのプレイ方法に円があり、そのようなAIの悪用を比較的容易にする可能性があることに注意してください。


2

少なくとも、アルファベータプルーニングで最小最大を実装することをお勧めします。

それを試して決定することは実用的ではありません(つまり、ひどいパフォーマンス)。また、ゲームメカニクスの背景がなければ、min-maxが適用できないと思う理由がわかりません。

ボードのサイズは問題になる可能性がありますが、プルーニングでは、失われたパスウェイを破棄することで、同じ計算量でより深い検索が可能になるため、プルーニングした場合、ボードの面積が大きくなることはおそらくないでしょうか?さらに、ボードのサイズ自体が問題であると仮定すると、ボードのサイズではなく、メカニックの複雑さや各ボードの位置から何回の動きが可能かということです。ゲームの領域が大きくてもまばらにある場合、各ボードの状態からの可能な移動の数は、ボードがすべてのピースを収めるのに十分な大きさである場合とそれほど変わらない可能性があります。もちろん、90%満杯の巨大なボードがあり、すべてのターンであらゆる場所を移動できる場合、多くの検索が必要になります。

また、同時移動が本質的に問題である理由もわかりません。ある控えめなボードの状態から別のボードの状態に移行し、評価機能を備えている限り、アルゴリズムを適用する必要があります。

とにかく評価関数が必要であり、使用する検索に関係なく、評価関数はほとんどの作業が行われる場所です。プルーニングを伴うmin-maxアルゴリズムの実装は非常に簡単で、おそらく1〜2時間で実行できます。また、ボードステートストレージ、評価、移動生成などのインフラストラクチャ作業の多くは、あなたが解決する検索。


同時移動に関して:チェスなどのターンベースのゲームを使用して通常説明されるmin-maxを同時移動の場合に転置する方法は、最初は見ませんでした。私はそれを行う方法を見始めていると思いますが、それは些細なことではありません。
ジョー

私の投稿であなたの同時移動の問題に対する解決策を示しました(「各位置での移動可能」という見出し)。これを処理するには、反復ごとに1つの移動だけを行い、明示的な「今、ターンを終了します」という動きを組み合わせて、相手にターンを与えます。これにより、中間のアルファベータプルーニングにより、これらの同時移動の複雑さが解消されます。
SDwarfs

1

2011年のGoogle AIチャレンジの勝者は(深さ1の)min-maxを使用しました。別のトップの出場者はランダムサンプリングを使用しました。この出場者は、基本的に私の質問で説明したmin-maxサンプリングとランダムサンプリングの組み合わせのパフォーマンスが悪いと述べました。これで解決します。

一方、大規模なゲームではmin-maxを使用できることを示しています。しかし、それを小さなアリのグループに限定する必要があり、すべてのアリの完全なセットでの作業はおそらく遅すぎるでしょう。別の興味深い観察結果は、深さ1で十分だったことです。私たち(人間)はチェスをするのがかなり上手になりました。このゲームのAIが挑戦するには、より深い検索ツリーが必要です。新しい、より複雑なゲームはこれまであまりプレイされたり研究されたりしておらず、だまされやすいAIには十分なエンターテイメント価値があるかもしれません。


1

チェスAIの基本的な考え方は、現在推定されている最高の動きから考えられるすべての動きのリストを作成し、それらを評価してプロセスを繰り返すことです。彼らは奪われないので、チャンスが少なすぎる人を落とします(または、有利に見えないので、奪われないと仮定することができます)。

基本的な考え方では、可能なすべての動きのリストを作成し、それらすべての動きなどについてそのプロセスを繰り返す必要があります。 )そして、バックギャモン、チェッカー、ルービックキューブの解法など、他の事柄ま​​でのポイントまで。

例として単純なターンベースのゲーム(Civilization 2)を例にとると、各自は1ターンで合計8マス(または24マス)に移動できます。10人(あまり多くはありませんが、通常は少し面白くなるまでにさらに多くの人がいます)現在の状態(つまり単一レベル)からの可能な「移動」の総数は既に8 ^ 10ですまたは約40億。それらの99.99%を剪定しても、可能な動きの数が非常に急速に爆発するため、ツリーの奥深くに進むことはできません。

それに加えて、ゲームはルービックキューブの問題に少し似ており、10または12の動きがあった後にのみ進行が見られます。この問題は、標準の最小/最大の利点がメモリ容量でのみ普及する点まで爆発します通常のコンピューターよりも多くなります。

言い換えれば、それが見つける戦略は再現可能ですが、悪いでしょう。

実際の問題、まともなAIの作成方法については、基本的にステアリングされたランダムな動き(各人を少し基本的な知性で動かす)、評価、調整の方向に進みます。これを100または1000の異なるものに対して並行して行い、最終的に最良のものを選択します。この結果を元のインテリジェントステアリングにフィードバックして、再度調整することができます。モンテカルロシミュレーションに少し似ています。


0

ターンベースの戦略ゲームに最小/最大を正常に適用するには、利用可能なすべてのチェステクニックを正しく適用する必要があります...

評価関数

評価機能が悪いと、チェスエンジンの強度も非常に悪くなります。評価関数の最も単純なバージョンは次のとおりです。1=白で勝ったゲーム、-1 =黒で勝ったゲーム、0 =その他のすべてのケース。しかし、これは非常に悪いパフォーマンスをもたらします。ターンベースのゲームでも同じことが起こります!チェスのように最小/最大(アルファ/ベータプルーニングなど)を使用する場合は、妥当な評価関数も実装する必要があります!それ以外の場合、戦略ゲームに適用される場合のアルゴリズムのパフォーマンスをチェスに適用される場合と比較することはできません。

チェスエンジンの評価関数が行うことは、次のようなものを評価することです。

  • ボード上のピースの位置はどれくらいですか?
  • ピースは何回攻撃されますか?
  • 作品は何回保護されていますか?
  • 各ピースはボード上で自由に「移動」できますか?(または:「制御」するタイルの数)

評価関数のこれらの部分は、最初にゲームに「翻訳」する必要があります。

  • ピースの位置:例えば、射撃範囲を広げている丘の上にありますか?
  • 攻撃された:各ピースはどれだけ危険にさらされていますか?(例えば、特殊ユニットを攻撃できるユニットの攻撃値の合計に、それによって攻撃される確率を掛けた。ユニットが既に損傷している場合は確率が増加し、他の多くのユニットが攻撃ユニットの範囲内にある場合は減少する)
  • 自力攻撃:この各ユニットはいくつのユニットを攻撃できますか?
  • 保護:隣にどれだけのピースがありますか(支援のため)?ユニットは最短距離でユニットを攻撃することはできず、近くのユニットを攻撃する可能性があるユニットで保護することが望ましいかもしれません。
  • モビリティ:ユニットのモバイル性はどのくらいですか?(逃げることができますか?)

異なる評価は、すべてのユニットの重み関数(factor_a * rating_a + factor_b * ranting_b + ...)によって合計する必要があります...

戦略ゲームでは、残っているリソース(金、木、...)も考慮する必要があります。

評価関数が十分であれば、ほとんどの場合、実際にツリーを「深く」検索する必要はありません。したがって、おそらく、最も有望な3つまたは10の選択肢を詳しく調べるだけで十分です。次の章を参照してください...

各位置で可能な動き

戦略ゲームで最小/最大を使用することで最も問題なのは、1ターンで複数のユニットを指揮できることです。一方、チェスでは1つのユニットしか指揮できません(キャスリングを除きますが、これは明確に定義された移動の組み合わせです)。これにより、各ユニットの「北、南、西、東、または停止の移動」のみを決定する場合、各「位置」(チェス用語)のNユニットに対して5 ^ Nの移動が可能になります。複雑なコマンドを低レベルのコマンドに分解することでこれを解決できます。たとえば、ユニットAのアクションを選択し、深さに入り、ユニットBを決定します。...ユニットNを決定し、このターンを終了します。しかし、これだけでは複雑さは変わりません!アクションがユニットに割り当てられる順序を最適化する必要があります(たとえば、最初のユニットB、C、D、次にユニットA)。最後の計算中に各ユニットの決定の影響を記録し、重要度で並べ替えることができます。この方法では、アルファベータプルーニングを使用して、検索ツリーから不適切な組み合わせを非常に早期に削除できます。最高の優先順位は、各反復で常に「これ以上何もせずにあなたのターンを終了する」(ヌル移動プルーニング)でなければなりません。これにより、ほとんどのタスクをほとんどのユニットに「スキップ」して、前のタスクをそのまま続行できます。このように、「重要な」ユニット(たとえば、現在実際に戦闘中のユニット)を見るだけで、検索はすぐに深くなります。各ユニットを1回だけコマンドするようにしてください...また、「重要な」ユニットが時々コマンドを取得していることを確認するために、ランダム性を使用することもできます。特に、いくつかの仕事を終えたユニット(例

反復深化+キャッシュ/ハッシュテーブル

その後、「インタラクティブな深化」を行って、制限時間に達するまでますます深くなることができます。したがって、ユニットが少ない場合はより深く検索し、より良いソリューションの検索を停止すると、常に「結果」が得られます。繰り返し深化するには、ハッシュテーブルを使用して、以前の検索結果をキャッシュする必要があります。これにより、最後のターンの検索(最後のターンで実際に実行されたコマンドをカバーする検索ツリーのブランチ)の結果の一部を再利用することもできます。これを実装するには、繰り返し更新可能な非常に優れたハッシュ関数(「zobristキー」を参照)が必要です。ハッシュキーを更新するということは、古い「位置」のハッシュキーを取得するだけで、位置の変更をすぐに開始できることを意味します(例:位置xのユニットを取り出し、位置y)に配置します。この方法でハッシュキーを計算するのは簡単で、ボード全体の状況を処理して計算する必要はありません。ハッシュにこの位置の以前のエントリが含まれているかどうかを確認するだけです。ある意味では、ハッシュの衝突が発生しないことを確認する必要があります。

非決定的な動作

非決定的動作は、最小/最大検索の問題です。つまり、攻撃されたターゲットにヒットするかどうかはわかりません(たとえば、確率は10%です)。その後、あなたはこれが起こるだけで計画することはできません。その場合、アルゴリズムを変更して、間に「確率」層を配置する必要があります。「確率が変わる」ようなものです。それぞれの独立した結果は別々に考慮しなければなりません。この深さの「レイヤー」を介した評価をサンプリングし(モンテカルロサンプリング)、詳細な評価の結果を発生確率で重み付けする必要があります。確率層の異なる結果は、異なる敵の動きとみなされる必要があります(ただし、最小/最大の代わりに「平均」を計算する必要があります)。もちろん、これにより検索ツリーの複雑さが増します。

概要

これらのすべての手法(現在のチェスエンジンで使用されているすべて)を決定論的なゲームに適用すると、ゲームでも合理的な結果を確実に達成できます。非決定的ゲームの場合、これはおそらくより複雑になりますが、まだ管理しやすいと思います。

これらの手法(チェスの場合)の説明に役立つリソースは、http://chessprogramming.wikispaces.com/です。

最小/最大検索である種の有向ランダム性を実装することもできます。各反復で最初に最良の結果を決定論的に調査する代わりに、これをランダム化し、現在の評価に基づいた確率分布によって順序を決定することができます...

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