Countermove Heuristic は、「ある手には自然な応手がある」ことを利用して、 直前の相手の手に対する有力な返し手を記録し、手の並べ替えに使う手法である。
Killer Heuristicが同じ深さの兄弟ノードを横断して使われるのに対し、 Countermove Heuristic は
という対応関係を覚える。
そのため、位置そのものより 「直前に何を指されたか」 に注目するヒューリスティクといえる。
典型的には、
from-topiece-toをキーにして、その返し手を 1 つ記録する。
チェスでは 64x64 の butterfly 的な表や piece-to 表が使われる。
将棋でも考え方は同じだが、
があるため、キー設計は少し複雑になる。
Move countermoveTable[PIECE_NB][SQ_NB];
void storeCountermove(Piece prevPiece, Square prevTo, Move reply) {
countermoveTable[prevPiece][prevTo] = reply;
}
Move probeCountermove(Piece prevPiece, Square prevTo) {
return countermoveTable[prevPiece][prevTo];
}
ordering では、probe した手に大きめのボーナスを付ける。
たとえば、
のように、直前手に対して自然な応手が決まりやすい局面で効きやすい。
Countermove Heuristic は、 history heuristicよりも局所的で、 Killer Heuristicよりも手順依存である。
そのため、
という併用がしやすい。