强化学习入门系列三VS强化游戏gym环境的使用

文章目录

  • 1. Gym库的使用方法
  • 2. Gym中游戏的基本信息
  • 3. Gym游戏的几个例子
    • 3.1 小车翻沟
    • 3.2 冰冻湖游戏

1. Gym库的使用方法

Gym是OpenAI推出的免费的强化学习实验环境,支持python语言。

Gym拥有各种环境,从 简单到复杂,涉及许多不同种类的数据。包括:
  >经典控制和玩具文字:完成小规模的任务,大部分来自RL文献。用于入门。
  >算法化:执行计算,例如添加多位数和反转顺序。
  >Atari:经典的Atari游戏。使用易于安装的Arcade学习环境。
  >2D和3D机器人:在仿真中控制机器人。这些任务使用了MuJoCo物理引擎,该引擎设计用于快速而准确的机器人仿真。
  
gym库的安装和内置游戏的查看在强化学习系列博客的第一篇第六部分有介绍。强化学习入门系列一

Gym库的使用方法是:用env=gym.make(环境名)加载环境,用env.reset()初始化环境,用env.step(动作)执行一步环境,用env.render()显示环境,用env.close()关闭环境。

2. Gym中游戏的基本信息

在选择gym中的游戏作为算法的实验环境之前,必须了解这个游戏的环境设置。
一个方法是查看游戏环境的源码,另一个方法是直接调用一些接口查看环境的简单信息。

import gym

env = gym.make('MountainCar-v0')
print('观测空间={}'.format(env.observation_space))
print('动作空间={}'.format(env.action_space))
print('观测范围={}~{}'.format(env.observation_space.low, env.observation_space.high))
print('动作数={}'.format(env.action_space.n))

结果如下所示:
强化学习入门系列三VS强化游戏gym环境的使用_第1张图片

3. Gym游戏的几个例子

3.1 小车翻沟

import gym
import time

'''
    基于强化学习实现小车自适应翻越小沟
'''
class BespokeAgent:
    def __init__(self, env):
        pass

    def decide(self, observation):
        position, velocity = observation
        lb = min(-0.09 * (position + 0.25) ** 2 + 0.03, 0.3 * (position + 0.9) ** 4 - 0.008)
        ub = -0.07 * (position + 0.38) ** 2 + 0.06
        if lb < velocity < ub:
            action = 2
        else:
            action = 0
        return action  # 返回动作

    def learn(self, *args):  # 学习
        pass

    def play_ones(self, env, agent, render=False, train=False):
        episode_reward = 0  # 记录回合总奖励,初始值为0
        observation = env.reset()  # 重置游戏环境,开始新回合
        while True:  # 不断循环,直到回合结束
            if render:  # 判断是否显示
                env.render()  # 显示图形界面,可以用env.close()关闭
            action = agent.decide(observation)
            next_observation, reward, done, _ = env.step(action)  # 执行动作
            episode_reward += reward  # 搜集回合奖励
            if train:  # 判断是否训练智能体
                break
            observation = next_observation
        return episode_reward  # 返回回合总奖励

if __name__ == '__main__':
    env = gym.make('MountainCar-v0')
    env.seed(0)  # 设置随机数种子,只是为了让结果可以精确复现,一般情况下可以删除

    agent = BespokeAgent(env)
    for _ in range(100):
        episode_reward = agent.play_ones(env, agent, render=True)
        print('回合奖励={}'.format(episode_reward))

    time.sleep(10)  # 停顿10s
    env.close()  # 关闭图形化界面

结果如下:
强化学习入门系列三VS强化游戏gym环境的使用_第2张图片

3.2 冰冻湖游戏

冰冻湖游戏的背景:从你家到办公室有一个冰冻的湖泊,你应该在冰冻的湖面上走到你的办公室。 但是在它们之间的冰冻湖中会有一个洞,因此在冰冻的湖中行走时要小心,以免被困在洞中,这个游戏的强化算法就是要学习并选择出一条最优的道路,这里的示例代码仅作为一个使用gym的展示,具体的基于状态值函数和基于动作值函数的方式在之后的博客会介绍。

import gym
import numpy as np
env=gym.make('FrozenLake-v0')
def value_iteration(env,gamma):
   value_table=np.zeros(env.observation_space.n)
   no_of_iterations=1000000
   threshold=1e-20
   for i in range(no_of_iterations):
      updated_value_table=np.copy(value_table)
      for state in range(env.observation_space.n):
         Q_value=[]
         for action in range(env.action_space.n):
            next_states_rewards=[]
            for next_sr in env.env.P[state][action]:
               trans_prob,next_state,reward_prob,_=next_sr
               next_states_rewards.append((trans_prob*(reward_prob+gamma*updated_value_table[next_state])))
               Q_value.append(np.sum(next_states_rewards))
            value_table[state]=max(Q_value)
         if(np.sum(np.fabs(updated_value_table-value_table))<=threshold):
            print('Value-iteration converged at iteration# %d '%(i+1))
            break
      return value_table

def extract_policy(value_table,gamma):
   policy=np.zeros(env.observation_space.n)
   for state in range (env.observation_space.n):
      Q_table=np.zeros(env.action_space.n)
      for action in range(env.action_space.n):
         for next_sr in env.env.P[state][action]:
            trans_prob,next_state,reward_prob,_=next_sr
            Q_table[action]+=(trans_prob*(reward_prob+gamma*value_table[next_state]))
            policy[state]=np.argmax(Q_table)
   return policy

optimal_value_function=value_iteration(env=env,gamma=1.0)
optimal_policy=extract_policy(optimal_value_function,gamma=1.0)

print(optimal_policy)
print(optimal_value_function)

结果如下:
强化学习入门系列三VS强化游戏gym环境的使用_第3张图片

你可能感兴趣的:(强化学习入门系列三VS强化游戏gym环境的使用)