ぼくの考えたKKPとKPPの実装
ネットで見聞きした情報を基にKKPとかKPPのそれっぽいものを作ってみるテスト
いきなりパフォーマンスの最適化は考えずに、まずは自然な構成を目指す
定義:
- OUPos
- 王将の駒位置を表す変数
- OUPosA
- プレイヤーAの王将の駒位置を表す変数
- OUPosB
- プレイヤーBの王将の駒位置を表す変数
- PPos
- 王将以外も含む一般の駒の駒位置を表す変数
- PPosA
- プレイヤーAの駒のPPosを表す変数
- PPosB
- プレイヤーBの駒のPPosを表す変数
- PSpec
- 相対的な移動可能規則*1別に分類した駒の種類を表す変数
- PSpecA
- プレイヤーAの駒のPSpecを表す変数
- PSpecB
- プレイヤーBの駒のPSpecを表す変数
駒位置PPosは0〜81の値をとる。0は駒台、それ以外は盤上のマスを指す。
王将の位置OUPosは0〜81でも1〜81でもどっちに設計しても良い。王将を駒台に置きたくなることがあるか否かの設計者の気分の問題
駒の種類PSpecは0〜90〜19の値をとる*2。
で、変数vの値域を集合風に{v}と書くとして、{PSpecA}={PSpecB}={PSpec}かつ{OUPosA}={OUPosB}={OUPos}かつ{PPos}={PPosA}={PPosB}なので*3、OUPos/PPosの区別や変数名末尾のAやBはある意味冗長なんだけど、変数の置換に対する対称性をわかりやすくするために付加しておく
上記変数の導入すれば、KKPは次の2配列で表せり:
- KKP_A[OUPosA][OUPosB][PPosA][PSpecA] // (王将)^2 v.s. A駒の評価用
- KKP_B[OUPosA][OUPosB][PPosB][PSpecB] // (王将)^2 v.s. B駒の評価用
また、KPPはかく表されき:
KPP[OUPos][PPosA][PSpecA][PPosB][PSpecB]KPP[OUPos][PPos][PSpec][PPos'][PSpec']
KPPは名前の通りP要素の軸が2つあるし、後述するようにそれらの置換に対する対称性を当てにできるから配列の種類は1種類でよか。<追記>対称性は関係無い。本当はKKPと同様に2種類欲しいがテーブルサイズ的に厳しいのと、KPP1種類+KKP2種類でKPP2種類を概ねカバーできる期待があるのだと思う。なおKPPをガチで2種類用意すればKKPが用済みとなるのは明か追記>
一方KKPは王将位置の軸が2つあるが、これらには置換に対する対称性は成り立たない*4。よって配列レベルで2種類要る。
*1:東西南北ベースでなく、前後左右ベースで定義される駒移動からなる規則。
*2:この場合移動規則が同じ駒は同じ種類とみなして無問題なので、FU,KY,KE,GI,KI,KA,HI,OU,UM,RYの10種類。よって0〜9。<追記>また同じ移動規則でも自己手番と相手手番では移動の南北が反対なのでその区別が入って全部で20種類。追記>
*3:王将を駒台に置けるなら、{OUPos}={PPos}でもある
*4:<追記>コンピュータ将棋プログラムでは評価の容易化のために自己の手番をプログラム内部表現において下手に固定にしたりする。この条件のまま追記>A王将位置とB王将位置を入れ換えたらその後の展開が全然違う(回転や鏡像変換では展開を一致させようがない)局面になってしまう。