如何在 OpenAI Gym 中定义具有连续值的离散动作空间?

数据挖掘 强化学习 开放式健身房 执行
2021-09-27 03:00:08

我正在尝试在 OpenAI Gym 环境中使用强化学习解决方案,该环境具有 6 个具有连续值的离散动作,例如将参数 1 增加为 2.2,将参数 1 减少为 1.6,将参数 3 减少为 1 等。

我在这段代码中看到,这样的动作空间被实现为一个连续空间,其中第一个值近似于离散值(例如,如果小于 1,则为 0,如果小于 2 且大于 1,则为 2)。

有人知道上述解决方案是否是实现这种行动空间的正确方法吗?还是健身房提供另一种方式?

1个回答

这是一个演示这一点的示例环境。它依赖环境成功过滤出正确的连续控制元素

import gym
from gym.spaces import Dict, Discrete, Box, Tuple
import numpy as np


class SampleGym(gym.Env):
    def __init__(self, config={}):
        self.config = config
        self.action_space = Tuple((Discrete(2), Box(-10, 10, (2,))))
        self.observation_space = Box(-10, 10, (2, 2))
        self.p_done = config.get("p_done", 0.1)

    def reset(self):
        return self.observation_space.sample()

    def step(self, action):
        chosen_action = action[0]
        cnt_control = action[1][chosen_action]

        if chosen_action == 0:
            reward = cnt_control
        else:
            reward = -cnt_control - 1

        print(f"Action, {chosen_action} continuous ctrl {cnt_control}")
        return (
            self.observation_space.sample(),
            reward,
            bool(np.random.choice([True, False], p=[self.p_done, 1.0 - self.p_done])),
            {},
        )


if __name__ == "__main__":
    env = SampleGym()
    env.reset()
    env.step((1, [-1, 2.1]))  # should say use action 1 with 2.1
    env.step((0, [-1.1, 2.1]))  # should say use action 0 with -1.1
```