Value Iteration

Imagine a robot navigating a grid warehouse. It needs to find the shortest safe path to a charging dock. It could use Policy Iteration: guess a policy, evaluate it fully by solving a linear system, improve it, and repeat until nothing changes. But solving each evaluation step to convergence is wasteful. This is especially true if the policy is about to change anyway. Value Iteration asks a sharper question. Why evaluate a policy fully when a single step of a better update rule already moves you toward the optimal value function? Value Iteration is the algorithmic embodiment of truncating policy evaluation to one sweep. It folds this directly into policy improvement via the Bellman Optimality Equation. Instead of alternating between two separate phases, it repeatedly applies a single operator. This operator is the Bellman optimality backup. It applies to a value function estimate until it stabilizes. This collapses the two-loop structure of Policy Iteration into a single loop. It trades some per-iteration cost for a dramatically simpler and often faster overall procedure. The practical stakes are real. Value Iteration underlies classical solutions to Markov Decision Processes (MDPs). These appear in robotics, operations research, inventory control, and game AI. It is also the conceptual seed from which Q-learning and Deep Q-Networks grow. Understanding exactly why one Bellman backup per state, repeated indefinitely, converges to the optimal value function is essential. This is true not just for a good one, but for understanding nearly all of value-based reinforcement learning. This article gives the precise update rule. It includes a full pseudocode implementation with stopping criteria. It offers a rigorous contraction-mapping argument for correctness and convergence rate. It also provides a worked numeric trace on a small MDP. Finally, it surveys the pitfalls that trip up almost everyone implementing this for the first time.

Key takeaways
  • Value Iteration merges policy evaluation and policy improvement into one operator: the Bellman optimality backup.
  • Each sweep updates every state's value using the best action's expected return, not a fixed policy's action.
  • It converges because the Bellman optimality operator is a γ-contraction in max-norm, guaranteeing a unique fixed point.
  • Convergence is asymptotic (infinite iterations for exact convergence); practical runs stop when updates shrink below a threshold.
  • Per-sweep cost is O(|S|²|A|) for tabular MDPs, versus Policy Iteration's often costlier full evaluation phase.
  • The extracted greedy policy is optimal once the value estimate is close enough to the true optimum.
The core insight

Value Iteration replaces full policy evaluation with a single greedy Bellman backup per sweep, iterating this operator until the value function converges to the unique fixed point of the Bellman optimality equation.

The idea

A Markov Decision Process is a tuple (S,A,P,R,γ)(\mathcal{S}, \mathcal{A}, P, R, \gamma) with states S\mathcal{S}, actions A\mathcal{A}, transition kernel P(s′∣s,a)P(s'\mid s,a), reward function R(s,a,s′)R(s,a,s'), and discount factor γ∈[0,1)\gamma \in [0,1). The optimal value function v∗(s)v_*(s) is defined as the maximum expected discounted return achievable from state ss, and it satisfies the Bellman Optimality Equation:

v∗(s)=max⁡a∈A∑s′P(s′∣s,a)[R(s,a,s′)+γ v∗(s′)].v_*(s) = \max_{a \in \mathcal{A}} \sum_{s'} P(s'\mid s,a)\Big[R(s,a,s') + \gamma\, v_*(s')\Big].

Policy Iteration solves for v∗v_* indirectly: it picks a policy π\pi, computes vπv_\pi exactly (or to convergence) by solving the linear Bellman expectation equations, then improves π\pi greedily with respect to vπv_\pi, and repeats. The evaluation step is the expensive part — it is itself an iterative or linear-algebraic sub-procedure nested inside the outer improvement loop. Value Iteration observes that you do not need to fully evaluate a policy before improving it. Define the Bellman optimality operator T∗T^* acting on any value function vv by

(T∗v)(s)=max⁡a∑s′P(s′∣s,a)[R(s,a,s′)+γ v(s′)].(T^*v)(s) = \max_{a} \sum_{s'} P(s'\mid s,a)\big[R(s,a,s') + \gamma\, v(s')\big].

Value Iteration simply iterates vk+1=T∗vkv_{k+1} = T^* v_k starting from an arbitrary v0v_0 (commonly all zeros). Each application of T∗T^* is exactly one truncated policy-evaluation sweep in which the policy used is always "act greedily with respect to the current value estimate" — improvement and evaluation happen in the same line of arithmetic. There is no separate policy object maintained during the main loop; the policy is only extracted once, at the end, by taking arg⁡max⁡a\arg\max_a against the converged (or near-converged) value function.

