人は駒得のみに生くるにあらず その10
ひよこ将棋は序盤で定跡形から外れてしまうので、相手はなかなか飛車先を突いてこないのですが、飛車先を突いてくるソフトの場合、簡単に飛車先を切られて損です。
そこで手駒の価値のほうが盤上の駒より上だというのを簡単に表現するために次のように改造してみました。
// 駒得のみを評価する。ただし手駒の価値のほうが若干上。 Score Eval::evaluate_test2( const Tree* tree ) { // 現在の駒割 // 手駒のほうが盤上の駒より価値があるので、手駒のbit数を足しておくという手抜き実装。 return TURN == black ? tree->board.material + (Score)BitOp::PopuCount64(HAND_B) - (Score)BitOp::PopuCount64(HAND_W) : - tree->board.material - (Score)BitOp::PopuCount64(HAND_B) + (Score)BitOp::PopuCount64(HAND_W); }
ご覧の通り、手駒を表現している構造体の1になっているbitを数えてその数だけ加点するという素晴らしいhackです。
しかし、これをするとどう見ても弱体化しているようでした。
確かに飛車先の歩は切られないように34歩〜33角のように防ぐようになるのですが、その代わりに歩の交換大好きっ子になってしまいまして、玉頭だろうと小ビンだろうどこの歩でも交換します。そして盤上に交換した歩を置くと損をするとひよこ将棋は思っていますから、玉頭ががら空き。
もともとひよこ将棋は居玉のまま囲わないのですが、囲わない + がら空き。
これには参りました。どう見ても弱いです。
素晴らしいhackは大変な副作用を産み出していきました。(←「魔理沙は大変なものを盗んでいきました」の動画を頭のなかで再生しながら)
下手に評価関数をいじると副作用で弱くなるということをひよこは今日学びました。
しばらくひよこは駒割のみで頑張ります。