使用PPO和多个工作人员的简单强化学习环境

时间:2020-06-16 08:25:20

标签: python reinforcement-learning openai-gym stable-baselines

我是钢筋加固领域的新手,可能需要一些帮助。

我试图实现自己的非常简单的机器人环境。所不同的是,我想使用6个单轴的角度代替TCP的笛卡尔坐标作为观察。因此,观察空间总和为一个包含13个元素的向量。前6个:当前轴值,后6个:目标值,最后一个是当前状态的分数。我减去实际位置和目标位置,计算出每个动作的“得分”。然后,我将总和超过绝对值,然后将其除以六。这样,我在演员执行的每个步骤中得到的分数在0到100之间。如果当前步骤是一个好步骤(得分>分数,旧),那么我将以+1奖励,如果不是,则以-2奖励。对于击中目标的演员,演员可获得200分的奖励
我的动作空间包括6轴的连续角运动。

我使用开放式AI基准PPO2作为强化算法来测试我的环境。 (https://stable-baselines.readthedocs.io/en/master/modules/ppo2.html

我第一次尝试达到单点。因此,我在每个情节之后将目标值重置为特定点。 第一次测量时,我只雇用了一名工人,学习曲线看起来非常好(见图:橙色)。 然后,我将工人最多堆积了12位,并且在我的想象中应该有相同的结果,但是更快? 我对结果感到有些失望,也不知道为什么结果如此糟糕(请参见图形:蓝色)。

episode reward graph

为了对环境进行矢量化处理,我使用了与stable_baselines.common中的make_vec_env类似的函数

def make_MY_vec_env(envCallback, n_envs=1, accuracy=100, seed=None, start_index=0,
             monitor_dir=None, wrapper_class=None,
             env_kwargs=None, vec_env_cls=None, vec_env_kwargs=None,name=""):
   """
   Based on stabel_baselines/common/cmd_util.py

   """
   env_kwargs = {} if env_kwargs is None else env_kwargs
   vec_env_kwargs = {} if vec_env_kwargs is None else vec_env_kwargs

   def make_env(rank):
       def _init():

           env = envCallback(accuracy,name=name)

           # Wrap the env in a Monitor wrapper
           # to have additional training information
           monitor_path = os.path.join(monitor_dir, str(rank)) if monitor_dir is not None else None
           # Create the monitor folder if needed
           if monitor_path is not None:
               os.makedirs(monitor_dir, exist_ok=True)
           env = Monitor(env, filename=monitor_path)
           # Optionally, wrap the environment with the provided wrapper
           if wrapper_class is not None:
               env = wrapper_class(env)
           return env
       return _init

   # No custom VecEnv is passed
   if vec_env_cls is None:
       # Default: use a DummyVecEnv
       vec_env_cls = DummyVecEnv

return vec_env_cls([make_env(i + start_index) for i in range(n_envs)], **vec_env_kwargs)

原始函数使用环境ID代替回调函数。这是我用以下代码替换的代码:

env = envCallback(准确性,名称=名称)。

        if isinstance(env_id, str):
            env = gym.make(env_id)
            if len(env_kwargs) > 0:
                warnings.warn("No environment class was passed (only an env ID) so `env_kwargs` will be ignored")
        else:
            env = env_id(**env_kwargs)
        if seed is not None:
            env.seed(seed + rank)
            env.action_space.seed(seed + rank)

我目前不使用种子,因为PPO2基线示例中的示例也未使用它。 有谁知道为什么我的向量化环境学习如此糟糕?

0 个答案:

没有答案