The MadChess UCI_LimitStrength Algorithm

MadChess adjusts its playing strength by configuring a set of four engine parameters.  As playing strength is increased…

  • Positional knowledge is increased.
  • Search speed is increased.
  • Severity of move errors is reduced.
  • Chance of blundering is reduced.

Positional Knowledge

Positional knowledge is controlled by many engine parameters that affect how MadChess evaluates the non-material aspects of a position.  Positional factors add to a material advantage or compensate for a material disadvantage.  MadChess evaluates pawn structure, piece location and mobility, king safety, and many other positional factors.  See Engine Parameters for details.

At weaker playing strengths, some positional knowledge is disabled, simplifying the evaluation.  As playing strength is increased, positional knowledge is enabled, allowing MadChess to “see” compensation for a material disadvantage.  The MadChess UCI interface does not expose numerical positional parameter values, but instead exposes checkbox (on or off) positional parameters- meaning the engine has the positional knowledge or it doesn’t.

Search Speed

Search speed is controlled by the NPS parameter.  At weaker playing strengths, low search speed prevents MadChess from “seeing” too many moves ahead, causing it to overlook tactical sequences.

Severity Of Move Errors

The severity of move errors is controlled by the MoveError and BlunderError parameters.  If MoveError or BlunderError is greater than zero, MadChess performs a MultiPV search and randomly selects the best move or an inferior move.

  • On every move MadChess may select a move that is from zero to MoveError centipawns worse than the best move.
  • If blundering, MadChess may select a move that is from zero to BlunderError centipawns worse than the best move.  See Chance Of Blundering below.

For example, if three inferior moves exist in the error range (either MoveError or BlunderError), the best move will be played only 25% of the time (1 / 4).  If four inferior moves exist in the error range, the best move will be played only 20% of the time (1 / 5).  Every move in the error range, including the best move, has an equal chance of being played.


MoveError and BlunderError is specified in centipawns, which is 1/100 the value of a pawn.  How is a position scored in fractions of a pawn when piece values typically are scored as whole number multiples of a pawn (knight and bishop = 3 pawns, rook = 5 pawns, queen = 9 pawns)?  When MadChess assigns a score to a position it considers material (pawns and pieces) but it also considers positional factors such as pawn structure, piece location and mobility, and king safety.  These positional factors are scored in fractions of a pawn.

Chance Of Blundering

The chance of blundering is controlled by the BlunderPercent parameter.  On every move MadChess determines whether it will blunder (play a poor move).  If so, it will use the BlunderError parameter when selecting an inferior move.  Because a blunder is considered a severe move error, the value of the BlunderError parameter should be greater than the value of the MoveError parameter.  See Severity Of Move Errors above.

Calibrating Engine Parameters

How does MadChess calibrate its playing strength to an arbitrary Elo?  First, MadChess sets various positional parameters on or off based on Elo level.  For example, at less than 1000 Elo, MadChess values knights and bishops equally, misjudges the danger of passed pawns, and misplaces pieces.  Second, MadChess calculates four search parameters using a non-linear equation.

  • Max Nodes Per Second
  • MoveError
  • BlunderError
  • BlunderPercent

You may examine the value of positional and search parameters for a given Elo by enabling the UCI Debug option.  MadChess will display all parameter values in your GUI’s engine output window.

Comments are closed.