# DiscreteDP Example: Asset Replacement¶

Kosumi Mao

Department of Economics, University of Tokyo

From Miranda and Fackler, Applied Computational Economics and Finance, 2002, Section 7.6.2

Julia translation of the Python version

In [1]:
using QuantEcon

In [2]:
maxage = 5    # Maximum asset age
repcost = 75  # Replacement cost
beta = 0.9    # Discount factor
m = 2         # Number of actions; 1: keep, 2: replace;

In [3]:
S = [i for i in 1:maxage]
n = length(S);

In [4]:
# Reward array
R = Array{Float64}(n,m)
for i in 1:n
R[i, 1] = 50 - 2.5 * S[i] - 2.5 * S[i]^2
R[i, 2] = 50 - repcost
end

# Infeasible action
R[n,1] = -Inf;

In [5]:
R

Out[5]:
5×2 Array{Float64,2}:
45.0  -25.0
35.0  -25.0
20.0  -25.0
0.0  -25.0
-Inf    -25.0
In [6]:
# (Degenerate) transition probability array
Q = zeros(n,m,n)
for i in 1:n
Q[i, 1, min(i+1, n)] = 1
Q[i, 2, 1] = 1
end

In [7]:
Q

Out[7]:
5×2×5 Array{Float64,3}:
[:, :, 1] =
0.0  1.0
0.0  1.0
0.0  1.0
0.0  1.0
0.0  1.0

[:, :, 2] =
1.0  0.0
0.0  0.0
0.0  0.0
0.0  0.0
0.0  0.0

[:, :, 3] =
0.0  0.0
1.0  0.0
0.0  0.0
0.0  0.0
0.0  0.0

[:, :, 4] =
0.0  0.0
0.0  0.0
1.0  0.0
0.0  0.0
0.0  0.0

[:, :, 5] =
0.0  0.0
0.0  0.0
0.0  0.0
1.0  0.0
1.0  0.0
In [8]:
# Create a DiscreteDP
ddp = DiscreteDP(R, Q, beta);

In [9]:
# Solve the dynamic optimization problem (by policy iteration)
res = solve(ddp, PFI);

In [10]:
# Number of iterations
res.num_iter

Out[10]:
1
In [11]:
# Optimal value function
res.v

Out[11]:
5-element Array{Float64,1}:
216.56
190.622
172.914
169.904
169.904
In [12]:
# Optimal policy
res.sigma

Out[12]:
5-element Array{Int64,1}:
1
1
1
2
2
In [13]:
# Transition probability matrix
res.mc.p

Out[13]:
5×5 Array{Float64,2}:
0.0  1.0  0.0  0.0  0.0
0.0  0.0  1.0  0.0  0.0
0.0  0.0  0.0  1.0  0.0
1.0  0.0  0.0  0.0  0.0
1.0  0.0  0.0  0.0  0.0
In [14]:
# Simulate the controlled Markov chain
initial_state_value = 1
nyrs = 12
spath = simulate(res.mc, nyrs+1, init=initial_state_value);

In [15]:
using PyPlot

In [16]:
import PyPlot.plt
fig, axes = plt[:subplots](1, 2, figsize=(12, 4))
axes[1][:plot]( [i for i in 1:n], res.v)
axes[1][:set_xlim](1, 5)
axes[1][:set_ylim](160, 220)
axes[1][:set_xticks](linspace(1, 5, 5))
axes[1][:set_xlabel]("Age of Machine")
axes[1][:set_ylabel]("Value")
axes[1][:set_title]("Optimal Value Function")

axes[2][:plot](spath)
axes[2][:set_xlim](0, nyrs)
axes[2][:set_ylim](1, 4)
axes[2][:set_yticks](linspace(1, 4, 4))
axes[2][:set_xlabel]("Year")
axes[2][:set_ylabel]("Age of Machine")
axes[2][:set_title]("Optimal State Path")

Out[16]:
PyObject <matplotlib.text.Text object at 0x0000000043AB9780>