逆算法に基づく詰将棋の列挙

Download Report

Transcript 逆算法に基づく詰将棋の列挙

逆算法に基づく
詰将棋の列挙
堀山貴史
中塚裕之 岩間一雄
(京都大学)
持駒なし
9手詰め
詰将棋
攻方は王手になる手の中から
手を選択する
攻方
玉方は必ず最善手を選ぶ
玉方
攻方
詰
詰
詰
詰
×
詰将棋 -不詰め不
詰
め
攻方
攻方の手によらず、
玉方が最善手をとれば
詰みがない
玉方
攻方
詰
詰
×
詰
×
詰将棋 -余詰め余
詰
め
攻方
2つ以上の攻方の手に対し、
玉方が最善手をとった場合でも
詰む
玉方
攻方
×
詰
詰
詰
詰
詰
詰将棋 -駒余り玉
金
金
持
駒
金
詰み上がり
詰み上がりに
駒が余っている
詰将棋
1525手詰
941
901
873
789
767
729
651
615
611
117
脊尾詰が
ミクロコスモス
橋本孝治
解く
(1997)
メタ新世界
山本昭一
万里の駒(余詰) 森長宏明
新扇詰
奥薗幸雄
イオニゼーション 橋本孝治
桃花源
添川公司
バベルの塔
変幻自斉
ゴゴノソラ
今村修
FAIRWAY
馬詰恒司、摩利支天 合作
寿
伊藤看寿
煙詰
伊藤看寿
詰将棋
玉
玉
金
金
金
金
解く研究
脊尾詰が現在最長の1525手詰を解く (1997)
創作する研究
逆算法を用いた自動生成 [Hirose, et al., 1998]
1八裸玉の数え上げ [Koyama, 2000]
金銀図式の数え上げ [Noshita, et al., 2002]
詰将棋生成研究の難しさ
どうやって局面が詰将棋であることを示すか?
不詰め(詰まないこと)
詰将棋 = 余詰め(手を変えても詰むこと)
のない局面
駒余り(詰み上がりに駒が余ること)
詰将棋生成研究の難しさ
どうやって局面が詰将棋であることを示すか?
不詰め(詰まないこと)
詰将棋 = 余詰め(手を変えても詰むこと)
のない局面
駒余り(詰み上がりに駒が余ること)
既存の研究
詰将棋の解答プログラムに解かせる
欠点:解答プログラムの実行時間は長い
金銀図式の数え上げ
1八裸玉の数え上げ
普通の高速パソコンで2週間
300MIPS年
詰将棋生成研究の難しさ
どうやって局面が詰将棋であることを示すか?
不詰め(詰まないこと)
詰将棋 = 余詰め(手を変えても詰むこと)
のない局面
駒余り(詰み上がりに駒が余ること)
本研究
逆算法を用いて詰みのある局面を全生成する
解答プログラムを使うことなく高速に数え上げを行う
逆算法
逆順に手を戻して詰め将棋を創作する方法
玉
玉
玉
玉
金
金
金
金
金
金 金
金
詰み上がり
1手詰め
玉
玉
玉
金 金
金
金
・・・
金
金
玉方手番
3手詰め
本研究
• 逆算法の定式化
• 拡張局面という概念の導入
• 列挙アルゴリズムの提案
玉
玉
{攻方金}
玉
玉
{攻方金}
金 金
金
金
金 金
金
金
{駒なし}
局面
{駒なし、攻方歩、…}
拡張局面
本研究
• 飛、角、香を用いない図式を列挙する
アルゴリズムを構築
• 実際に、桂図式(玉と桂のみの詰将棋)他を列挙
※ 用いない駒は玉方持駒となっている
列挙アルゴリズム
詰め上がり図作成
攻方逆算手探索
余詰め判定
DB登録
玉方逆算手探索
不詰め判定
DB登録
拡張局面から詰将棋の抽出
攻方逆算手探索
• 余詰め(手を変えても詰むこと)の判定
攻
方
手局
番面
余詰めあり
1手戻す
玉
方局
手面
番
余詰めあり
攻方逆算手探索
• 余詰め(手を変えても詰むこと)の判定
攻
方
手局
番面
1手進めた
局面の生成
手γ
n+1手
DB
マッチング
手β
手α
手α
で1手戻し
玉
方局
手面
番
1つは同じ
n手
余詰めなし
n手以下の全ての
詰みがある局面
攻方逆算手探索
• 余詰め(手を変えても詰むこと)の判定
攻
方
手局
番面
手β
マッチしたもの
手α
で1手戻し
玉
方局
手面
番
手αとβの2通りの詰め方があるので
余詰めあり
余詰めなし
攻方逆算手探索
攻方:n+1手
同じ局面
有
DB
玉方:n手
攻方:n‘+1手
玉方:n‘手
有
攻方逆算手探索
• 余詰めあり局面も以降の余詰め判定のために
逆算を続ける
有
攻方:n+2手
DB
玉方:n+1手
攻方:n手
有
有
逆算手探索
• 拡張局面の生成
攻
方
手拡
番張
局
面
生成
玉
方拡
手張
番局
面
生成とは、拡張局面から
ある手を1手戻すこと
逆算手探索
手:2二金を2三金に
玉
玉
• 拡張局面の生成
玉
玉
金
金
金
金
金 金
金
金
玉
玉
金
金
金
金
玉
玉
玉
玉
金
金
{駒なし、攻方金}
金 金
金
金 金
金
金
攻方逆算手探索
• 余詰め(手を変えても詰むこと)の判定
1手進めた
拡張局面の生成
攻
方
手拡
番張
局
面
DB
マッチング
生成
1つは包含される
玉
方拡
手張
番局
面
n手
余詰めなし
n手以下の全ての
詰みがある局面
攻方逆算手探索
• 余詰め(手を変えても詰むこと)の判定
余詰めなし
攻
方
手拡
番張
局
面
マッチしたもの
生成
玉
方拡
手張
番局
面
余詰めあり
n手
余詰めなし
玉方逆算手探索
• 不詰めの判定
玉
方
手局
番面
1手進めた
局面の生成
手γ
n+1手
手β
DB
マッチング
手α
手α
で1手戻し
攻
方局
手面
番
1つは同じ
n手
n手以下の全ての
詰みがある局面
玉方逆算手探索
• 不詰めの判定
玉
方
手局
番面
手β
n+1手
マッチしなかったもの
手α
で1手戻し
攻
方局
手面
番
マッチしたもの
n手
手βでは詰みがないか、
より長い手の逃げ方があるので
不詰め
玉方逆算手探索
• 不詰めの判定
1手進めた
拡張局面の生成
玉
方
手拡
番張
局
面
DB
マッチング
生成
1つは包含される
攻
方拡
手張
番局
面
n手
n手以下の全ての
詰みがある局面
玉方逆算手探索
• 不詰めの判定
玉
方
手拡
番張
局
面
マッチしたもの
生成
攻
方拡
手張
番局
面
不詰めなし
玉方逆算手探索
• 不詰めの判定
玉
方
手拡
番張
局
面
生成
攻
方拡
手張
番局
面
不詰めなし
詰将棋列挙の結果
詰め手数別の詰将棋の数
詰み
1手
7手
9手 11手
3手
5手
6,142
1,188
242
12
0
桂図式
7,524 12,366
金2歩1
図式
1,129
1,750
529
137
60
0
-
銀2歩1
図式
4,671
9,155
2,156
534
328
36
0
銀1桂2
図式
2,985
6,133
1,588
416
220
14
0
銀1桂1
歩1図式
5,769 11,207
2,784
740
414
20
0
1.83倍
詰将棋列挙の結果
列挙に要した資源量
実行時間(s)
メモリ量(KB)
拡張局面(個)
4,866
648,385
66,542
金2歩1図式
286
80,213
8,232
銀2歩1図式
1,143
268,759
27,582
銀1桂2図式
2,345
199,616
20,486
銀1桂1歩1図式
1,781
348,894
35,806
桂図式
Pentium4 2.8GHz/1GB (Debian GNU/Linux 3.0)
生成された詰将棋例
9手詰め
生成された詰将棋例
7手詰め
生成された詰将棋例
7手詰め
生成された詰将棋例
9手詰め
生成された詰将棋例
11手詰め
まとめ
• 拡張局面という概念の導入
• 逆算法による列挙アルゴリズムの提案
• 桂図式(玉と桂のみの詰将棋)等を列挙
今後の課題
• 飛、角、香を加えた定式化
• さらなる記憶量削減のための拡張局面の検討
• 他の図式の列挙