[2019年4月26日最終更新] 作品59追加
詰将棋創作プログラミング 24 飛角図式のランダム生成
飛角図式とは、盤上に玉と飛角4枚だけが配置されている詰将棋である(飛角の向きや成生は任意、持駒も任意)。飛角図式は見た目がシンプルなので、コンピュータが完全作を全検してしまうのではないかと20世紀の頃から心配されてきたが、実際に試算してみるとコスト的にほぼ無理なことがわかった(詰将棋創作プログラミング 10 陣内竜堂はいつ出現するか)。
「全検できないとしたら、その条件を満たす範囲でランダムに盤面、持駒を生成して完全作かどうかチェックすることが考えられる。」ということで、実戦型詰将棋のランダム生成を試行したことを前に書いた。
eureka作品集(37)の解説で少し書いたように、飛角図式についても、ランダム生成をいろいろ試行していたので、その取り組みについて具体的に書いてみたい。
1.何についてランダムか
玉と飛角4枚を盤面に配置するわけだが、単純に81マスにランダムに配置したのでは、ほとんど詰将棋にならず、効率が悪すぎる。また、持駒も金銀桂香歩の各駒をランダムな枚数持たせたら、ほとんどは詰まないか駒余りになってしまうだろう。
ランダム生成はおもしろい詰将棋をいくつかでも生成することが目的なので、全検のような網羅性は必要なく、可能性の少ないケースはなるべく排除した方が効率的である。
2.既存の飛角図式のまねをする
実戦型のランダム生成では、各マスごと、および持駒を、ランダムに選択した既存の実戦型作品からコピーして配置を決める方法で生成した。飛角図式のランダム生成でも、既存の飛角図式をまねするのが有効ではないかと考え、まずは飛角図式だけのデータベースを作成した。
各マスごとのランダム生成では、飛角4枚がきれいに揃う確率が低いので、確実に飛角図式にするため、玉と飛角4枚の位置を、ランダムに選んだ5作品からコピーすることを考えた。
3.玉と飛角の位置関係をまねする
玉位置と飛角の位置は完全作の可能性に強く関係している。たとえば、玉の近くに詰方の飛角の利きが全くないと、たくさんの持駒が必要になり、完全作が存在する可能性が低くなることは容易に想像できる。
そこで、単純にランダムな5作品からコピーするのではなく、ある程度玉と飛角の相対位置が既存作品と近くなるようなコピー手法をいろいろ試行してみた。例えば次のような方法である。
1) ランダムに選んだ作品から玉と1枚目の飛をコピー。
2) 玉と1枚目の飛の相対位置、向き、成生が同じ作品の中からランダムに選び、2枚目の飛を玉との相対位置を合わせるようにコピー。盤からはみ出たら選択し直し。
3) 玉と2枚目の飛の相対位置、向き、成生が同じ作品の中からランダムに選び、1枚目の角を玉との相対位置を合わせるようにコピー。盤からはみ出たら選択し直し。
4) 玉と1枚目の角の相対位置、向き、成生が同じ作品の中からランダムに選び、2枚目の角を玉との相対位置を合わせるようにコピー。盤からはみ出たら選択し直し。
5) 5枚の配置が既存作品と一致してしまったらやり直し。
あまりまねをしすぎると、既存作品と衝突する可能性が高くなるので、まねの程度が難しい。これはある程度の量を実際に試して評価していけばよいだろう。
4.持駒は絞って全検
盤面を作るコストがそこそこかかるので、毎回持駒をランダムにするのは効率がわるそうだ。そこで、持駒については、持駒サーチの機能を使って完全作を見つけることにした。
持駒が多くなると完全作の可能性は低くなるし、なにより詰将棋としておもしろくない可能性が高いので、「おもしろい詰将棋」を効率的に探す観点から、持駒4種8枚以内の範囲で持駒サーチしてみた。
ここは、持駒なしだけにしたり、3枚以内にしたり、好みによっていろいろ調整できるところだ。
5.手順を分析して候補作を絞る
飛角図式のような緩い条件だと完全作は膨大にあるので、「完全」という条件だけだと、目を通すことが困難なほど大量に生成されてしまう。生成された完全作を評価しておもしろい作品だけを選択するAIを実装すればよい(例えば既存の飛角図式の手順をディープラーニングするなど)のだが、とりあえず、手動で簡単なフィルターをかけることにした。
手順の要因は非常に多いが、まずは簡単に判断できる範囲で、捨駒と合駒に点数を加え、合計が一定点以上のときだけ生成するようにしてみた。
完全に自動創作させる場合には、この「評価」が非常に重要になってくるが、人間とコンピュータが協力する前提なら、効率をあげることができれば良いので、このような大雑把な評価でもそれなりに効果がある。
といっても、現状だと、生成された詰将棋を100題ぐらいみて、私の目で出題してもいいかなと思うのは数題ぐらい。もうちょっとちゃんと評価して効率アップしたいところではある。
6.作品例
飛角図式のランダム生成で創作した発表作品は下記の通り。
作品37 eureka 21手 解答
飛角図式
- 詰将棋デパート1
(詰将棋パラダイス 2017年1月)
作品44 eureka 17手 解答
大駒図式
- 創作プログラミング 作品44 ★出題
(おもちゃ箱 2017年5月)
「合駒に注意 10手台」
本作は生成された飛角図式が途中で盤面飛角持駒飛角のダブル飛角図式になるおもしろい図だった。もとの図では難しすぎるので、その途中図を作品として発表した(解説参照)。
作品45 eureka 25手 解答
飛角図式
- 創作プログラミング 作品45 ★出題
(おもちゃ箱 2017年5月)
「雪隠詰 20手台」
作品47 eureka 17手 解答
飛角図式
作品48 eureka 25手 解答
飛角図式
- たま研作品展3 ★出題
(詰パラ 2017年11月)
作品49 eureka 19手 解答
飛角図式
作品50 eureka 19手 解答
飛角図式・四銀詰
作品51 eureka 23手 解答
飛角図式
作品52 eureka 27手 解答
飛角図式・ミニ煙
作品53 eureka 29手 解答
飛角図式
作品59 eureka 25手 解答
飛角図式
7.ランダム生成の展開
実戦型詰将棋、飛角図式で二通りののランダム生成を試行したが、これらの方法は既存作品のデータベースを元にして生成する手法なので、他のいろいろな詰将棋にも比較的容易に展開が可能である。例えば、飛角図式の代わりに盤面5枚以内、持駒5枚以内の簡素図式のデータベースを入力にすれば、簡素図式のランダム生成ができる。
ここでは初形配置をまねしているだけだが、そのデータベースから手順や詰上り配置なども分析して似た傾向のものを生成するようにすれば、汎用のまね創作ツールが構築できるかも。
例えば、入門用5手詰データベースを与えれば同じようなレベルの5手詰を生成したり、ある作家の全作品を与えれば、似た作風の作品が生成できるとかなれば、いろいろな詰将棋を創作できる可能性が大きく広がるだろう。
もっとも、将棋AIが、人間が教えていた段階から、プロ棋士の棋譜を学習する段階、更にルールだけ与えて自己対戦だけで最強になったりしているのを見ると、詰将棋創作も人間のコントロールを離れて、既存の詰将棋を一切教師データとして使わずにAIが人間を感心させるような作品を作る日もいつか来るのかもしれないけれども。
最近のコメント