首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rllib中的复杂动作掩码

rllib中的复杂动作掩码
EN

Stack Overflow用户
提问于 2021-02-28 04:00:32
回答 1查看 599关注 0票数 1

在rllib示例中提供了一个参数/可变长度的动作模型。该示例假设输出为单个分类操作dist的逻辑。如何用更复杂的输出来完成这项工作?

例如,一个盒子里有200个不同的球。每一步第2步球都会被摘下来放回去。动作空间可以定义为多重离散(200,200)或元组(spaces.Discrete(200),spaces.Discrete(200))。

有3种限制使某些操作无效。

  1. 每次两个球是不同的。因此,像(1,1)或(2,2)这样的操作是无效的。
  2. 同样颜色的球不允许一起摘。例如,2号球和3号球都是黄色的,所以在某种状态下不能一起选择。因此在这种状态下,动作(1,2)是无效的。
  3. 某些球在特定的状态下是不允许摘的。例如,当2号球被标记为不允许选择时,所有与2号球类似的动作(1,n)或(n,1)都无效。

如何通过rllib中的动作掩蔽来强制执行这三个约束。

假设我们的obs空间有两个部分。第一个约束是内嵌的。无效动作可以在没有观察空间的情况下确定。对于第二个约束,A real_obs用指示其颜色的数字标记每个球。同一号码的球不允许一起摘。对于第三个约束,一个action_mask,它指示是否允许选择球。

具体来说,如何在自定义模型中实现动作/观察空间和前向函数?

如果我的obs空间假设是不可行的。您可以定义您的obs空间和相应的自定义模型。

rllib中的ParametricActionsModel示例

EN

回答 1

Stack Overflow用户

发布于 2021-05-05 10:41:42

我也遇到过同样的问题。最大的问题是你的两个动作之间的依赖性(例如不能两次接同一个球)。所以你能做的一件事就是把它们相乘,这样你就有了一个很大的200x200=40000动作空间。然后,您可以在env中创建完整的掩码,并将其传递给掩蔽的前向函数。其他明智的做法是,您需要使用依赖的动作采样和分布。

对我来说,乘法不是一个选项,因为它将是巨大的。所以我做了如下的方法:

  1. Env为操作1创建一个掩码,为依赖的操作2创建XXX掩码。
  2. 在模型中,您将使用操作1掩码(使用tf.random.categorical)对操作1进行示例。
  3. 根据操作1,您可以为操作2 (tf.where)和示例操作2选择一个掩码。
  4. 模型的输出应该是逻辑和采样动作。
  5. 您需要实现您自己的MultiCategorical操作发行版才能使用您已经采样过的操作。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66405687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档