<前回の記事のからの続き>
「 人間の頭には 短期記憶と 長期記憶があんのよ!
復習しましょう!」
From engine:
Kifuwarabe's connect four
-------------------------
From you:
uxi connect-four v20200823
From engine:
uxiok
From you:
isready
From engine:
readyok
From you:
uxinewgame
From you:
pos
From engine:
[ Next 1 piece(s) | Go O ]
+---+---+---+---+---+---+---+
6 | | | | | | | |
+---+---+---+---+---+---+---+
5 | | | | | | | |
+---+---+---+---+---+---+---+
4 | | | | | | | |
+---+---+---+---+---+---+---+
3 | | | | | | | |
+---+---+---+---+---+---+---+
2 | | | | | | | |
+---+---+---+---+---+---+---+
1 | | | | | | | |
+---+---+---+---+---+---+---+
a b c d e f g
From you:
do d
pos
From engine:
[ Next 2 piece(s) | Go X ]
+---+---+---+---+---+---+---+
6 | | | | | | | |
+---+---+---+---+---+---+---+
5 | | | | | | | |
+---+---+---+---+---+---+---+
4 | | | | | | | |
+---+---+---+---+---+---+---+
3 | | | | | | | |
+---+---+---+---+---+---+---+
2 | | | | | | | |
+---+---+---+---+---+---+---+
1 | | | | O | | | |
+---+---+---+---+---+---+---+
a b c d e f g
From you:
do c
pos
From engine:
[ Next 3 piece(s) | Go O ]
+---+---+---+---+---+---+---+
6 | | | | | | | |
+---+---+---+---+---+---+---+
5 | | | | | | | |
+---+---+---+---+---+---+---+
4 | | | | | | | |
+---+---+---+---+---+---+---+
3 | | | | | | | |
+---+---+---+---+---+---+---+
2 | | | | | | | |
+---+---+---+---+---+---+---+
1 | | | X | O | | | |
+---+---+---+---+---+---+---+
a b c d e f g
From you:
xfen
From engine:
xfen 7/7/7/7/7/7 O moves d c
From you:
position xfen 7/7/7/7/7/2XO3 O
From you:
pos
From engine:
[ Next 3 piece(s) | Go O ]
+---+---+---+---+---+---+---+
6 | | | | | | | |
+---+---+---+---+---+---+---+
5 | | | | | | | |
+---+---+---+---+---+---+---+
4 | | | | | | | |
+---+---+---+---+---+---+---+
3 | | | | | | | |
+---+---+---+---+---+---+---+
2 | | | | | | | |
+---+---+---+---+---+---+---+
1 | | | X | O | | | |
+---+---+---+---+---+---+---+
a b c d e f g
From you:
undo
pos
From engine:
[ Next 2 piece(s) | Go X ]
+---+---+---+---+---+---+---+
6 | | | | | | | |
+---+---+---+---+---+---+---+
5 | | | | | | | |
+---+---+---+---+---+---+---+
4 | | | | | | | |
+---+---+---+---+---+---+---+
3 | | | | | | | |
+---+---+---+---+---+---+---+
2 | | | | | | | |
+---+---+---+---+---+---+---+
1 | | | | O | | | |
+---+---+---+---+---+---+---+
a b c d e f g
From you:
go
「 ↑ コンピューターに考えさせるのは go
を使う☆
持ち時間も指定できるようにすべきだが、実装が大変なので今は省くぜ☆」
From engine:
bestmove c
「 ↑ コンピューターの推測する最善手が c なら、 bestmove c
だぜ☆
投了したけりゃ bestmove resign
でいいだろう☆」
「 それだとつまんないんで、先手で、もう満局してるときだけ投了しろだぜ☆」
From you:
quit
「 これで実装に進めそうなんだが、いい設計ツールがないよな」
info json { "nps":999999, "nodes":999999, "push":"a", "pieces":42, "leaf":true, "result":"draw", "O":"Hooray!", "pv":["a","b","c","d","e","f","g","a","b","c","d","e","f","g","a","b","c","d","e","f","g","a","b","c","d","e","f","g","a","b","c","d","e","f","g","a","b","c","d","e","f","g"] }
+---+---+---+---+---+---+---+
6 | 0 | 1 | 2 | | | | |
+---+---+---+---+---+---+---+
5 | 7 | 8 | 9 | | | | |
+---+---+---+---+---+---+---+
4 | | | | | | | |
+---+---+---+---+---+---+---+
3 | | | | | | | |
+---+---+---+---+---+---+---+
2 | | | | |32 |33 |34 |
+---+---+---+---+---+---+---+
1 | | | | |39 |40 |41 |
+---+---+---+---+---+---+---+
a b c d e f g
「 ↑ めんどくさいんで 間抜け をするが、 7 を足せば 下隣の番地が分かるぜ☆
下隣に石が無ければ落ちろだぜ☆ 番地が 42 未満の間続けろだぜ☆」
「 4つ並んだかどうかの判定は、どうプログラムするんだぜ☆?」
「 4つ並べない列を消去していく消去法でも使えば 無駄も減ると思うが、めんどくさいんで
全部調べたらどうだぜ☆?」
+---+---+---+---+---+---+---+
6 | | | | 3 | 4 | 5 | 6 |
+---+---+---+---+---+---+---+
5 | | | | | | |13 |
+---+---+---+---+---+---+---+
4 | | | | | | |20 |
+---+---+---+---+---+---+---+
3 |21 | | | | | | |
+---+---+---+---+---+---+---+
2 |28 | | | | | | |
+---+---+---+---+---+---+---+
1 |35 |36 |37 |38 | | | |
+---+---+---+---+---+---+---+
a b c d e f g
[(3, 21), (4, 28), (5,35), (6, 36), (13,37), (20, 38)]
+---+---+---+---+---+---+---+
6 | 0 | 1 | 2 | 3 | | | |
+---+---+---+---+---+---+---+
5 | 7 | | | | | | |
+---+---+---+---+---+---+---+
4 |14 | | | | | | |
+---+---+---+---+---+---+---+
3 | | | | | | |27 |
+---+---+---+---+---+---+---+
2 | | | | | | |34 |
+---+---+---+---+---+---+---+
1 | | | |38 |39 |40 |41 |
+---+---+---+---+---+---+---+
a b c d e f g
「 ↑ シニスター・ダイアゴナルはこうな☆ ステップは 8 ☆」
「 始点と終端のペアより、始点と反復回数のペアの方が嬉しくない?」
[(14,1), (7,2), (0,3), (1, 3), (2, 2), (3, 1)]
「 この数が何を意味するのかコメント書くのがめんどくさいが……☆」
「 読み無し、局面評価無しの、ポリシーのみ、実現確率探索にしようと思うぜ☆」
「 ↑ フィーチャーは25個☆
これらは 掛け合わせるのではなく、25個の部分点があるとみなして、総和することとするぜ☆」
3^7 * 6 = 13122
3^6 * 11 = 8019
3^5 * 4 = 972
3^4 * 4 = 324
13122 + 8019 + 972 + 324 = 22437
「 ↑ 以前調べたところ、配列のサイズは 22437 で収まるのが分かったぜ☆」
「 ↑ その配列には、指し手の評価値の部分点が入っているわけだぜ☆」
「 ↑ 特徴25 が 0種 のとき 1点引く、 というのは 適当だろうか☆?」
「 ↑ 特徴25 とは ほとんど関係ないところで 勝負は決まるんじゃないの?
特徴25 の 0種 の評価なんかに 引っ張られていいの?」
「 特徴25の0種 は 小さい評価値部分点であってほしいよな☆」
「 ↑ 特徴1の13種で手番が ○ のとき、評価値を最大にしてほしいのよ」
「 特徴25の0種 と、 特徴1の13種 は、 どっちが価値に貢献してるんだぜ☆?」
「 ↑ リーチが掛かってるのは 特徴1 の上の a4 なんだから」
「 その特徴は リーチが掛かっている、というのが 意義 か……☆」
「 じゃあ 特徴1の13種 の評価値部分点を 1 増やしたいが、この 1 は どこから持ってくるんだぜ☆?
何も無いところから 1 持ってくると、ゼロ和 でなくなる☆ インフレするぜ☆」
「 ↑ 特徴1が13種のとき、指し手aは100%、 指し手b~gは0% だったらいいんだろ☆?」
「 じゃあ 部分点が100点 というのは 原理的に存在できなくて、せいぜい最大 50点 かだぜ☆」
「 セプタプル(7重)リーチ の存在を考えると 60点が最大値かしらねぇ?」
「 そんな図形を考えることは困難……☆ ナン(none)・ケース☆」
「 答えが分かっていて、その過程が分からない、それを 代数 という☆ 3=x+1 ☆」
「 25の特徴について、シングル・リーチ、ダブル・リーチの有無をすべて調べるしか なくない?」
「 ↑ ヨコは シングル・リーチ か、ダブル・リーチ があるのよ」
「 ↑ ナナメも、 シングル・リーチ か、ダブル・リーチ があるわね。 めんどくさいから 描かないけど」
「 すべてのリーチ局面で、次の指し手に ただしく 割合を割り振れるのだろうか☆?」
「 ピッタリいくか、近似か、いつまでも終わらないかの いずれかだろうな☆
機械学習やるなら 近似で十分☆」
「 列だけみると リーチ に見えても、石の積み方 によって
まだ リーチではないケース、
リーチのケース、
もう リーチにはならないケース
の3つがあるよな☆」
「 ↑ そして 必ずしも そのリーチを使わずとも、
他のところで リーチが起こる可能性を消すことはできないぜ☆」
「 ↑ まあ、4軸の焦点でなければ 100% か 0% か、確定しないよな☆」
「 100% か 0% か判定できるときには 評価関数なんか要らないのよ。
100% と 0% の間を評価してほしいのよ」
「 その間を 50%、 75%と25%、 87.5%と62.5%と37.5%と12.5%……、
のように 密度を持ってほしいよな☆」
「 成分特徴を調べるのが めんどくさいな……☆ 1つ1つ やるしかないか……☆」
「 7x6 の盤でこれだけ大変なら、 15x15 の連珠盤は とても人力では無理だな☆」
「 どの局面を取っても 投了を含む8つの指し手の合計が 840 にするには、どうやったらいいんだぜ☆?」
「 特徴が4つ重なってるマスと、特徴が2つしか重なってないマスがあるわよね」
255 / 8 = 31 … 7
「 じゃあ単純に 特徴は 初期値で30……は通過が溢れるか、25点持っていて、これを どんどん 移動していくことにするかだぜ☆
変域は 0 から 255 ☆」
「 特に方法はない☆ 平らに均(なら)して 適当に指せだぜ☆」
「 勝ち評価値と、引き分け評価値の切り替えは どうすんの?」
15 * 7 = 105
20 * 7 = 140
「 指し手確率のトータルが 140 にまで減っていたときは、どの手も見込みなしという判断にしようぜ☆
見込みがないときは 供託金は 1手前の局面に送り出すことにするぜ☆」
「 じゃあ、勝ちと 引き分けで 両方 プレイアウトしろだぜ☆
勝ちの評価値で 勝ったら それを使え☆
引き分けの評価値で 引き分けたら それを使え☆
それでも漏れたら 2つのうちのどちらかを ランダムで使え☆」
`25,`
22437 * 3 = 67311
# win draw
67311 * 2 = 134622
「 カンマを含めて 3桁で収まるとしても 改行を除けば 67311 byte☆
勝ちと引き分けの評価関数があるから だいたい 134 kb ぐらいか……☆」
「 先手の評価と 後手の評価 を1つの評価値でやって 足を引っ張り合わないか☆?」
「 部分点を引こうと思っているんだが、引いてるのに増えたり、引きすぎていたりするな……☆
被っている特徴があるのか☆?」
```plain
Result channel=Win
File Vert Hori Baro Sini
a 1 8 16
b 2 8 17
c 3 8 18
d 4 8 19 20
e 5 8 21
f 6 8 22
g 7 8 23
```
「 初手は rank6 の特徴が すべての選択肢で被っている……☆
例えば 4つの手で 特徴8 から 1点引けば、特徴8 からは 4点引かれるぜ☆」
「 しかし まあ、増えてほしいところは増えてるし、減ってほしいところは減ってるぜ☆」
「 投了しやすいものを 好きになって、それを止められないんじゃないか☆?」
「 モンテカルロ木探索みたいに 確率の低い選択肢も選ばれるように ばらす必要があるんじゃないの?」
「 ↑ 初手なんだが、 d列 だけ 両方のナナメ棒が刺さっていて、他より点が高いんだぜ☆」
「 ↑ 点数移動を進めていくと、 d列 の評価が伸びてるのはいいんだが、その 221 点の内訳のうち、 153 点は 特徴の4番 に入ってるんだぜ☆!」
「 特徴8番 に点数を振ると 初手のすべての手に点数が入ってしまうし、
特徴19番と 特徴20番だって そのうち 別の列で使う特徴でしょ」
「 指した後の局面に 点を付けないといけないんじゃないか☆?」
「 要らんと思って省いた 3マスのナナメ とかも要るんじゃないか☆?」
「 ぜんぜん かき混ざってないというのも あるんじゃない?」
「 初手は どれも 同じような確率になってないと、 隣の初手を ちっとも置いてくれなくない?
むしろ 他の手より とびぬけて高い確率をしてくれている必要があるんじゃないの?」
「 特徴9 に 高い点数が入っている……、つまり どの列でも 2段目に最初に置くなら 137点 が付くぜ☆」
「 そりゃ必ず どの列からでも 空っぽの2段目 にはたどり着くからな☆」
「 点数は 指した後の局面に付いてないといけないんじゃないの?
7つの局面、25の特徴、つまり 175項目が 画面に表示されてないといけなくない?
それが 現在、減少後、増加後、端数調整後の4つで 計700項目が表示されているはずなのよ」
「 局面評価値を取得する posval
みたいなコマンドを作ったらどう?」
「 現局面と、指した後の局面を比較する posdiffval {file}
も欲しいわね。
現局面の方にだけある特徴と、指したあとの局面の方にだけある特徴を取得する関数もほしいわね」
<書きかけ>
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!