首页 > 解决方案 > 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

它有什么区别?我可以看到两个原因。

我们正在循环我们在循环内变异的对象,但是由于引入了生成器.send()方法,这不是可以接受的吗?

标签: pythonreinforcement-learning

解决方案


强化学习范式包括在环境中重复执行一个动作,该动作又返回一个新状态(还有奖励、一些信息和一个告诉你情节是否完成的布尔值)。

循环遍历环境的所有可能状态不符合 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

确实就是说,只要机器人没有抢到杯子,就应该看看环境,做出一个动作。然后他查看新的状态,根据新的观察做出新的动作,以此类推。


推荐阅读