バックグラウンド
MENACE(M achine E ducable Nは oughts A ND C rosses E ngine)1960年代に英国のコンピュータ科学者ドナルド・ミッチーが作成したゲームNoughtsと十字のための初歩的な浅いの機械学習アルゴリズムです。元々は304個のマッチボックスで実装され、各マッチボックスにはボードの位置がラベル付けされており、色付きのビーズが含まれています(9色のいずれかで、可能な動きを表します)。Michieは、ボード上の動きのあらゆる組み合わせに対して、これらの304個のマッチボックスで十分であると計算しました。
あなたの中のより数学的な人は、実際にはN&Cボード上にNoughts、Cross、Blanksの19,683の可能な組み合わせがあることに気付くかもしれません。しかし、彼はこの数を減らす方法を計算しました(アルゴリズムを高速化し、マッチボックスを減らす可能性が高い!)。最初に、彼は次のような可能性のない動きをすべて削除しました。
-------
|X|0|X|
| |0| |
|X|X| |
-------
(2つのoughtと4つの十字架)
次に、彼は回転を補正しました。たとえば、マッチ箱にある場合:
-------
| |0|0|
|X| |X|
| |0| |
-------
同じ箱を使って
-------
| |X| |
|0| |0|
| |X|0|
-------
したがって、前述の色付きビーズは絶対的な位置ではなく、相対的な位置を表しています。たとえば、赤いビーズが左上を意味すると言った場合、ボックスの上部の画像を見て、次のように表示します。
-------
| |0|0|
|X| |X|
| |0| |
-------
したがって、これがボードである場合、赤いビードは次のことを意味することがわかります。
-------
|R|0|0|
|X| |X|
| |0| |
-------
しかし、これがボードの場合:
-------
| |X| |
|0| |0|
| |X|0|
-------
赤いビーズは
-------
| |X|R|
|0| |0|
| |X|0|
-------
これらの変換は、回転および反転(対角線を含むすべての方向)に適用されます。繰り返しになりますが、この方法で各マッチボックスを保存するだけで済みます。変換ごとに別々の仮想ボックスを作成しないでください!
Michieが行った別の単純化は、コンピューターが最初に行くことを確認することでした。この方法で、彼はすべての第1レベルの移動を削除し、残りの約5分の1のボックスを削除できました。最後に、彼はすべてのゲーム終了ボックスを削除しました(これらのステップでそれ以上の「コンテンツ」や移動は必要ありませんでした)。
右、今アルゴリズム自体に(それは非常に簡単です):
- まず、ビーズの色が何を表すかを決めます。ボード上の各スペースを表すには9色が必要です。
- ゲームの開始時に、304個のマッチボックスのそれぞれにビーズが含まれています。ビーズはランダムな色です(複製は問題ありません)が、移動できるはずです(そのため、ボードの状態の画像が右中央に「O」を描いている場合、中央を表すビーズは使用できません。正しい)。
- MENACEの(X)ターンになるたびに、現在のボード位置(またはその変形)が印刷されたマッチボックスを見つけます。
- マッチ箱を開き、そこにあるビーズをランダムに選択します。
- ボードの状態がどのように変換されてマッチボックスの画像に到達するかを確認します(反時計回りに90度回転します)。次に、その変換をビーズに適用します(左上が左になります)。
- その正方形にXを配置します。選択したビーズをマッチ箱から削除します。その結果、ボックスが空のままになっている場合は、3つのランダムな(可能性のある)ビーズをボックスに入れ、移動のためにそれらの1つを選択します。
- ゲームが終了するまで3〜6を繰り返します。
- MENACEがゲームに勝った場合は、MENACEが取ったすべてのマッチボックスに戻ります。次に、その移動で使用した色のビーズをトレースバックします。その色のビーズの2つをボックスに入れます(元のビーズともう1つがあり、それによってMENACEの可能性が高くなり、次にその位置に移動したときに動きます)
- MENACEがゲームに負けた場合は、何もしません(取り出したビーズを交換しないでください)。
- MENACEがゲームを描いた場合、各ムーブで使用したビーズを交換しますが、余分なビーズを追加しないでください。
これにより、アルゴリズムは非常にシンプルですが、実装が困難になります。これが課題の基礎となります。
まだ混乱している場合は、http://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/を参照してください -このアルゴリズムについて最初に学んだときに読んだものです
チャレンジ
コンピューターで三目並べのゲームをプレイします。各ステップで、すべてのマッチボックスの内容を出力します。
入力
- プログラムの開始時に、MENACEと対戦するゲームの数を示す数字
- 次に、MENACEの最初のターンの後、動きを2文字の文字列として入力します。最初の文字はY軸を指す「L」、「R」、または「M」(左、右、または中央)です。次に、別の文字(もう一度、「L」、「R」、または「M」)を入力します。今回はX軸を参照します。すべての動きとゲームで繰り返します。
出力
- 各新しいゲームの開始時に、「新しいゲーム」を出力します。
- プレーヤーによる各移動の後、適切なフォーマットでボードを出力します。きれいに見える必要はありません(例えば、ボードの位置を表す配列の配列は問題ありません)。
- プレイヤーによる各移動の後、MENACEは移動を行う必要があります。MENACEの移動後にボードを出力します
- 各ゲームの後に、304個すべてのマッチボックスの内容を出力します。ビーズは、文字、色の名前、文字、または任意の文字列または整数で表すことができます(ポインター、匿名関数などはありません)。
ルール
- これはcode-golfであるため、バイト単位の最短回答が優先されます。
- MENACEの応答を見た後、動きを入力できる必要があります。「すべての動きをこの機能に渡して、ゲームがどのようにプレイされるかを見る」ことはできません。
- ボードはゲーム間でクリアする必要があります。
- ゲーム間でマッチボックスをクリアしてはいけません(これにより機械学習がリセットされます)
- 304個のマッチボックスが必要です。誰でもこのアルゴリズムを19,683個のすべてのマッチボックスで実装できますが、学習には時間がかかります(すべてのマッチボックスを使用するには、多くのゲームが必要です)。
- 出力は任意の妥当な形式にすることができ、PPCG標準に従って入力を取得できます(ルール2に準拠している限り)。(「入力」セクションで説明されているように)入力形式を調整する必要がある場合は、意味があれば問題ありません。
- ゲームは、プレイヤーが勝つ(斜め、水平、または垂直に3つ連続して)または引き分けがある(ボードがいっぱいで勝者がいない)ときに終了します
- MENACEは可能な移動を行う必要があります(各マッチボックス内に可能なビーズのみがあります)が、チャレンジのために、ユーザーの入力を検証する必要はありません。間違ったタイプを入力した場合、プログラムは何でもできます(完全にクレイジーになり、エラーをスローするなど)。入力が正しいと想定できます。
[[0, 2, 6], [4, 8, 4, 3, 3], [7, 7, 7, 7, 7, 7, 7, 8], [1], ... [3, 3, 5, 4]]
。