Mobility

Mobility は、 駒がどれだけ自由に動けるかを評価する項目である。 合法手の数そのものを数える場合もあれば、 有効な利きや活動範囲として評価する場合もある。

概要

駒の mobility が高い局面では、

  • 攻めの選択肢が多い
  • 守りへ回る余裕がある
  • 相手の王や弱点へ圧力をかけやすい

といった利点がある。

そのため評価関数では、 各駒について「どれだけ働いているか」を数値化することが多い。

どのように数えるか

最も単純には、 各駒の移動可能先の数に応じて点数を与える。

int evaluateMobility(const Position& pos, Color us) {
    int score = 0;

    for (Piece pc : pos.pieces(us)) {
        Bitboard attacks = legalTargets(pos, pc);
        score += mobilityWeight(pc.type()) * popcount(attacks);
    }

    return score;
}

ただし実戦的には、

  • 単なる利き数
  • 安全な移動先
  • 相手陣への侵入度
  • 王周辺への圧力

を分けて扱うことが多い。

将棋AIでの位置づけ

将棋では、 打ち駒や成りがあるため、 チェスの mobility をそのまま持ち込むだけでは不十分である。

それでも、

  • 飛車や角の通り
  • 金銀の窮屈さ
  • 相手陣での成駒の活動性

は強さに直結しやすい。

そのため mobility は、 King SafetyPiece-Square Tables と並んで、 手作り評価の基本要素のひとつとみなせる。

注意点

  • 利きが多いだけで良い手とは限らない
  • 王手されている側の mobility は特殊で、単純評価しづらい
  • 打ち駒を含む将棋では「盤上の可動性」だけでは足りない

関連項目

参考にしたホームページ