[2016年2月4日最終更新]
詰将棋創作プログラミング 19 5手詰将棋の特性
1.詰将棋の評価
コンピュータで詰将棋を生成させるときの問題は、詰将棋の評価である。評価といっても、発表された詰将棋を人間が評価するのとはレベルが違って、まずは詰将棋といえるかどうか判断するレベルの評価が必要になる。最終的な評価は人間がするにしても、事前に自動である程度の評価をさせないと、人間が大量のゴミの山からダイヤを探すようなことになる。人間レベルの自動評価は、発表に足る作品をたくさん自動生成できるようになってから考えればよいだろう。
詰将棋創作プログラミング 11 ランダムに自動創作、続きでは、手順中の「同」の数でフィルタリングしたが、これもその目的である。まだ手順の解析はできていなかったので、棋譜ファイルを文字列検索するだけですむ簡易な判定をしたわけだ。
2.手順データから詰将棋の特性を考える
詰将棋創作プログラミング 18 取らず手筋の源流で説明したように、手順を解析して情報を追加し検索で利用できるようにした。そこで、この手順データを利用して、詰将棋の特性を考えてみたい。
といっても、ここでは各種の趣向をこらした芸術的な詰将棋はさておき、入門用の簡単な詰将棋を考える。そこで、一つのサンプルとして、「22玉、右上5×5以内の5手詰」について検討することにした。
データベースからこの条件の既存作品を検索したところ、約1700作あった。単にこの手順データを見ても特性が判りにくいので、比較対象として、5手詰1000作を「ランダムに自動創作」を使って自動生成した。ただし、余詰チェックも捨て駒チェックもバイパスして、柿木将棋が5手で駒余りなしに詰ますというだけのしろものである。
既存作品から最近の分1000作を選び、この自動生成の1000作と比較すれば、どのへんが詰将棋の特性なのか見えてくるのではないか、またある図が詰将棋といえるかどうか判断する評価関数がつくれるのではないか、というもくろみだ。
3.比較の方法
各手ごとの手順データは今のところ次のものを用意している。
(再掲。詳しくは詰将棋創作プログラミング 18 取らず手筋の源流を参照)
# 各手ごとの手順データ
# 手数 指手 先後 移動元 移動先 駒 成 玉位置 相対元 相対先
# N TE SG FS,FD TS,TD KM NF GS,GD FSS,FDS TSS,TDS
# 1, 2三飛成(26),1, 2,6, 2,3, 7, 2, 1,4, 1,2, 1,-1,
# 王手 元が盤 先が駒 回/離 自利き 敵利き 同 入替 連移
# OS FB TK TG NJ NT DO IK RI
# 1, 1, 0, 1, 0, 2, 0, 0, 0
24項目あって、5手詰の場合このデータが5手分ある。ただし、手数と先後は自動的に決まるし、指手は後の項目と重複しているので、この3項目を除いた21項目×5手の105項目について、既存作品、自動生成の各1000作の中で各値の作が何作あるか、調べることにした。
4.調査結果
調査プログラムを実行した結果は次のような感じ。
FS 移動元(筋):
1手目 [[673, 896], [60, 11], [60, 20], [97, 23], [72, 43], [27, 7], [0, 0], [0, 0], [0, 0], [0, 0]]
2手目 [[1, 17], [98, 0], [703, 980], [121, 2], [60, 1], [6, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
3手目 [[457, 910], [95, 10], [111, 25], [159, 22], [132, 27], [35, 6], [0, 0], [0, 0], [0, 0], [0, 0]]
4手目 [[15, 53], [187, 364], [525, 315], [220, 268], [35, 0], [7, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
5手目 [[548, 775], [81, 33], [80, 80], [122, 71], [120, 36], [38, 5], [0, 0], [0, 0], [0, 0], [0, 0]]
FD 移動元(段):
1手目 [[673, 896], [77, 25], [57, 20], [66, 24], [89, 26], [27, 9], [0, 0], [0, 0], [0, 0], [0, 0]]
2手目 [[1, 17], [185, 2], [646, 980], [92, 0], [50, 1], [15, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
3手目 [[457, 910], [101, 19], [149, 17], [104, 23], [115, 24], [63, 7], [0, 0], [0, 0], [0, 0], [0, 0]]
4手目 [[15, 53], [197, 251], [503, 269], [232, 427], [30, 0], [12, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
5手目 [[548, 775], [121, 37], [101, 30], [94, 82], [87, 65], [38, 11], [0, 0], [0, 0], [0, 0], [0, 0]]
・・・
全結果は「dbc026_result.txt」をダウンロード(ブラウザで表示するときはShift_JISでエンコード)。
例えば最初の項目FS 移動元(筋)で、取りうる値は0(駒台)、1筋から9筋で全部で10個。その0~9の値が既存作品、自動生成の各1000作中何作あるかペアで示している。
最初の[673, 896]は、1手目駒打ちの図が既存作品では673作(67.3%)、自動生成では896作(89.6%)あったことを示す。かなり有意な差があることをうかがわせる数字である。
この結果を利用して詰将棋(といえる)かどうか判断する評価関数を作る予定であるが、ここでは私がざっと見て気づいたことを書いてみたい。
5.5手詰将棋の特性
1)NF 成不成(成れない、不成、成):
1手目 [[677, 898], [119, 30], [193, 72]]
2手目 [[989, 1000], [0, 0], [0, 0]]
3手目 [[478, 914], [168, 20], [343, 66]]
4手目 [[989, 1000], [0, 0], [0, 0]]
5手目 [[573, 788], [165, 90], [251, 122]]
不成も成も既存作品の方が自動生成よりずっと多い。その分紛れが多い局面を意識的に作りこんでいるからだろうか。なお、既存作品の合計が1000になってないのは手順無しの図が11あったため。
2)OS 王手種別(非王手、直接王手、離し王手、空き王手、両王手)
1手目 [[0, 0], [900, 937], [19, 14], [49, 49], [21, 0]]
2手目 [[989, 1000], [0, 0], [0, 0], [0, 0], [0, 0]]
3手目 [[0, 0], [815, 893], [58, 36], [83, 70], [33, 1]]
4手目 [[989, 1000], [0, 0], [0, 0], [0, 0], [0, 0]]
5手目 [[0, 0], [909, 927], [11, 23], [57, 48], [12, 2]]
いずれも大部分が直接王手。両王手(一番右)は圧倒的に既存作品が多く、自動生成で偶然両王手になるのはほとんどないことがわかる。
3)FB 移動元が駒台(打ち)/盤上(移動)
1手目 [[673, 896], [316, 104]]
2手目 [[1, 17], [988, 983]]
3手目 [[457, 910], [532, 90]]
4手目 [[15, 53], [974, 947]]
5手目 [[548, 775], [441, 225]]
既存作品は自動生成と比べて駒打ちが少ない。後手の駒打ち(合駒)は既存作品の方が多いかと予想していたが、5手だと合駒を使った良い手順が作りにくいせいか。
4)TK 移動先が空きマス/敵駒
1手目 [[973, 1000], [16, 0]]
2手目 [[261, 907], [728, 93]]
3手目 [[975, 1000], [14, 0]]
4手目 [[232, 924], [757, 76]]
5手目 [[986, 1000], [3, 0]]
先手は駒取りがほとんどない。後手は既存作品では7割以上が駒取りだが、自動生成では1割以下とはっきり分かれた。次の同のデータをみるとだいたいは捨て駒を取る手だが、それ以外でも詰方の駒を取る手がある程度ある。詰方の駒が消えた方が美しいという意識で創作されているためだろうか。
5)DO 同以外か同か
1手目 [[989, 1000], [0, 0]]
2手目 [[328, 968], [661, 32]]
3手目 [[988, 1000], [1, 0]]
4手目 [[292, 972], [697, 28]]
5手目 [[989, 1000], [0, 0]]
既存作品で意識的に捨て駒を入れているのが見える数字。
6)TG 移動先が玉の回り(1)/離れたマス(2):
1手目 [[0, 0], [862, 875], [127, 125]]
2手目 [[0, 0], [903, 999], [86, 1]]
3手目 [[0, 0], [805, 855], [184, 145]]
4手目 [[0, 0], [884, 999], [105, 1]]
5手目 [[0, 0], [851, 905], [138, 95]]
後手の離れたマスへの移動は既存作品の方が圧倒的に多い。これは桂打ちや飛角香の離し王手を取る手などで、ランダムでは入りにくいのかもしれない。
7)NJ 移動先への自駒の利き(0駒、1駒・・・)
1手目 [[562, 128], [398, 842], [27, 30], [2, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
2手目 [[372, 862], [506, 132], [100, 6], [11, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
3手目 [[660, 112], [320, 847], [9, 39], [0, 2], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
4手目 [[514, 763], [378, 217], [83, 20], [14, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
5手目 [[104, 52], [880, 909], [5, 36], [0, 3], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
ここもはっきり分かれた項目だ。既存作品では先手は0つまり同玉と取れる捨て駒が多く、自動生成ではヒモ付きの王手が多い。後手は逆に自動生成で8割が0になっているが、玉が守り駒のない地点に逃げる手だろう。
8)NT 移動先への敵駒の利き
1手目 [[33, 124], [480, 863], [418, 12], [52, 1], [6, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
2手目 [[760, 977], [223, 23], [6, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
3手目 [[80, 145], [601, 841], [258, 14], [42, 0], [8, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
4手目 [[853, 939], [133, 58], [3, 3], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
5手目 [[115, 94], [838, 903], [33, 3], [2, 0], [1, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
先手の王手に自動生成では1枚だけ、つまり玉しか利いてないのが8~9割。それに対し、既存作品の1、3手目では2枚以上利いている数もかなりある。同玉、同xといろいろ受けのある捨て駒、あるいは焦点の捨て駒ということだろう。
6.詰将棋らしい作品を作るには
上記の特性から、詰将棋らしい手順にするには、初形のランダム生成では難しい(効率が悪い)ことがわかった。対策としては二つの方向が考えられる。
1)詰将棋らしい手順が出そうな配置(どんな配置?)を優先して生成する
2)詰上りから逆算して、詰将棋らしい手が出る方向に逆算を進める
逆算のプログラムは、まだ一度も書いたことがないので、少し試行してみようかな。
最近のコメント