强化学习ROS实战-RLagent解析(下)

2.深入了解Agent

2.1.agent整体架构

由于统一接口的需要,ROS端的agent接口全部可以由agent.cpp提供交互,其中提供了可以由命令行参数修改的各种引擎配置。其自带引擎有:

  • DiscretizationAgent
  • QLearner
  • ModelBasedAgent
  • SavedPolicy
  • Dyna
  • Sarsa

接口提供了两个publisher,分别为

  • out_rl_action 发布由引擎决策的下一部动作 发布在topic rl_agent/rl_action 消息类型为RLAction
  • out_exp_infp 在每一个周期结束时候发布训练信息 发布在topic rl_agent/rl_experiment_info 消息类型为RLExperimentInfo

三个subscriber,分别为:

  • rl_description 获取环境基本信息 订阅rl_env/rl_env_description 消息类型为 RLEnvDescription
  • rl_state 获取当前环境的状态 订阅rl_env/rl_state_reward
  • rl_seed 订阅rl_env/rl_seed

processEnvDescription:
初始化引擎中的环境信息,一般所有状态的价值都先假定初始为0
重置迭代状态,episode_number和episode_reward为0
设置firstAction标记为true

processState:
输入环境反馈的当前状态,返回一个决策动作
如果当前动作为第一个动作,则调用引擎first_action方法直接反馈决策
若当前动作不为第一个
累加状态收益
如果当前状态为结束状态,则调用last_action方法输出动作,并输出该次迭代结果
否则 调用next_action 并发布下一步动作

processSeed:
提供一系列的经验 用来初始化引擎。

2.2.SARSA Agent

了解大概的架构之后,让我们再深入对一个引擎进行了解。在这里,先选择SARSA算法的实现作为例子。在之前的文章已经介绍过了,sara是一种在线时间差分控制算法。他在状态转换是一个马尔科夫过程的前提下,通过单个的状态经验进行动作-状态价值函数的估计并决定最佳动作。

2.2.1.sarsa 引擎结构

SARSA引擎的初始化定义: Sarsa(int numactions, float gamma,
float initialvalue, float alpha, float epsilon, float lambda,
Random rng = Random())
参数列表及其解释:

  • \param numactions 可能采取的动作的数目
  • \param gamma 衰减系数(0~1)
  • \param initialvalue 每个动作收益评价Q(s,a)的初始值
  • \param alpha 学习率
  • \param epsilon 采取随机策略的概率
  • \param rng 随机数种子

提供方法:
virtual int first_action(const std::vector &s);
引擎初始时刻调用,输入初始状态,输出决策动作
virtual int next_action(float r, const std::vector &s);
引擎工作时刻调用,输入奖励和状态s,输出决策动作
virtual void last_action(float r);
状态链结束时刻调用,输出最终动作
virtual void setDebug(bool d);
debug模式标记
virtual void seedExp(std::vector);
预训练模型框架
virtual void savePolicy(const char* filename);
存储策略
void printState(const std::vector &s);
打印当前状态
float getValue(std::vector state);
获得当前状态的收益值

2.2.2.状态定义

首先需要解决的是状态量化问题,在很多问题中状态的数目可能是无穷多个的,但是计算机没有办法处理无穷个状态,所以需要想办法把状态量化到有穷单位上面去。
SARSA agent用了一个set表达所有遇到过的状态,

std::set<std::vector<float> > statespace;

并且提供了的Sarsa::state_t Sarsa::canonicalize(const std::vector &s) 函数来维护状态的数目,的设计哲学在于:只维护已知的状态,也就是说只在状态列表里面管理出现过的状态。由此状态-动作函数的Q矩阵和追踪迹矩阵eligible也相应的只维护出现过的状态,在出现新状态的时候会对map做插入处理。

Sarsa::state_t Sarsa::canonicalize(const std::vector<float> &s) 
{
    const std::pair<std::set<std::vector<float> >::iterator, bool> result =
    statespace.insert(s);
    state_t retval = &*result.first; // Dereference iterator then get pointer 
    if (result.second) { // s is new, so initialize Q(s,a) for all a
    std::vector<float> &Q_s = Q[retval];
    Q_s.resize(numactions,initialvalue);
    std::vector<float> &elig = eligibility[retval];
    elig.resize(numactions,0);
    }
    return retval; 
}

接下来就是对于状态-动作函数的Q矩阵以及状态-动作概率的eligible矩阵的维护。
SARSA使用一个map

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值