思うだけで学ばない日記 2.0

思うだけで学ばない日記から移転しました☆!よろしくお願いします。

ぼくの考えた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王将位置を入れ換えたらその後の展開が全然違う(回転や鏡像変換では展開を一致させようがない)局面になってしまう。