python - Python 生成器代替类对象作为强化学习环境
问题描述
使用强化学习环境的典型方式如下所示:
env = Environment()
while not env.done:
state = env.state
action = choose_action(state)
env.step(action)
results = env.results
但是这样会不会更pythonic:
env = Environment()
for state in env:
action = choose_action(state)
env.step(action)
else:
results = env.results
它有什么区别?我可以看到两个原因。
- 更少的代码:在后一个示例中,我们不需要担心
env.done
或跟踪我们所处的状态,生成器将自动拾取我们离开的位置 - 轻松复制:我们可以在每个状态轻松复制生成器以评估不同的策略
我们正在循环我们在循环内变异的对象,但是由于引入了生成器.send()
方法,这不是可以接受的吗?
解决方案
强化学习范式包括在环境中重复执行一个动作,该动作又返回一个新状态(还有奖励、一些信息和一个告诉你情节是否完成的布尔值)。
循环遍历环境的所有可能状态不符合 RL 的精神。这是一个例子来说明我的意思:
假设一个机器人必须为一杯咖啡评分。每毫秒,机器人都会收到来自其内部摄像头的图像。那么,状态空间就是它的相机可以返回的可能图像的状态,对吧?这样做
for state in env:
action = choose_action(state)
env.step(action)
意思是依次看到世界给他的所有可能的图像,机器人就会做出相应的动作,这显然不是你想让他做的。你想让他按照他刚刚从之前的状态看到的东西来做另一个新的一致的动作。
因此,这段代码的动态肯定更有意义:
while not env.done:
state = env.state
action = choose_action(state)
env.step(action)
results = env.results
确实就是说,只要机器人没有抢到杯子,就应该看看环境,做出一个动作。然后他查看新的状态,根据新的观察做出新的动作,以此类推。
推荐阅读
- html - Bootstrap页脚生成水平条的问题
- cordova - Ionic 3:从 Firebase 下载图像时出现 Null 异常的 FileTransferError
- android - 条目名称“AndroidManifest.xml”发生冲突(将 android gradle 插件更新到 3.6.0 后构建失败)
- asp.net-mvc - 即使验证失败,登录请求仍在进行中
- wordpress - WP Metabpx 分类术语下拉菜单仅部分保存
- java - 带有圆形掩码的 OpenCV 阈值
- flutter - StaggeredGridView 的动态高度在颤振项目中不起作用
- c++ - 如何在 Visual Studio 17 c++ 中使用 curl 发布到没有身份验证的服务器
- python - 根据列表更改文本和图像刺激
- c# - HttpClient 发布请求,并收到此错误“StatusCode:500,ReasonPhrase:'内部服务器错误',版本:1.1,”