Julia 记忆有限时域动态规划

Julia 记忆有限时域动态规划,julia,dynamic-programming,memoization,Julia,Dynamic Programming,Memoization,我会在这里试着问: 所以我试图编写一个简单的有限时间动态规划问题 我试图用记忆来加速计算时间 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′ -

我会在这里试着问:

所以我试图编写一个简单的有限时间动态规划问题

我试图用记忆来加速计算时间

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)
我有两个问题:

这就是记忆化的实现方式吗

为什么
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
  ⋮                => ⋮

它看起来是
V2
函数的一个合理的记忆实现

V2
的输出不仅取决于第一个参数
t
,还取决于第二个参数
K
。因此,要记忆
V2
的输出,dictionary键必须同时包含
t
K
,它确实如此。但这意味着您将获得具有相同
t
值的多个键,因为
t
不是整个键;钥匙是
(t,K)

这可能是因为您没有试图记忆
V2
函数,而只是构建了一个
t
值字典,将
V2
的最低值设置为
t
(跨越
K
的所有值)。如果是这种情况,那么您可以让dictionary键本身为
t
,并在发现“更好”的值时替换现有值。

旁注:
get!(函数、集合、键)
可以使您的代码更加优雅,删除
if haskey…
。您的意思是编写
get!(V2(t,K),V2dict(t,K))
?有任何表现惩罚吗?没有,就像。第一个参数必须是函数,而不是调用。至于表演:我不知道,但我猜不是真的。