GitHub

@@ -79,7 +79,7 @@ from quantecon.distributions import BetaBinomial

79798080

import matplotlib.pyplot as plt

818182-

np.random.seed(123)

82+

rng = np.random.default_rng(123)

8383

```

84848585

## Review of McCall Model

@@ -514,23 +514,23 @@ class Qlearning_McCall:

514514

self.quit_allowed = quit_allowed

515515516516517-

def draw_offer_index(self):

517+

def draw_offer_index(self, rng):

518518

"""

519519

Draw a state index from the wage distribution.

520520

"""

521521522522

q = self.q

523-

return np.searchsorted(np.cumsum(q), np.random.random(), side="right")

523+

return np.searchsorted(np.cumsum(q), rng.random(), side="right")

524524525-

def temp_diff(self, qtable, state, accept):

525+

def temp_diff(self, qtable, state, accept, rng):

526526

"""

527527

Compute the TD associated with state and action.

528528

"""

529529530530

c, β, w = self.c, self.β, self.w

531531532532

if accept==0:

533-

state_next = self.draw_offer_index()

533+

state_next = self.draw_offer_index(rng)

534534

TD = c + β*np.max(qtable[state_next, :]) - qtable[state, accept]

535535

else:

536536

state_next = state

@@ -541,31 +541,31 @@ class Qlearning_McCall:

541541542542

return TD, state_next

543543544-

def run_one_epoch(self, qtable, max_times=20000):

544+

def run_one_epoch(self, qtable, rng, max_times=20000):

545545

"""

546546

Run an "epoch".

547547

"""

548548549549

c, β, w = self.c, self.β, self.w

550550

eps, δ, lr, T = self.eps, self.δ, self.lr, self.T

551551552-

s0 = self.draw_offer_index()

552+

s0 = self.draw_offer_index(rng)

553553

s = s0

554554

accept_count = 0

555555556556

for t in range(max_times):

557557558558

# choose action

559559

accept = np.argmax(qtable[s, :])

560-

if np.random.random()<=eps:

560+

if rng.random()<=eps:

561561

accept = 1 - accept

562562563563

if accept == 1:

564564

accept_count += 1

565565

else:

566566

accept_count = 0

567567568-

TD, s_next = self.temp_diff(qtable, s, accept)

568+

TD, s_next = self.temp_diff(qtable, s, accept, rng)

569569570570

# update qtable

571571

qtable_new = qtable.copy()

@@ -582,15 +582,15 @@ class Qlearning_McCall:

582582

return qtable_new

583583584584

@jit

585-

def run_epochs(N, qlmc, qtable):

585+

def run_epochs(N, qlmc, qtable, rng):

586586

"""

587587

Run epochs N times with qtable from the last iteration each time.

588588

"""

589589590590

for n in range(N):

591591

if n%(N/10)==0:

592592

print(f"Progress: EPOCHs = {n}")

593-

new_qtable = qlmc.run_one_epoch(qtable)

593+

new_qtable = qlmc.run_one_epoch(qtable, rng)

594594

qtable = new_qtable

595595596596

return qtable

@@ -608,7 +608,7 @@ qlmc = Qlearning_McCall()

608608609609

# run

610610

qtable0 = np.zeros((len(w_default), 2))

611-

qtable = run_epochs(20000, qlmc, qtable0)

611+

qtable = run_epochs(20000, qlmc, qtable0, rng)

612612

```

613613614614

```{code-cell} ipython3

@@ -685,7 +685,7 @@ def plot_epochs(epochs_to_plot, quit_allowed=1):

685685

ax.plot(w_new, valfunc_qlr, '-o', label=f'QL:epochs={n}, mean error={error}')

686686687687688-

new_qtable = qlmc_new.run_one_epoch(qtable)

688+

new_qtable = qlmc_new.run_one_epoch(qtable, rng)

689689

qtable = new_qtable

690690691691

ax.set_xlabel('wages')

Read the original on github.com ↗