You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Julia强化学习库兼容性及自定义环境报错问题

问题解决与优化建议

A. 解决StateTransformedEnv报错

报错核心原因是你最后一行代码传入了环境类型LotteryEnv,但StateTransformedEnv的构造函数要求传入已初始化的环境实例(比如你之前定义的env),而非类型本身。

修正步骤

将代码最后一行:

LotteryEnv |> StateTransformedEnv |> ActionTransformedEnv

替换为基于环境实例的写法(若要创建包装后的环境实例):

env |> StateTransformedEnv(; state_mapping=s->s?1:2, state_space_mapping=_->Base.OneTo(2)) |> ActionTransformedEnv(; action_mapping=i->action_space(env)[i], action_space_mapping=_->Base.OneTo(3))

你之前定义的wrapped_env代码是正确的,报错仅来自最后一行错误的类型传递操作。

B. 提前避免依赖与版本问题的方法

针对你遇到的库加载、版本兼容类问题,可采用以下实用方案:

  • 锁定依赖版本:在项目根目录创建Project.toml,直接复用官方教程提供的依赖版本配置,或通过pkg> add ReinforcementLearning@x.y.z命令指定与教程匹配的版本,规避新版本API变更引发的错误。
  • 显式加载所有依赖:所有用到的子模块必须显式using,比如用到MonteCarloLearner需添加using ReinforcementLearningAnIntroduction,用到Flux组件需添加using Flux或using Flux: InvDecay。
  • 验证环境合法性:自定义环境后,运行RLBase.test_runnable!(env)(取消你代码中该行的注释),提前检查环境是否符合AbstractEnv接口规范,避免后续运行时的隐性错误。
  • 利用包管理器排查:通过pkg> status查看已安装包版本,pkg> resolve自动解决依赖冲突,pkg> update PackageName仅更新指定包而不影响其他依赖。
  • 优先参考官方示例:各包的官方示例(如ReinforcementLearning.jl的GitHub仓库examples目录)会明确列出所需依赖和版本,直接复用示例中的Project.toml可规避大部分环境搭建问题。

修正后的完整代码示例

using ReinforcementLearning
using Flux: InvDecay

Base.@kwdef mutable struct LotteryEnv <: AbstractEnv
    reward::Union{Nothing, Int} = nothing
end

RLBase.action_space(env::LotteryEnv) = (:PowerRich, :MegaHaul, nothing)
RLBase.reward(env::LotteryEnv) = env.reward
RLBase.state(env::LotteryEnv) = !isnothing(env.reward)
RLBase.state_space(env::LotteryEnv) = [false, true]
RLBase.is_terminated(env::LotteryEnv) = !isnothing(env.reward)
RLBase.reset!(env::LotteryEnv) = env.reward = nothing

function (x::LotteryEnv)(action)
    if action == :PowerRich
        x.reward = rand() < 0.01 ? 100_000_000 : -10
    elseif action == :MegaHaul
        x.reward = rand() < 0.05 ? 1_000_000 : -10
    elseif isnothing(action) 
        x.reward = 0
    else
        @error "unknown action of $action"
    end
end

env = LotteryEnv()
RLBase.test_runnable!(env)  # 验证环境合法性

n_episode = 1000
run(RandomPolicy(action_space(env)), env, StopAfterEpisode(n_episode))

hook = TotalRewardPerEpisode()
run(RandomPolicy(action_space(env)), env, StopAfterEpisode(n_episode), hook)

# using Plots
# plot(hook.rewards)

p = QBasedPolicy(
    learner = MonteCarloLearner(;
        approximator=TabularQApproximator(
            ;n_state = length(state_space(env)),
            n_action = length(action_space(env)),
            opt = InvDecay(1.0)
        )
    ),
    explorer = EpsilonGreedyExplorer(0.1)
)

wrapped_env = ActionTransformedEnv(
    StateTransformedEnv(
        env;
        state_mapping=s -> s ? 1 : 2,
        state_space_mapping = _ -> Base.OneTo(2)
    );
    action_mapping = i -> action_space(env)[i],
    action_space_mapping = _ -> Base.OneTo(3),
)

# 修正后的包装器组合写法
wrapped_env_2 = env |> 
    StateTransformedEnv(; state_mapping=s->s?1:2, state_space_mapping=_->Base.OneTo(2)) |> 
    ActionTransformedEnv(; action_mapping=i->action_space(env)[i], action_space_mapping=_->Base.OneTo(3))

内容的提问来源于stack exchange,提问作者Mike75

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:17:09