【问题标题】:Memoizing finite horizon dynamic programming记忆有限视界动态规划
【发布时间】: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


【解决方案1】:

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

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

这可能是您没有尝试记忆 V2 函数,而只是构建一个包含 t 值的字典,以找到为该 t 找到的最低值 V2(跨越 @ 的所有值987654335@)。如果是这种情况,那么您可以将字典键本身设为 t,并在您发现“更好”的值时替换现有值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2019-07-26
    • 2013-05-24
    相关资源
    最近更新 更多