詰将棋創作プログラミング 16 手筋を手順パターンで表現
[2016年1月22日最終更新]
詰将棋創作プログラミング 16 手筋を手順パターンで表現
前回(詰将棋創作プログラミング 15 データベースを手順で検索)は手順パターンを既存作品の検索に利用する話だったが、そこで「創作のための作品評価の準備としても必要な機能」だと書いた。この点をもう少し説明してみたい。
1.自動創作でのコンピュータによる評価の必要性
コンピュータによる創作支援では、多数の候補図の中でどれを採用するかが問題になってくる。詰将棋創作プログラミング 11 ランダムに自動創作およびその続きでは、最終的には人間が評価することにして、その候補を絞るために手順中の「同」の出現回数でフィルタリングした。これにより、人間が判断する数を大幅に削減できたわけである。これは捨駒が含まれているかを見ようとしたものだが、捨駒は取るとは限らないので、この見方はかなり大雑把である。
まだ今後の話だが、逆算による自動創作とか考えると、逆算した局面の候補はかなり多いので、すべての局面を生成するとしたら、何手か逆算を重ねると(完全作だけでも)局面の数が爆発してしまうことは容易に予想できる。これを避けるには2手(あるいは1手)逆算するごとに、その局面を評価して候補を絞ることが必要になってくる。その評価をすべて人間がするのでは効率が悪すぎるので、最終的な評価は人間がするにしても、途中の段階ではコンピュータに評価を任せたい。
2.コンピュータによる評価方法
コンピュータに評価させるには、当然のことながら、評価値をコンピュータが計算できることが必要である。駒数など静的に判断できる要素はそう難しくなさそうだが、問題は手順の評価だ。「同」の数だけではあまりに原始的なので、手順パターンを利用して、より精度の高い評価をさせたいわけだ。
手順の評価にもいろいろな要素があるが、基本的な評価項目として「捨駒」「中合」など手筋が含まれているか、があげられる。こういった手筋をコンピュータに理解させるために手順パターンで表現できるようにしたい。
パターン化できれば、そのパターンが含まれている既存作品の数とか、高い評価を得た作品が多く含んでいるパターンとか調べて、データベースを利用して評価関数のパラメータの最適値を求めることが可能になるかもしれない。
3.手順データの拡張
現在の手順ファイルtejun.txtのデータを基にした手順パターンでは、捨て駒とか移動合とか基本的な手筋を表現することもできない。そこで、これらを表現できるように各手のデータを追加することを検討している。
ただ、データ数が増えると検索で何番目とか指定するのも大変になるので、増やす前にキーワードで指定できるようにしてみた。いまある情報は次の通り。
# 手数 指手 先後 元 先 駒 成 玉 相対元 相対先
1,2三飛成(26),1,2,6,2,3,7,2,1,4,1,2,1,-1
1)何手目か:N=1
2)指し手(kif形式):TE=2三飛成(26)
3)先手(1)か後手(2)か:SG=1 (先手)
4)移動元(打の場合は0,0):FS=2,FD=6
5)移動先:TS=2,TD=3
6)駒(歩(1)~玉(8)、と(9)~龍(15)):KM=7
7)成れない(0)か不成(1)か成(2)か:NF=2
8)玉位置:GS=1,GD=4
9)玉相対の移動元(打の場合は0,0):FSS=1,FDS=2 (1,4 + 1,2 = 2,6)
10)玉相対の移動先:TSS=1,TDS=-1 (1,4 + 1,-1 = 2,3)
例えば、歩不成なら /歩.+NF=1/ (".+"は任意の文字1つ以上の意味)と指定できるようになった。
ここまでの情報でも、不成(NF=1)、打ち合(打、かつSG=2)、頭金(金打、かつTSS=0,TDS=1)とか、ある程度の表現はできるが、捨て駒のような基本手筋が表現できないのでは極めて不十分。
そこで、追加情報として、とりあえず次の項目を考えている。
11)非王手(0)か直接王手(1)か離し王手(2)か空き王手(3)か両王手か(4):OS=1
12)移動元が駒台(0)か盤上(1)か:FB=0
*指し手の"打"の有無でも判別可能
13)移動先が空きマス(0)か敵駒(1)か:TK=0
14)移動先が玉の回りのマス(1)か玉から1間以上離れたマス(2)か:TG=1
15)移動先への自駒の利きの数(移動する駒の利きは除く):NJ=1
16)移動先への敵駒の利きの数:NT=2
17)前の手と違うマス(0)か同じマス(1)か:DO=0
*指し手の"同"の有無でも判別可能
4.手筋の手順パターンによる表現
上記項目を基本要素として、これらの組み合わせで手筋を表現できればよいわけである。この項目で何が表現できるか、あげてみよう。
先手後手とも
駒打ち: FB=0 移動元が駒台
移動: FB=1 移動元が盤上
玉の回り: TG=1 移動先が玉の回りのマス
駒取りなし:TK=0 移動先が空きマス
駒取り: TK=1 移動先に敵駒あり
自利きなし:NJ=0 移動先への自駒の利きがない
自利きあり:NJ=[^0] 移動先への自駒の利きの数が1以上
敵利きなし:NT=0 移動先への敵駒の利きがない
敵利きあり:NT=[^0] 移動先への敵駒の利きの数が1以上
先手の手
捨て駒: OS=1(直接王手)かつ TK=0(駒取りなし)かつ
NJ=0(自利きなし)かつ NT=[^0](敵利きあり)
*自利きありでも、玉以外の敵駒の利きがあれば捨て駒と呼ぶかも。
打捨て駒: 捨て駒 かつ FB=0(駒打ち)
移動捨て駒:捨て駒 かつ FB=1(移動)
後手の手
合: KM=[^8](玉以外)かつ TK=0(駒取りなし)
打ち合: 合 かつ FB=0(駒打ち)
移動合: 合 かつ FB=1(移動)
中合: 合 かつ NJ=0(自利きなし)
打ち中合: 中合 かつ FB=0(駒打ち)
移動中合: 中合 かつ FB=1(移動)
捨て合: 合 かつ TG=1(玉の回り)
かつ NJ=1(移動先への自駒の利きの数が1)
かつ NT=[^0-1](移動先への敵駒の利きが2以上)
打ち捨て合:捨合 かつ FB=0(駒打ち)
移動捨て合:捨合 かつ FB=1(移動)
たぶんまだ情報が足りないが、それは随時追加を検討していけばよいだろう。
5.手順パターンによる表現の限界
上記により、捨て駒作品とか、ある程度の手筋は表現できるようになるが、いくら情報を追加しても表現できる範囲には限界がある。例えば、打歩詰がらみの構想などは作意の手順パターンだけでは表現できない。変化や紛れの手順も合わせてみないとわからないからである。
こういう高級な作品については、また別の創作支援機能が必要になるだろう。
| 固定リンク
「コンピュータ詰将棋」カテゴリの記事
- 詰将棋創作プログラミング 26 同一作リストの分析(2019.03.27)
- 詰将棋創作プログラミング 25 記録に挑戦!(2018.08.30)
- 詰将棋創作プログラミング 24 飛角図式のランダム生成(2018.01.22)
- 詰将棋創作プログラミング 23 柿木将棋自動化の効果(2017.01.22)
- 詰将棋創作プログラミング 22 詰将棋創作AIを作るには(2017.01.17)
コメント