Gym是OpenAI推出的免费的强化学习实验环境,支持python语言。
Gym拥有各种环境,从 简单到复杂,涉及许多不同种类的数据。包括:
>经典控制和玩具文字:完成小规模的任务,大部分来自RL文献。用于入门。
>算法化:执行计算,例如添加多位数和反转顺序。
>Atari:经典的Atari游戏。使用易于安装的Arcade学习环境。
>2D和3D机器人:在仿真中控制机器人。这些任务使用了MuJoCo物理引擎,该引擎设计用于快速而准确的机器人仿真。
gym库的安装和内置游戏的查看在强化学习系列博客的第一篇第六部分有介绍。强化学习入门系列一
Gym库的使用方法是:用env=gym.make(环境名)加载环境,用env.reset()初始化环境,用env.step(动作)执行一步环境,用env.render()显示环境,用env.close()关闭环境。
在选择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))
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() # 关闭图形化界面
冰冻湖游戏的背景:从你家到办公室有一个冰冻的湖泊,你应该在冰冻的湖面上走到你的办公室。 但是在它们之间的冰冻湖中会有一个洞,因此在冰冻的湖中行走时要小心,以免被困在洞中,这个游戏的强化算法就是要学习并选择出一条最优的道路,这里的示例代码仅作为一个使用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)