def value_iteration(mdp, num_iters):
"""Sweep V <- max_a backup(V); return the whole history of iterates."""
V, history = np.zeros(mdp.num_states), []
for _ in range(num_iters):
V = mdp.backup(V).max(axis=1)
history.append(V)
return np.array(history)