「NP完全問題のリスト」に関するウィキペディアのエントリを読んだところ、スーパーマリオ、ポケモン、テトリス、キャンディクラッシュサガなどのゲームがnp完全であることがわかりました。ゲームのNP完全性をどのように想像できますか?回答はあまり正確である必要はありません。ゲームがnp-completeになり得るということの概要を知りたいだけです。
「NP完全問題のリスト」に関するウィキペディアのエントリを読んだところ、スーパーマリオ、ポケモン、テトリス、キャンディクラッシュサガなどのゲームがnp完全であることがわかりました。ゲームのNP完全性をどのように想像できますか?回答はあまり正確である必要はありません。ゲームがnp-completeになり得るということの概要を知りたいだけです。
回答:
NP-Hard問題をエンコードするこれらのゲーム内でレベルまたはパズルを作成できることを意味します。グラフの色付けの問題を取り、関連するスーパーマリオブラザーズレベルを作成できます。そのレベルは、グラフが3色付け可能な場合にのみ使用できます。
NP完全問題のゲームへの具体的な変換方法を確認したい場合は、「クラシックニンテンドーゲームは(計算上)難しい」というペーパーをお勧めします。よく書かれており、簡単に理解できます。
念頭に置いておくべき重要な注意点は、NPの難しさからゲームを「明白な」方法で一般化する必要があるということです。たとえば、テトリスには通常、固定サイズのボードがありますが、硬度を証明するには、ゲームで任意の大きなボードを許可する必要があります。別の例は、スーパーマリオブラザーズのオフスクリーンの敵です:証拠は、オフスクリーンの敵が存在するのをやめ、マリオが戻ったときに開始位置にリセットされるのではなく、画面上にあるかのように動き続けるゲームのバリアントです。
単純な手振りの説明は次のとおりです。
このようなゲームは、プレイヤーの行動が非常に表現力豊かであるため、NP困難です。どの時点でも、プレーヤーは限られた、固定された、可能な数のアクションしか持てないかもしれませんが、それはゲームの長さで指数関数的な行動または戦略の空間を作成するのに十分です。また、ローカルでプレイヤーのアクションの有効性/利点/正確性に関する単純な条件または論理式を提供できる場合もありますが、大規模な組み合わせ回路またはk-CNF式と同様の効果がグローバルに得られます。
うまくいけば、これは直感的に理解でき、CS理論の鐘を鳴らすこともできます。
PS-一部のゲームは、それよりもはるかに(計算上)複雑です。たとえば、ボードゲームのHex、Go、およびReversiはPSPACEに完全です。それは基本的に、勝利戦略のために満たす必要がある式が繰り返し交互量化式であるためです:プレーヤー1による動きが存在するため、プレーヤー2による動きごとに、プレーヤー1による動きなどが存在します。これらすべての動きがプレイされたため、プレイヤー2の動きの一部が無効であるか、プレイヤー1が勝った有効なシーケンスがあります。NPゲームでは、通常、1人のプレイヤーの行動/戦略/動きの選択にすぎません。
シングルプレイヤーゲームの場合、「プレイヤーの勝ち戦略はありますか?」という質問をいつでも行うことができます。その質問には、多項式時間で検証できる「はい」の回答があります。
2人用のゲームの場合、Aの動きが勝者の動きであることを検証するには、Bのすべての応答に対してAの勝者の動きが再び存在することを実証する必要があるため、答えを多項式時間で検証することはできません。など。
それは確かにNPにあります、可能な解決策は有限数の入力であるためです(各入力フレームでkボタンのいずれかを選択でき、各フレームのボタンの各選択を文字で表します)勝利画面。このゲームは以前に破られたことがあるので、解決策があることを知っています。NTMはテープを調べ、長さnの正しい証明書を魔法のように推測します。次に、入力を使用してスーパーマリオをシミュレートし、検証します。検証は多項式時間で実行できます(実際には線形時間、解が正しければ、勝つには正確にnフレームかかります)。
NP完全性を示すために、レベルジェネレーター(任意のコード実行https://www.youtube.com/watch?v=IOsvuEA2h4w)で3-Satチェッカーを構築することにより、3-SATを削減できます。
したがって、最初に正しいフォーマットをチェックする3-SAT CNF入力があります。フォーマットが不適切な場合は、それを1つの「ジャンプ」入力に変換するだけです(ジャンプを実行して1フレーム内でスーパーマリオを倒すことはできません)。
3-CNF入力の長さをnと呼びます。
正しくフォーマットされている場合、それをいくつかの入力に変換し、3-CNFチェッカーを作成します(常に同じ長さkのコード)、3-CNFを入力の文字列に変換し、特定の3-チェッカー内のCNF(O(n)内)、および総当たりによるすべての可能なソリューションをチェックします。すべてのソリューションを通過しても何も見つからない場合、アイドル状態になり、何も実行されません。ゲームを再起動し、Super Marioの既知のソリューションを使用してゲームに勝ちます(実行するコードの長さはjです)。したがって、変換はO(n)で行われるため、多項式時間内になります。
CNFのフォーマットが不適切な場合、勝ちません(定義により、実行後に1フレームも勝っていない場合、入力は勝っていません)。CNFが満足できない場合、私たちは勝ちません(レベルジェネレーターで1フレームのアイドリングによって勝つことはできません。コードでそれを保証しました)。CNFが満足できる場合、チェッカーはソリューションが再起動し、ゲームに勝ったことを見つけます。したがって、3-Satからスーパーマリオへの多項式簡約は完了しており、スーパーマリオがNP完全であることを証明しました。
(私はどこかでこれを台無しにしないでください。3-CNFが長すぎる場合、ストレージの問題に遭遇しますが、これらのコンテキストでは通常、限られたストレージは無視されます)
この回答を書き直して、以前のバージョンに関するいくつかのコメントに対処しようとしました。
私はあなたが本当にゲームに焦点を合わせていないNP完全性の Wikipedia定義を読んだと思います。NP完全性とゲーム理論の正確な意味を少し掘り下げ、NP完全ゲームの本質を説明します。
交互に移動する2人用のゲームを考えてみましょう。これは、より限定的に、本質的には組み合わせゲームに関するものです。基本的には、いくつかの動きがあり、そのうちの1つを選択する必要があるゲームです。「完璧に」プレイしたい場合、つまり「悪い」動きは決してしないでしょう。許容される動きのうち、最適なものを選択します。(もちろん、相手も同じ目標を持っています...)
完璧なプレーは、常に勝つという意味ではないことに注意してください。ゲームのルールは、最初または2番目のプレイヤーが勝つようなものです。また、三目並べのようないくつかのゲームは引き分けで終了する必要があります。したがって、この議論では、「完璧な遊び」とは何である:
(1)あなたは勝利の位置にありませんし、あなたが「悪い」移動作っているため、ゲームを失うだろうということ
(2)あなたが取得する機会を逃すことは決してないだろうしそのような機会が生じた場合、勝利の位置に。
ゲームの現在の状態を考えると、「効率的なアルゴリズム」を使用して最適な動きを計算できるようになります。一方、ゲームツリー全体を検索する必要があるアルゴリズムは「非効率的なアルゴリズム」であることに注意してください。
ここで重要な点は、NP完全なゲームに最適な、効率的なアルゴリズムである多項式時間を持つことは不可能であることです。NP完全問題を完全に再生するには、定義上、非多項式時間で実行される非効率的なアルゴリズムによって解決する必要があります。
実行時間は、人間が知覚する応答時間ではなく、計算の本質的な数であることに注意してください。Tic-Tac-Toeのような小さなゲームの場合、コンピューターはすべての可能な将来の動きをプレイでき、それでも人間の知覚どおりにすばやく応答できます。
ニム多項式時間アルゴリズムを作成することが可能です。ゲームの任意の時点で、アルゴリズムはどのプレイヤーが勝ちの動きを持ち、その動きがどうあるべきかを計算できます。
一方、Qubicのゲームを見てみましょう。(3Dグリッドで4行の線を作成しようとしています。4x4x4グリッドでは基本的に三目並べです。)QubicはNP完全であるため、次の完全な動きを計算する多項式時間アルゴリズムはありません。現在勝ち取っている動きがあるかどうかを知る唯一の方法は、特定の動きが勝者であるか、少なくとも敗者ではないことを確認するために、両方のプレーヤーの可能なすべての動きを試すことです。
正直なところ、Qubicのゲームツリー全体は十分に小さいため、完全にプレイできるコンピュータープログラムにエンコードできます。エンコーディングの意味は、ゲームツリー全体が調査され、すべての動きが事前に解決されたことです。したがって、プログラムは基本的に、現在のボード状態を使用して迅速なデータベース呼び出しを実行し、移動が行われるたびにツリー検索を行うことなく、そのボード状態に最適な移動を取り戻すことができます。これは、ここでの目的にとっては本当に「チート」です。
次に、チェスについて説明し、チェスをプレイするプログラムの他の機能のいくつかを無視した評価関数について説明します。チェスはまだ未解決のゲームです。最初のプレイヤーと2番目のプレイヤーのどちらが勝つかは不明です。ボードのポジションを与えられ、誰が勝つかを確実に予測することはできません。実際、チェスには非常に大きなゲームツリーがあり、ゲームツリー全体を検索することは不可能です。必要なのは、現在のどのコンピューターよりも10倍または100倍速いだけでなく、数十億倍も速いコンピューターです。(量子コンピューティングがこのゴーディアンノットを突破できる可能性があります。)
チェスの評価関数は、考えられるそれぞれの次の動きに最高の動きである確率を与えると考えてください。チェスプログラムが行うのは、先読み機能と評価機能を組み合わせることです。したがって、プログラムは、ボードの位置に「良い」スコアを与えることができるポイントに到達するまで、すべての可能な将来の動きを調べます。コンピューターは、この方法でツリーを通るすべての可能なパスを評価し、最高のスコアを持つパスを選択します。検索は評価されるすべてのパスについてゲームの終わりに到達することはなかったため、すべてのチェスプログラムは最終的に不完全な評価関数を使用します。(ゲームの終わり近くにいる場合、コンピューターは将来のすべての可能な動きを見ることができるかもしれません。)それは、ある時点でプログラムが勝ちポジションを持っていたとしても、プログラムを破ることができるかもしれないことを意味します。