如何解决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
相关产品推荐
相关产品推荐

