「 そんなん どうでもいいんだぜ☆
コネクト・フォーを調べようぜ☆?」
「 ↑ 横7、縦6 の42マスで 上からコインを落としていき、タテ、ヨコ、ナナメに4つ揃えたら勝ちのゲームだな☆
完全解析は終わっているとのことだぜ☆ お互いにミスをしなければ先手必勝☆」
「 〇×ゲームをベースに開発するのと、一から開発するの、どっちが楽だろうか☆?」
「 ケッコウ 違うゲームだから 一から開発した方がいいのでは……☆?」
「 ↑ 全国コネクトフォー協会とか無いのかだぜ☆? 無いなら勝手に進めるが……☆?」
「 ↑ いろいろネットに落ちてるんだが 歴史的に太いのにアクセスできないんで
適当に見つけたやつを真似るか……☆」
[ 1 move(s) | Go X ]
+---+---+---+---+---+---+---+
6 | | | | | | | |
+---+---+---+---+---+---+---+
5 | | | | | | | |
+---+---+---+---+---+---+---+
4 | | | | | | | |
+---+---+---+---+---+---+---+
3 | | | | | | | |
+---+---+---+---+---+---+---+
2 | | | | | | | |
+---+---+---+---+---+---+---+
1 | | | | | | | |
+---+---+---+---+---+---+---+
a b c d e f g
do c
pos
[ 2 move(s) | Go O ]
+---+---+---+---+---+---+---+
6 | | | | | | | |
+---+---+---+---+---+---+---+
5 | | | | | | | |
+---+---+---+---+---+---+---+
4 | | | | | | | |
+---+---+---+---+---+---+---+
3 | | | | | | | |
+---+---+---+---+---+---+---+
2 | | | | | | | |
+---+---+---+---+---+---+---+
1 | | | X | | | | |
+---+---+---+---+---+---+---+
a b c d e f g
「 オッカムのカミソリを使うか、棋譜の見やすさを優先するか……☆? 慣習が分からんぜ☆」
「 重力がなければ ただの4目並べ として遊べるのでは☆?」
「 ↑ 勝利判定は どうやるんだぜ☆? 全方向について 4つの並びがあるのか調べるのかだぜ☆?」
「 それが一番 実装が簡単だと思うぜ☆ 時間かかるけど……☆」
「 ↑ 着色したところを取られたら、その方向では勝てないのよ」
「 深さに上限付けて 全状態ノードを全幅探索する簡単なものでいいんじゃないかだぜ☆?」
「 ↑ 連珠の型を真似よう……、コネクト4に通用するか知らんが……☆」
「 評価関数を作るのは コネクト4 に強いやつじゃないと無理だろ☆」
「 何に価値があるか分からないときは、自己対戦で 強化学習してはどうか☆?」
「 状態をどう表現すんだぜ☆?
Wikipedia によると、 4,531,985,219,092
の状態数があるらしいぜ☆?」
「 機械学習では、 局面は いくつもの特徴に分割して、 特徴量の総和で 局面評価を近似表現するのよ!」
「 ↑ 四目並べるゲームなのだから、ふつうに考えて 列 は特徴だろ……☆
これを評価しないやつは いない……☆」
「 ↑ つら……☆
タテ棒と ヨコ棒は どっちが価値がありそうだぜ☆?」
「 チェスの符号は 筋、段の順だから、筋の方が強いんじゃないの?」
「 バロック・ダイアゴナルと、シニスター・ダイアゴナルは どっちが強そうだぜ☆?」
「 原点が a1 であることを考えると、a1からg6の方に向かって伸びる バロック・ダイアゴナルの方が基準で、
シニスター・ダイアゴナルは バロック・ダイアゴナルに 交差してんじゃないの?」
「 じゃあ 上図のまんまの並びで 連番を振るか……☆
配列の添え字は 0番 からだが、
最近観測する経験からすると 0は零元だろ、ということで 連番は 1 から振るのが 流行りだよな☆」
「 ↑ 列に 番号を振ったんで、これから こいつらは ネームド だぜ☆」
「 コンピューター将棋の三駒関係KKP、KPPの特徴は 1 ~ 48,958,183 よね」
「 コネクト・フォーは 1列関係でいいのか☆? 2列関係、3列関係にしないのか☆?」
「 評価値には 有効桁数 というものがあって、 8 と 9 の違いが分かれば十分なのか、 88 と 89 の違いまで見たいのか、
883 と 884 の違いまで見たいのかは ゲームがどれだけ微妙な戦いにしているかによるんだが、
将棋のストックフィッシュ系でも -30,000 ~ +30,000 の5桁の評価値で 今どきのちからが出せるんだぜ☆」
「 お前ら -9999 ~ 9999 しか見たことないだろうけど☆」
「 ひとまず 1列評価値で作ってみて、それから 判断しましょう」
「 ↑ 〇×ゲームをベースにするんで、〇と×を そのまま 使い回そうぜ☆
海外では ×〇 の順かも知れないが、日本では マルバツ で通りが良いんで……☆」
「 ↑ 数えてみると、7マス、6マス、5マス、4マス の列があるぜ☆
これだけ見ると ヨコで戦いたくなるけどな☆」
「 ↑ むしろ誰が ヨコに並べるかだぜ☆! タテに積んでりゃ 勝ちは無いが負けも無い……☆」
「 ↑ 最後は 入玉模様になって シリンダーに順にコインを詰めていくだけで 勝ち……☆」
「 空マス、マル、バツを3進数になぞらえ、各列の局面数を求め……☆!」
「 これはつまり ヨコ列1本 にも 2187個の特徴があるということなんで……☆」
3^7 * 6 = 13122
3^6 * 11 = 8019
3^5 * 4 = 972
3^4 * 4 = 324
13122 + 8019 + 972 + 324 = 22437
「 22437の特徴のうち、25個の特徴が 1つの盤面に出てるわけだな☆」
「 さて……、評価値の有効桁数は どれほどの長さが良いか……☆?」
「 0~22436の数で序列は付くだろ☆ 5桁で良いのでは☆?」
「 同時に25の特徴しか出てこないのだから 5桁も要らんと思う……☆」
「 千分率か……☆ じゃあ評価値は勝率で、単に整数にして -1000~1000 の 2001段階とするかだぜ☆
25本 総和にすれば ー25000~25000の 50001段階だぜ☆」
「 コネクト・フォーを やってる連中は 12500 と 12501 の違いを争っているのかだぜ☆?」
「 さっきのゲーム、 8×8 だったんで、 わたしがこれから作る 7×6 じゃないんだぜ☆」
「 その大きさで 会員にならなくても遊べる無料の コネクト・フォー を探すのが大変だぜ☆
独りで遊んでみるぜ☆」
「 ↑ d2、e2、f2 に 〇の棒三 ができていて、これでもう ×は c1, g1 に置けないことが確定しただろ☆?」
「 〇は タワー立ててるだけで × が c1,g1 のどちらかに置くしかないことは確定したな☆」
「 無い☆ c列も g列も 潰れてるし、上に伸びるのを 〇が逃すはずがない☆
確実な詰みがある以上、 満局 を目指した引き分けがも原理的に無い☆」
「 ×をタテに積み上げていれば お父んが 見逃すかも……☆」
「 ↑ ×の上に置き、c列と g列に置かないという戦略で 見逃しも無い☆」
「 評価値に 手番 が要るのでは……☆? 特徴の数2倍だぜ☆」
「 ↑ ダメだぜ、c列、g列の どちらに置いても 〇 の負けだぜ……☆」
「 そういえば タテは 重力があるから、 状態数は 3の6乗より 少ないんじゃない?」
000000 有る
000001 有る
000002 有る
000010 無い
000011 有る
000012 有る
000020 無い
000021 有る
000022 有る
000100 無い
000101 無い
000110 無い
000111 有る
001000 無い
「 ↑ つまり こういうことだろ☆ 何この面白空間☆ コネクト・フォーより面白いかも……☆」
「 for ループ回せば一瞬だが、評価値の計算中に 小難しいことは入れたくないぜ☆」
「 ↑ とりあえず 最後まで プレイアウト してみようぜ☆?」
「 ↑ その投了図に出た 25の特徴は 上図の通りで……☆」
「 で、この特徴に 何点を付けるんだぜ☆?
17列目の 特徴202222号 は 何点だぜ☆?」
「 トータルで 25000点なのだから、 25列で割れば 1列当たり 1000点 なのでは☆?」
「 そんな適当に付けたら こっちを立てれば あちらが立たず、になるだろ☆」
「 3進数0000000 から、3進数3333333 までの全ての特徴に点数を付けるには 自己対戦を何回やればいいの?
誕生日のパラドックスを利用して求めなさい?」
「 投了図だけ 点が付いててもダメで、 7×6 の盤の 42 の指し手1つ1つで 点数が付いてて欲しいんだけどな☆」
「 言ってしまえば 0点の初手から、この36手目の100点までの道のりに、少しずつ点数が上がっていくような採点方法を作ればいいわけだぜ☆」
「 評価値とは 勝ち、引き分け、負け が見えていないときに 仕方なく使う 勝ちへの近さを表す数 だということは、
ボンクラーズや ナインデイ・フィーバー がよく知ってるぜ☆
この評価値について、もう少し説明を足そう☆」
「 初手は 7手しかない……、もっと言えば 左右反転すれば実質同じなのだから、
a1
, b1
, c1
, d1
の4つしかないし、
もし 先手必勝 と分かっていれば、上がっていく評価値をたんたんと見ているだけで勝つ☆」
「 もし、このような、どの手を選ぶかに点数が付いているなら 方策(ポリシー) と呼ぶ☆
今回やっているのは 局面評価値(バリュー) なので、指し手には点は付いてないぜ☆」
「 ↑ 数は適当に付けたが、石を置いてみて、その局面の25列の特徴量を全部足したものが 局面評価値だぜ☆
もう少し視覚化すると……☆」
「 ↑ 特徴1個1個に点数が付いていて、その総和が 局面評価値になってるわけだぜ☆
さらに もっと視覚化すると……☆」
「 まだまだ その話に入るのは早いぜ☆ もっと 数 を知ろうぜ☆?」
「 0手目から 36手目までに 0 から 25000 まで増える数は どんな 感じ かという話しだが……☆」
「 694点ずつ 36回 増えていくのが ベスト……、ただし条件があるぜ☆」
「 相手が ヘタクソだったり、わざと負けて たまたま勝ってしまったような 投了図を 省ければ、だぜ☆」
「 都合が良いことに、コネクト・フォーは 石を置いたところの 特徴は 3つか、4つなんで、
その3つか 4つに 694点 増えるような 配点を付けとけばいいんだぜ☆」
「 勝率ベースだと、コインを投げまくるので、そんな風にはならない……☆
詳しく踏み込む前に、ありえない評価値の説明をするぜ☆」
「 ↑ 先手必勝だと 上図のようなグラフになりそうなものだが、局面評価値というものは、こうはならない☆」
「 ↑ 1~4 の4つの数があれば 序列を付けられるので、 評価値4 とかでも 十分足りる☆」
「 ↑ タワーが1つも天井に付いていなければ、次の局面は いつも 7種類あるという 変わったゲームだが……☆
2手目は 28局面あるだろ☆」
「 28個の数があれば 全ての2手目に序列を付けることはできるけど、
それで行くと 42手目の局面の序列を付けるのに使う 数が 膨大になるんじゃないの?」
「 だから 全局面を 全順序で並べるということは しない……☆
しかし そうか、 指し手は たかだか 多くて 7つまでなのか☆ 実現確率探索もできそうだな……☆」
「 ↑ 局面ごとに、7つの手を 何% で 選んだ か、ただ記憶しておくだけだぜ☆」
「 1つの局面は 長さ 22437 の配列で表せるのだから、 7つの指し手の数だけ それを用意すればいいんだぜ☆」
「 すべての局面で ルーレット 回しまくっても ぜんぜん 埋まらないだろ☆」
「 局面評価値(バリュー)より 方策(ポリシー)の方が 簡単に作れそうねぇ」
「 しかし この パーセンテージは 相手が置くところの確率だぜ☆
自分が置くところの確率にするには 28倍要るのでは☆?」
「 前局面から見た相手は、自分のことだぜ☆ 7倍でいける☆」
「 勝率を求めるなら、トライした数と、勝った数の2つがいるのでは☆?」
00,99,100,
「 1 ~ 7 の最小公約数は 420 だぜ☆ 420分率にしろだぜ☆」
「 直近の420回だけ記録するようにして、内部的に 420分率にして 見た目は100分率で表示するかだぜ……☆」
「 左右反転は削ったり 圧縮かけれそうだが 省略で☆
実装は明日からにしようぜ☆」
<次の記事へ>
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!