【发布时间】:2019-01-17 21:37:23
【问题描述】:
我会尝试在这里询问my questions:
所以我正在尝试编写一个简单的有限视界动态规划问题。
我正在尝试使用记忆化来加快计算时间。
using Optim
V2dict = Dict()
function V2(t, K)
if t >= T
return 0.0
else
if haskey(V2dict, (t, K))
return V2dict[t, K]
else
opt = optimize(K′ -> -(log(K - K′) + β * V2(t+1, K′)), eps(), K, iterations = 100_000)
V2dict[t, K] = Optim.minimum(opt)
return V2dict[t, K]
end
end
end
T = 6
β = 0.95
@time V2(1, 100)
#-6.333197046721626
# 32.262246 seconds (1.36 G allocations: 21.515 GiB, 14.51% gc time)
我有两个问题:
memoization 应该是这样实现的吗?
为什么V2dict 为每个t 保存许多密钥?我只是想保存V2 的最佳值。
V2dict
Dict{Any,Any} with 1799 entries:
(4, 3.32187e-5) => -24.3578
(5, 5.22198e-15) => 32.9762
(5, 4.50844e-16) => 36.4949
(4, 8.69678e-5) => -25.3202
(5, 2.6052e-12) => 26.6737
(5, 2.19599e-9) => 19.9366
(5, 7.22726e-16) => 35.7118
(5, 3.94054e-8) => 17.0494
(5, 0.118624) => 2.1318
(4, 1.3312e-14) => -2.68559
(4, 0.000596086) => -27.245
(3, 4.50844e-16) => 35.5843
(5, 6.72888e-16) => 35.8166
(5, 0.0453104) => 3.09422
⋮ => ⋮
【问题讨论】:
-
旁注:
get!(f::Function, collection, key)可以让你的代码更优雅,去掉if haskey ...。 -
你的意思是写
get!(V2(t, K), V2dict, (t, K))?是否有任何性能损失? -
不,比如that。第一个参数必须是函数,而不是调用。至于表现:我不知道,但我猜不是。
标签: julia dynamic-programming memoization