How it works

The algorithm operates entirely on a value table indexed by state. On each sweep, every state's value is replaced by the best one-step lookahead value, using the current estimates of successor states (this can be done synchronously, storing new values in a separate array, or asynchronously/in-place, updating a single array as you go — both converge, in-place typically faster in practice). ``` ALGORITHM ValueIteration(S, A, P, R, gamma, theta) Input: states S, actions A, transition model P, reward R, discount gamma in [0,1), small threshold theta > 0 Output: value function V approximating v, greedy policy pi // Initialization for each s in S: V[s] <- 0 // or any bounded initial guess // Main loop: repeated Bellman optimality backups repeat delta <- 0 for each s in S: v_old <- V[s] // Bellman optimality backup: evaluate every action, take the best V[s] <- max over a in A of ( sum over s' of P(s' | s, a) ( R(s, a, s') + gamma V[s'] ) ) delta <- max(delta, |v_old - V[s]|) until delta < theta // Policy extraction: one greedy sweep using the (near-)converged V for each s in S: pi[s] <- argmax over a in A of ( sum over s' of P(s' | s, a) ( R(s, a, s') + gamma * V[s'] ) ) return V, pi ``` Two implementation variants matter in practice:

  • Synchronous (Jacobi-style) updates: compute all new values from a frozen copy of VV, then swap buffers. Easier to reason about, matches the textbook contraction proof exactly per sweep.
  • Asynchronous / in-place (Gauss–Seidel-style) updates: overwrite V[s]V[s] immediately and let subsequent states in the same sweep use the fresh value. This still converges to v∗v_* under standard conditions (every state updated infinitely often) and typically converges faster because information propagates within a single sweep instead of waiting a full iteration.

The stopping rule `delta < theta` is a practical proxy for "close enough to the fixed point." Because T∗T^* is a contraction (proved below), the sequence VV is guaranteed to keep shrinking its distance to v∗v_*, and the sweep-to-sweep change `delta` gives a computable, machine-checkable stand-in for the (unobservable) true error ∥V−v∗∥∞\|V - v_*\|_\infty.

Figure
One Bellman optimality backup at a state, expanding over actions and successor states
s a₁ a₂ a₃ s'₁ s'₂ s'₃ s'₄ s'₅ expand P(s'|s,a), R V(s) ← max over a of Σ P·[R + γV(s')] (take the best action)

Complexity & correctness

Per-sweep time complexity. For a tabular MDP with ∣S∣|\mathcal{S}| states and ∣A∣|\mathcal{A}| actions, each state's backup evaluates every action, and each action's evaluation sums over all possible successor states. In the worst case (dense transitions) this is O(∣S∣)O(|\mathcal{S}|) work per action, so one sweep costs

O(∣S∣2∣A∣).O(|\mathcal{S}|^2 |\mathcal{A}|).

If the transition model is sparse — each (s,a)(s,a) pair has at most bb possible successors (a branching factor) — the cost drops to O(∣S∣∣A∣b)O(|\mathcal{S}| |\mathcal{A}| b) per sweep. Space is O(∣S∣)O(|\mathcal{S}|) for the value table (plus the transition model storage, which is input-dependent and not part of the algorithm's own footprint).

Number of sweeps. Unlike a comparison sort or graph search, Value Iteration does not have a finite exact termination bound in general — convergence is asymptotic. To get within ϵ\epsilon of v∗v_* in max-norm, the number of sweeps needed is

K=O ⁣(log⁡(1/ϵ)+log⁡(Rmax⁡/(1−γ))log⁡(1/γ)),K = O\!\left(\frac{\log(1/\epsilon) + \log(R_{\max}/(1-\gamma))}{\log(1/\gamma)}\right),

derived directly from the contraction rate below. As γ→1\gamma \to 1, log⁡(1/γ)→0\log(1/\gamma) \to 0 and K→∞K \to \infty — long-horizon, near-undiscounted problems are the slow case. Total time to reach ϵ\epsilon-accuracy is therefore O(∣S∣2∣A∣⋅K)O(|\mathcal{S}|^2|\mathcal{A}| \cdot K).

Correctness — the contraction mapping argument. Correctness rests on showing T∗T^* is a contraction mapping in the max-norm ∥u∥∞=max⁡s∣u(s)∣\|u\|_\infty = \max_s |u(s)|. For any two value functions u,wu, w:

∣(T∗u)(s)−(T∗w)(s)∣=∣max⁡aQu(s,a)−max⁡aQw(s,a)∣≤max⁡a∣Qu(s,a)−Qw(s,a)∣\big|(T^*u)(s) - (T^*w)(s)\big| = \Big|\max_a Q_u(s,a) - \max_a Q_w(s,a)\Big| \le \max_a \big|Q_u(s,a) - Q_w(s,a)\big|

where Qv(s,a)=∑s′P(s′∣s,a)[R(s,a,s′)+γv(s′)]Q_v(s,a) = \sum_{s'}P(s'\mid s,a)[R(s,a,s')+\gamma v(s')], and the inequality uses the standard fact that ∣max⁡af(a)−max⁡ag(a)∣≤max⁡a∣f(a)−g(a)∣|\max_a f(a) - \max_a g(a)| \le \max_a |f(a)-g(a)|. Continuing,

∣Qu(s,a)−Qw(s,a)∣=γ∣∑s′P(s′∣s,a)(u(s′)−w(s′))∣≤γ∑s′P(s′∣s,a) ∥u−w∥∞=γ∥u−w∥∞,\big|Q_u(s,a) - Q_w(s,a)\big| = \gamma\Big|\sum_{s'}P(s'\mid s,a)\big(u(s')-w(s')\big)\Big| \le \gamma \sum_{s'}P(s'\mid s,a)\,\|u-w\|_\infty = \gamma \|u-w\|_\infty,

since P(⋅∣s,a)P(\cdot\mid s,a) is a probability distribution summing to 1. Taking the max over ss gives

∥T∗u−T∗w∥∞≤γ∥u−w∥∞.\|T^*u - T^*w\|_\infty \le \gamma \|u-w\|_\infty.

Because γ<1\gamma < 1, T∗T^* is a γ\gamma-contraction. By the Banach fixed-point theorem, a contraction on a complete metric space (here, R∣S∣\mathbb{R}^{|\mathcal{S}|} with the max-norm, which is complete) has a unique fixed point, and iterating the map from any starting point converges to that fixed point:

∥Vk−v∗∥∞≤γk∥V0−v∗∥∞→0.\|V_k - v_*\|_\infty \le \gamma^k \|V_0 - v_*\|_\infty \to 0.

That the fixed point of T∗T^* actually equals v∗v_* follows from the Bellman optimality equation itself: v∗v_* is defined as satisfying v∗=T∗v∗v_* = T^*v_*, so v∗v_* is a fixed point, and uniqueness of fixed points under a contraction guarantees it is the only one Value Iteration can converge to, regardless of initialization.

Policy correctness. Once ∥Vk−v∗∥∞≤ϵ\|V_k - v_*\|_\infty \le \epsilon, the greedy policy πk\pi_k extracted from VkV_k is not merely near-optimal in value but can be shown to be exactly optimal once ϵ\epsilon is small enough relative to the gap between the best and second-best action at each state (a standard result: greedy policies with respect to sufficiently accurate value estimates are exactly greedy with respect to v∗v_*, because arg⁡max⁡\arg\max is locally constant away from ties). In practice this means Value Iteration typically discovers the optimal policy well before the value function has converged numerically to high precision — a useful fact when deciding when to stop.

Tradeoffs versus Policy Iteration. Policy Iteration's evaluation phase can also be run inexactly (this is precisely the family of algorithms interpolating between the two, called modified or generalized policy iteration), but pure Policy Iteration solves each evaluation step exactly via linear algebra in O(∣S∣3)O(|\mathcal{S}|^3) per iteration and typically needs fewer outer iterations, since each is a full evaluation-plus-improvement. Value Iteration needs more sweeps but each is cheap and matrix-free — no linear system to solve — making it the default choice when ∣S∣|\mathcal{S}| is large or the transition matrix is sparse.

Worked example

Consider a tiny 1-D corridor MDP with three non-terminal states {1,2,3}\{1, 2, 3\} and a terminal goal state GG to the right of state 3, with a terminal pit HH to the left of state 1. Actions are `Left` and `Right`; each action succeeds deterministically. Reward is −1-1 for every step except entering GG (reward +10+10) or entering HH (reward −10-10); both are absorbing (episode ends, value 00 thereafter). Discount γ=0.9\gamma = 0.9. Layout: `H — [1] — [2] — [3] — G` Transitions:

StateActionNext stateReward
1LeftH−10
1Right2−1
2Left1−1
2Right3−1
3Left2−1
3RightG+10

Initialize V0(1)=V0(2)=V0(3)=0V_0(1)=V_0(2)=V_0(3)=0. Apply synchronous Bellman optimality backups.

Sweep 1 (using V0V_0, all zeros for non-terminal successors, and V(H)=V(G)=0V(H)=V(G)=0 fixed):

V1(1)=max⁡{−10+0.9(0), −1+0.9(0)}=max⁡{−10,−1}=−1V_1(1) = \max\{-10 + 0.9(0),\ -1 + 0.9(0)\} = \max\{-10, -1\} = -1
V1(2)=max⁡{−1+0.9(0), −1+0.9(0)}=−1V_1(2) = \max\{-1+0.9(0),\ -1+0.9(0)\} = -1
V1(3)=max⁡{−1+0.9(0), 10+0.9(0)}=10V_1(3) = \max\{-1+0.9(0),\ 10+0.9(0)\} = 10

Sweep 2 (using V1=(−1,−1,10)V_1 = (-1,-1,10)):

V2(1)=max⁡{−10+0.9(0), −1+0.9(−1)}=max⁡{−10, −1.9}=−1.9V_2(1) = \max\{-10 + 0.9(0),\ -1+0.9(-1)\} = \max\{-10,\ -1.9\} = -1.9
V2(2)=max⁡{−1+0.9(−1), −1+0.9(10)}=max⁡{−1.9, 8.0}=8.0V_2(2) = \max\{-1+0.9(-1),\ -1+0.9(10)\} = \max\{-1.9,\ 8.0\} = 8.0
V2(3)=max⁡{−1+0.9(−1), 10+0.9(0)}=max⁡{−1.9, 10}=10V_2(3) = \max\{-1+0.9(-1),\ 10+0.9(0)\} = \max\{-1.9,\ 10\} = 10

Sweep 3 (using V2=(−1.9, 8.0, 10)V_2 = (-1.9,\ 8.0,\ 10)):

V3(1)=max⁡{−10, −1+0.9(8.0)}=max⁡{−10, 6.2}=6.2V_3(1) = \max\{-10,\ -1+0.9(8.0)\} = \max\{-10,\ 6.2\} = 6.2
V3(2)=max⁡{−1+0.9(6.2)?… }V_3(2) = \max\{-1+0.9(6.2)?\dots\}

wait — recompute carefully: V3(2)V_3(2) uses V2(1)=−1.9V_2(1)=-1.9 and V2(3)=10V_2(3)=10:

V3(2)=max⁡{−1+0.9(−1.9), −1+0.9(10)}=max⁡{−2.71, 8.0}=8.0V_3(2) = \max\{-1+0.9(-1.9),\ -1+0.9(10)\} = \max\{-2.71,\ 8.0\} = 8.0
V3(3)=max⁡{−1+0.9(8.0), 10}=max⁡{6.2, 10}=10V_3(3) = \max\{-1+0.9(8.0),\ 10\} = \max\{6.2,\ 10\} = 10

So V3=(6.2, 8.0, 10)V_3 = (6.2,\ 8.0,\ 10).

Sweep 4 (using V3V_3):

V4(1)=max⁡{−10, −1+0.9(8.0)}=max⁡{−10,6.2}=6.2V_4(1) = \max\{-10,\ -1+0.9(8.0)\} = \max\{-10, 6.2\} = 6.2
V4(2)=max⁡{−1+0.9(6.2), −1+0.9(10)}=max⁡{4.58, 8.0}=8.0V_4(2) = \max\{-1+0.9(6.2),\ -1+0.9(10)\} = \max\{4.58,\ 8.0\} = 8.0
V4(3)=max⁡{−1+0.9(8.0), 10}=10V_4(3) = \max\{-1+0.9(8.0),\ 10\} = 10

Values have stabilized: V4=(6.2,8.0,10)=V3V_4 = (6.2, 8.0, 10) = V_3. `delta = 0`, so the loop terminates.

Policy extraction from V4V_4:

  • State 1: `Left` gives −10-10; `Right` gives −1+0.9(8.0)=6.2-1+0.9(8.0)=6.2 → π(1)=\pi(1)= Right.
  • State 2: `Left` gives −1+0.9(6.2)=4.58-1+0.9(6.2)=4.58; `Right` gives −1+0.9(10)=8.0-1+0.9(10)=8.0 → π(2)=\pi(2)= Right.
  • State 3: `Left` gives 6.26.2; `Right` gives 1010 → π(3)=\pi(3)= Right.

The recovered optimal policy is "always move Right toward the goal" everywhere — matching intuition, and obtained in just 4 sweeps for this small chain despite γ\gamma being close to 1.

SweepV(1)V(2)V(3)
0000
1−1−110
2−1.98.010
36.28.010
46.28.010 (converged)

Common pitfalls & traps

PitfallWhy it happensFix
Using arg⁡max⁡\arg\max against a stale value copy while writing new values into the same array without careConfuses synchronous vs. asynchronous semantics, can silently change convergence behavior (usually still fine, but breaks proofs assuming Jacobi updates)Decide deliberately: synchronous (double buffer) for textbook-matching proofs, or in-place for speed, and be consistent
Forgetting to fix terminal-state values at 0 (or handling absorbing states as ordinary states)Terminal states have no outgoing transitions in the reward-accumulation sense; treating them as regular states causes bogus backupsExplicitly exclude terminal states from the update loop, or hard-code V(terminal)=0V(\text{terminal})=0
Stopping too early with a loose `theta`, then reporting a suboptimal greedy policy`delta < theta` bounds value error, not policy correctness directly; near ties in Q(s,a)Q(s,a) can flip under a slightly wrong VVUse a `theta` scaled to reward magnitude and (1−γ)(1-\gamma); consider extracting the policy and checking it is stable across a couple of extra sweeps
Applying Value Iteration with γ=1\gamma = 1 (no discounting) in a non-episodic (continuing) taskThe contraction argument requires γ<1\gamma < 1; with γ=1\gamma=1 the operator may not contract and convergence can fail or be undefinedOnly use γ=1\gamma=1 in strictly episodic tasks with guaranteed termination, or keep γ\gamma strictly less than 1
Treating the number of sweeps as bounded by ∣S∣|\mathcal{S}| (confusing with graph algorithms like Dijkstra)Intuition transfer from shortest-path algorithms that terminate after a fixed number of relaxationsRecognize Value Iteration is a numerical fixed-point iteration: sweep count depends on γ\gamma and desired accuracy, not just ∣S∣|\mathcal{S}|

Pioneers & history

Value Iteration's roots lie in the mathematics of dynamic programming developed for sequential decision-making under uncertainty, later formalized specifically as MDP algorithms and adopted wholesale by reinforcement learning.

Origins · 1 minRichard E. Bellman and how this was discovered
RE
Richard E. Bellman
1920–1984 · Applied mathematician, RAND Corporation, pioneer of dynamic programming and the Bellman equation

History
1957
— Bellman formalizes dynamic programming and the principle of optimality, introducing the recursive value equations that underlie both Value Iteration and Policy Iteration.
1960
— Ronald Howard develops Policy Iteration for Markov Decision Processes, spurring comparative analysis of the two families of algorithms.
1963
— Convergence proofs for Value Iteration via contraction mappings and the Banach fixed-point theorem are formalized in the operations-research literature.
1989
— Chris Watkins introduces Q-learning, a model-free, sample-based descendant of the Bellman optimality backup used in Value Iteration.
1998
— Sutton and Barto's Reinforcement Learning: An Introduction codifies Value Iteration alongside Policy Iteration as the canonical dynamic-programming methods for solving MDPs with a known model.

Where this matters

Value Iteration is the workhorse of planning when a full model of the environment (transition and reward functions) is available. Classical robotics motion-planning systems use it (or its variants) to compute cost-to-go functions over discretized state spaces before a robot ever executes a trajectory. Operations-research applications — inventory control, admission control in queueing systems, maintenance scheduling — rely on exactly this fixed-point iteration to compute optimal policies offline. In reinforcement learning specifically, Value Iteration is the conceptual ancestor of Q-learning: replacing the exact expectation ∑s′P(s′∣s,a)[⋯ ]\sum_{s'} P(s'\mid s,a)[\cdots] with a sampled transition turns the tabular Bellman optimality backup into an online, model-free update. Deep Q-Networks (DQN) and its successors approximate the same backup with a neural network in place of a table, inheriting the same fixed-point intuition (though losing the clean contraction guarantee due to function approximation and sampling noise). Value Iteration Networks, a differentiable neural architecture, even embed the Value Iteration computation itself as a layer inside a learned planner. Anywhere an agent needs to compute "the best achievable value from every state, given known dynamics," some form of this algorithm — or a sampled, function-approximated relaxation of it — is doing the work.

Ask the tutor: How does replacing the exact expectation in the Bellman optimality backup with a single sampled transition turn Value Iteration into Q-learning?

Does Value Iteration require a model of the environment?

Yes. Value Iteration is a planning algorithm, not a learning algorithm in the sample-based sense: it needs the transition probabilities P(s′∣s,a)P(s'\mid s,a) and reward function R(s,a,s′)R(s,a,s') explicit and available for the Bellman optimality backup's expectation sum. This distinguishes it from model-free methods like Q-learning, which estimate the same backup from sampled transitions without ever knowing PP explicitly. When the model is unknown, Value Iteration's ideas are still used, but the exact expectation is replaced by sample averages or bootstrapped estimates, trading exact convergence guarantees for the ability to learn from experience.

How does Value Iteration relate to Policy Iteration in the general policy iteration framework?

Both are instances of Generalized Policy Iteration (GPI): an evaluation step and an improvement step interacting until convergence. Policy Iteration performs many evaluation backups (often to full convergence, or an exact linear solve) between each improvement step. Value Iteration is the extreme opposite: exactly one evaluation backup — and it uses the max over actions directly — before "improving" again. Intermediate algorithms that run a few evaluation sweeps between improvements are called modified or truncated policy iteration, situating Value Iteration as one endpoint of a continuous spectrum of tradeoffs between per-iteration cost and iteration count.

How do you choose the stopping threshold theta in practice?

A common heuristic ties `theta` to the reward scale and discount factor, since the worst-case remaining error after observing a sweep-to-sweep change of `delta` is bounded by roughly γ1−γδ\frac{\gamma}{1-\gamma}\delta. Choosing `theta` so that this bound is small relative to the reward magnitudes usually suffices for the greedy policy to have stabilized, since policies only change at value-function ties, which are typically not razor-thin in real problems. In performance-critical settings, some implementations also stop once the greedy policy itself is unchanged for several consecutive sweeps.

Is Value Iteration guaranteed to terminate in a finite number of sweeps?

Not in exact arithmetic for the general case: it converges asymptotically, so exact equality Vk=v∗V_k = v_* may require infinitely many sweeps. However, using a `delta < theta` stopping rule guarantees termination in a finite, computable number of sweeps for any `theta > 0`, because the contraction property guarantees `delta` shrinks geometrically at rate at most γ\gamma per sweep. In special cases — for instance, deterministic shortest-path-like MDPs with integer costs — the policy can stabilize exactly after finitely many sweeps even though the value function keeps inching toward its limit.

Can Value Iteration get stuck in a local optimum like some other iterative optimization methods?

No. Unlike gradient-based optimization on non-convex objectives, Value Iteration's underlying update is a contraction toward a single, globally unique fixed point — there is only one v∗v_*, and every initialization converges to it. This is a structural property of the Bellman optimality equation, not an empirical tendency, so there is no notion of a "local optimum" trap in the tabular, exact-model setting. Issues that resemble local optima (e.g., in Deep Q-Networks) arise only once function approximation and sampling are introduced, breaking the clean contraction argument.

How does Value Iteration scale to large or continuous state spaces?

Tabular Value Iteration scales poorly beyond a few million states, since it needs to store and update a value for every state on every sweep, and the per-sweep cost grows with ∣S∣2∣A∣|\mathcal{S}|^2|\mathcal{A}| in dense settings. For large or continuous spaces, practitioners discretize the state space (introducing approximation error), or replace the table with a function approximator (as in Value Iteration Networks or approximate dynamic programming), losing the exact contraction guarantee but retaining the same conceptual backup. This scaling limitation is precisely the motivation for moving toward model-free, sample-based, and deep-learning-based value methods.

What is the practical difference between synchronous and in-place (asynchronous) Value Iteration?

Synchronous Value Iteration computes an entirely new value array each sweep from a frozen copy of the old one, matching the clean contraction-mapping proof exactly, at the cost of needing two buffers in memory. In-place (Gauss–Seidel-style) Value Iteration overwrites values immediately within a single sweep, so later states in that sweep already see updated neighbors, which usually accelerates convergence in practice and only needs one buffer. Both converge to v∗v_* under standard conditions (every state updated infinitely often), but in-place updates lose the exact per-sweep geometric bound from the synchronous proof, even though empirical convergence is typically faster.

Before this