misakiがおかしい原因が分かったかも?
おかしいと思っている点は実は思い当たる点があって、去年の選手権の時からすでにおかしい点があった。
終盤で変なタダ捨てをすることがあった。
それがどういう原因で起こっているかというと
一般に静止探索では次のようなアルゴリズムになる
int Shogi::negaMaxQui(uchar SorE,int alpha, int beta, int depth,int height,int node_type ) { if( !in_check ) { value = eval(SorE,alpha,beta,depth); if(value>alpha) { alpha=value; if(value>=beta ) { return value; } } tp=generateCaptures( SorE,t ); if( tp==0 ) return value; } else { tp=moveKing(SorE,t); if( tp==0 ) return -MUGEN; } for(int i=0;i<tp;i++) { move( t[i],SorE ); value = -negaMaxQui( enemy(SorE), -beta, -alpha,depth+1, height-1,node_type ); undo( t[i],SorE ); if (value > best_value) { best_value = value; if (value > alpha) { alpha = value; if (value >= beta) return value; } } } return best_value; }
ということで、まず評価関数を呼び出して、betaを越えているときはbetaカットになる。
しかし、敵王の周囲にタダ捨ての金銀を打ち付けた状態で静止探索に入ると、
敵王の周囲の金銀は敵王に近いため、「位置評価でかなり高得点」になってしまう。
misakiは1.5倍程度の評価になる。
しかし、この金銀は次に取られてしまう運命にある(紐付きではないタダ捨てのため)
これは探索すれば解るのだけど、静止探索する前に評価関数を呼び出すと評価値が不当に高いためbetaカットが起きてしまうのである。
静止探索内での手生成では駒損手は生成しないため、中で「タダ捨ての移動などは発生しない」
問題は、タダ捨て状態で、静止探索に入ってしまった場合にある。
ということで、王の周囲の利き支援の無いタダ捨て駒を減点することにしました
(bitboardの利き情報しかないので、このへんはやりにくかったりする)
さて、この修正をしたら強くなっているかどうか?