Портирование примера из QuantEcon.jl в POMDPs.jl - PullRequest
0 голосов
/ 19 октября 2018

Я спросил об этом на сайте дискурса Джулии , но не получил ответа.Здесь я прошу посмотреть, повезет ли мне больше.

Просто для удовольствия (и чтобы узнать о POMDP) ​​я портирую пример динамического программирования из QuantEcon.jl в POMDPs.jl.Пример доступен здесь .

Мой код для реализации:

using POMDPs
using POMDPModels
using POMDPModelTools
using DiscreteValueIteration

struct SimpleOG{TI <: Integer, T <: Real, TR <: AbstractArray{T}, TQ <: AbstractArray{T}} <: MDP{T, T}
    B :: TI
    M :: TI
    α :: T
    β :: T
    R :: TR
    Q :: TQ
end

function SimpleOG(; B::Integer = 10, M::Integer = 5, α::T = 0.5, β::T = 0.90) where {T <: Real}

    u(c) = c^α # utility function
    n = B + M + 1
    m = M + 1

    R = Matrix{T}(undef, n, m)
    Q = zeros(Float64, n, m, n)

    for a in 0:M
        Q[:, a + 1, (a:(a + B)) .+ 1] .= 1 / (B + 1)
        for s in 0:(B + M)
            R[s + 1, a + 1] = a <= s ? u(s - a) : -Inf
        end
    end

    return SimpleOG(B, M, α, β, R, Q)
end

POMDPs.states(simpleog::SimpleOG) = collect(0:(simpleog.M + simpleog.B))
POMDPs.n_states(simpleog::SimpleOG) = simpleog.B + simpleog.M + 1
POMDPs.stateindex(simpleog::SimpleOG, s) = Int(s) + 1

POMDPs.actions(simpleog::SimpleOG) = collect(0:simpleog.M)
POMDPs.n_actions(simpleog::SimpleOG) = simpleog.M + 1
POMDPs.actionindex(simpleog::SimpleOG, a) = Int(a) + 1

POMDPs.transition(simpleog::SimpleOG, s, a) = simpleog.Q[Int(a) + 1, Int(s) + 1, :]

POMDPs.reward(simpleog::SimpleOG, s, a) = simpleog.R[Int(s), Int(a)]
POMDPs.reward(simpleog::SimpleOG, s, a, sp) = reward(simpleog, s, a)

POMDPs.discount(simpleog::SimpleOG) = simpleog.β

g = SimpleOG()

Когда я пытаюсь решить модель, я получаю:

julia> POMDPs.solve(g)
MethodError: no method matching solve(::SimpleOG{Int64,Float64,Array{Float64,2},Array{Float64,3}})
Closest candidates are:
  solve(!Matched::POMDPPolicies.FunctionSolver, !Matched::Union{MDP, POMDP}) at /Users/amrods/.julia/packages/POMDPPolicies/oW6ud/src/function.jl:23
  solve(!Matched::POMDPPolicies.RandomSolver, !Matched::Union{MDP, POMDP}) at /Users/amrods/.julia/packages/POMDPPolicies/oW6ud/src/random.jl:36
  solve(!Matched::POMDPPolicies.VectorSolver{A}, !Matched::MDP{S,A}) where {S, A} at /Users/amrods/.julia/packages/POMDPPolicies/oW6ud/src/vector.jl:23
  ...

Stacktrace:
 [1] top-level scope at In[14]:1

Можете ли вы помочь мне понять, что происходит?

1 Ответ

0 голосов
/ 20 октября 2018

Что сказал hckr: POMDP.jl определяет стандартный интерфейс, вроде JuMP.jl.

После определения вашей модели вам нужен решатель, чтобы решить ее.

QMDP.jl равен единице, SARSOP.jl равендругая или простая старая итерация дискретного значения тоже может работать.Вы можете взять на вооружение ажиотаж с глубоким обучением и попробовать Deep Q Learning .

Существует множество различных алгоритмов решения, и вы также можете написать свой собственный (см. POMDP.jl * 1015).* документы и примеры).

Книга доктора Кохендерфера проходит через многие из них (полное раскрытие, он был моим учителем), как и многие, многие статьи

Править:
Что касается бита pdf (это было слишком долго для комментария):
К сожалению, с этими пакетами много всего происходит.
Так что есть пара связанных примеров с этим блокнотом здесь (более старый) и чуть более актуальный здесь .К сожалению, ни один не упоминает pdf, но другие примеры (TMazes и Tabular), как и этот другой более старый пример .

Зарывая лидерство, это выглядит как ваша лучшая ставка для прогулки, а это для документации
transition(::MDP, ::State, ::Action) возвращает немноготип объекта распределения, который будет подан в pdf.Это может быть <:Distributions.Distribution или нет.Все, что должно быть, это представление T(s' | s, a) = pdf(transition(mdp, s, a), s').Поскольку MDP имеют вероятностный характер, для явного интерфейса требуется количественная оценка вероятностей перехода между состояниями при заданных действиях.

Надеюсь, что это помогает, и извините, это такой беспокойный ... все.Я знаю лабораторию, им бы понравились любые отзывы о ваших проблемах, в частности, с документацией и любой помощью, которую вы можете получить с помощью запросов на извлечение:)

...