使用强化学习环境的典型方式如下:
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()
方法,这不是可以接受的吗?
答案 0 :(得分:1)
“强化学习”范式包括在环境中反复执行一个动作,该动作反过来又会返回一个新状态(还有奖励,一些信息和一个布尔值,告诉您情节是否完成)。
围绕环境的所有可能状态与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
实际上,这意味着,只要机器人没有抓住杯子,他就应该观察环境并采取行动。然后,他查看新状态并根据新状态进行新操作,依此类推。
答案 1 :(得分:0)
当然可以接受。
使用发电机是优雅的,但你没有被迫在任何地方坚持它们。实际上我认为while
片段是最清晰的,因为推送状态会增加一些开销,并且Python中的可变性通常很昂贵。
然而,既然你的问题,而不是一个问题更像是编码风格和个人意见的问题,那么就会有不同的意见,我无法真正解决这个问题。
我会避免可变性并坚持while
。