Late move reductions (LMR) in chess engines
Late move reductions (LMR)
Definition
Late move reductions (LMR) are a selective-search technique used by chess engines within an alpha–beta framework to speed up calculation. After ordering moves so that likely best candidates are searched first, the engine searches the “late” (lower-priority) moves at a reduced depth (for example, d − 1 or d − 2 plies instead of the full depth d). If a reduced-depth search unexpectedly shows that a late move is strong (it raises the score above alpha or even reaches beta), the engine re-searches that move at full depth to verify the result.
How it works (in practice)
LMR lives inside a standard alpha–beta or principal variation (PVS) search with move ordering. A typical node proceeds like this:
- Order moves: likely best moves first (hash move, winning captures, killer moves, high-history quiets), then the rest.
- Search the first few moves at full depth: these are “early” moves.
- For “late” moves (after a threshold index), if conditions are safe (not in check, not a PV node, move is quiet, etc.), search at a reduced depth d − R.
- If the reduced search “fails high” (beats alpha or hits beta), immediately re-search that same move at full depth d to confirm.
Conceptually, LMR says: “I’ll look deeply at the most promising candidates and skim the rest—unless a skimmed move looks better than expected, in which case I’ll go back and look deeply.”
Where engines use it (and where they don’t)
Modern engines (e.g., Stockfish, Komodo, Ethereal) apply LMR in most middlegame nodes, combined with transposition tables, null move pruning, killers, and history heuristics. They adjust the reduction R by depth and by how late the move appears in the ordering, plus other signals (e.g., whether the side to move is “improving”).
- Commonly reduced: quiet, late-ordered moves in non-PV nodes when the side to move is safe (not in check).
- Not reduced or reduced less: captures, promotions, checking moves, PV nodes (principal line), nodes in check, or positions likely to be zugzwang-prone endgames.
- Verification: any reduced move that returns a surprisingly high score is re-searched at full depth before being trusted.
Why it matters (strategic and historical significance)
LMR is one of the workhorse heuristics that made modern engines vastly faster and stronger. By skipping full-depth analysis of unlikely candidates, engines reach greater effective depth in the same time. This synergizes with aspiration windows, PVS, null-move, and strong move ordering to produce huge pruning efficiency.
Selective search ideas date back to the 1980s–90s; reductions in the “late moves” sense became widely deployed in top engines in the 2000s and have been heavily refined since. Contemporary open-source engines (notably Stockfish) auto-tune reduction tables and conditions, and disabling LMR typically costs significant Elo because the engine analyzes too many unpromising moves too deeply.
A simple example (move-ordering and reduction)
Imagine a middlegame position where White has 18 legal moves. Good move ordering might list them like this:
- 1–3: hash move, a winning capture (Bxe6), and a killer move (Re1!) — search at full depth d.
- 4–7: other promising captures/checks — search mostly at full depth d.
- 8–18: quiet, low-history moves (a3, h3, Kh1, Nd2, …) — search at reduced depth, e.g., d − 1 or d − 2.
If move 12 (Kh1) surprisingly improves the evaluation above alpha, the engine immediately re-searches Kh1 at depth d. If it still looks good, Kh1 may enter the principal variation, and the search window and ordering adapt around this discovery.
Safety nets and pitfalls
- Fail-high re-search: prevents LMR from missing tactical shots. Reduced moves only stand if they also succeed at full depth.
- Node/feature gating: engines avoid or reduce LMR in checks, PV nodes, and tactical situations (captures, promotions, many checking moves).
- Endgame care: in zugzwang-prone endings, both null-move and aggressive reductions can mislead; engines often damp LMR there.
- “Improving” and history: if the side to move is improving or the move’s history score is high, the reduction R is decreased (or eliminated).
What LMR looks like under the hood
At a high level, the reduction R often depends on search depth and the move’s index: R = baseReduction(depth, moveNumber) ± tweaks (history score, improving, tactical flags). Typical values are 1–3 plies for very late quiet moves at moderate depths, smaller or zero for earlier or sharper moves. If the reduced score ≥ beta, perform a full-depth re-search; if it then still ≥ beta, cut off.
Human analogy
LMR mirrors how strong players think: examine a few compelling candidates in depth first, then give the rest a quick look unless something catches the eye—then revisit in depth.
Related concepts
- alpha-beta pruning and principal variation (PVS)
- move ordering (hash move, killers, history heuristic)
- null move pruning and futility/razoring (other selective heuristics)
Interesting notes
- In GUIs, you may see “depth” and “seldepth” (selective depth). LMR can lower the nominal depth searched for some branches, while extensions can raise selective depth for critical lines—both are normal.
- LMR interacts strongly with transposition tables: good ordering from TT hits makes LMR safer and more effective because “late” moves really are worse on average.
- Modern engines tune LMR parameters with statistical methods (e.g., SPRT testing). Small tweaks to reduction tables can shift evaluation speed and strength by measurable Elo.
- Historically, selective reductions were already important in the pre-2000 era; widespread, carefully verified LMR as seen today became a defining feature of top engines in the 2000s and beyond, contributing to their leap over human strength (e.g., post–Kasparov vs. Deep Blue, 1997, era).
Takeaway
LMR is a “search more where it matters, less where it doesn’t” rule—paired with verification when a seemingly unpromising move turns out to be strong. It’s a cornerstone of modern engine strength and a big reason they can analyze so deeply so quickly.