训练自定义MountainCar环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import gym
from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import DummyVecEnv
from stable_baselines3.common.evaluation import evaluate_policy
from stable_baselines3.common.monitor import Monitor

class CustomMountainCarEnv(gym.Env):
def __init__(self):
super(CustomMountainCarEnv, self).__init__()

self.env = gym.make('MountainCar-v0')

self.action_space = self.env.action_space
self.observation_space = self.env.observation_space

def step(self, action):
state, reward, done, info = self.env.step(action)

reward = -abs(state[0] - 0.5)

return state, reward, done, info

def reset(self):
return self.env.reset()

def render(self, mode='rgb_array'):
return self.env.render(mode=mode)

# 接下来你就可以像之前一样使用这个自定义环境了
env = CustomMountainCarEnv()

env = Monitor(env)
env = DummyVecEnv([lambda: env]) # 想让环境与stable_baselines兼容,必须要对环境进行向量化

# 开关,如果是True则为测试模式,直接加载模型,如果为False则训练模型
test_mode = False

# 根据开关状态选择模型加载或训练
if test_mode:
# 加载模型
model = PPO.load("ppo_cartpole")
else:
# 初始化并训练模型
model = PPO('MlpPolicy', env, verbose=1, learning_rate=0.01, ent_coef=0.1)
model.learn(total_timesteps=100000)
# 保存模型
model.save("ppo_cartpole")

# 评估模型
mean_reward, std_reward = evaluate_policy(model, env, n_eval_episodes=10)
print(f"Mean reward: {mean_reward} +/- {std_reward}")

successes = 0
# 测试代理
obs = env.reset()
for i in range(10000):
done = False
step = 0
while not done:
action, _ = model.predict(obs, deterministic=True)
obs, _, done, _ = env.step(action)
env.render()
step += 1
if done:
obs = env.reset()
if step != 200:
successes += 1
print(successes, step)

env.close()

这段代码主要是用于强化学习(Reinforcement Learning)模型训练和测试的。在这段代码中,首先创建了一个自定义的环境(CustomMountainCarEnv),然后在这个环境中训练一个使用PPO(Proximal Policy Optimization)算法的模型,最后对模型进行了测试。

让我们逐步地详细分析这段代码:

  1. 导入依赖库:这段代码中使用了gym、stable_baselines3等库。Gym是一个用于开发和比较强化学习算法的工具库,它包含了许多预定义的环境。stable_baselines3则是一个提供实现了各种强化学习算法的模型的库。

  2. 定义自定义环境(CustomMountainCarEnv):这个环境基于Gym库中的’MountainCar-v0’环境,但是修改了其奖励(reward)的计算方式。在新的奖励机制中,奖励与车辆的位置与目标位置(0.5)的距离成反比。

  3. 环境向量化和监控:使用DummyVecEnv进行环境向量化,这是与stable_baselines兼容所必需的,它允许模型在训练时采取批量(batch)的动作。而Monitor则是用来追踪训练过程中的一些指标,如奖励等。

  4. 模型的训练与加载:如果测试模式(test_mode)为False,就会训练一个新的模型;否则,就会加载一个已有的模型。训练模型时,使用的是PPO算法,这是一种策略优化算法,它可以在策略改变过程中保持一定的稳定性。

  5. 评估模型:使用stable_baselines3中的evaluate_policy方法,通过在环境中运行模型来评估其性能。这个过程会运行多次(n_eval_episodes=10),计算得出平均奖励(mean_reward)和奖励的标准差(std_reward)。

  6. 测试模型:通过让模型在环境中运行,查看模型的性能。每次环境结束后(done = True),如果步骤数不为200(这是’MountainCar-v0’环境的默认最大步数),就认为这是一个成功的尝试。

最后,关闭环境以释放资源。

总的来说,这段代码实现了在自定义环境中使用PPO模型进行强化学习的全过程,包括环境的定义、模型的训练、评估以及测试。