Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Parte 3, resolviendo CartPole con Random Search

Ahora que ya conocemos perfectamente el entorno en el cual funciona Cartpole, vamos a empezar a utilizar algunas técnicas de IA, en concreto de RL ( Aprendizaje Reforzado , Reinforcement Learning), para que nuestro agente aprenda a resolverlo. Cartpole tiene un espacio de observación de sólo cuatro dimensiones (posición del carro, velocidad del carro, ángulo de la varilla y velocidad de rotación de la varilla) y sólo dos acciones a realizar (mover a la izquierda o a la derecha el carro). Esto hace que sea perfecto como base para probar algunas técnicas de RL y aprender cómo funcionan de la manera más sencilla posible.
import gym
from gym import wrappers
import numpy as np
def run_episode(env, parameters):
observation = env.reset()
totalreward = 0
for intento in range(200):
action = 0 if np.matmul(parameters,observation) < 0 else 1
observation, reward, done, info = env.step(action)
totalreward += reward
if done:
break
return totalreward
env = gym.make('CartPole-v0')
env = wrappers.Monitor(env, 'CartPole1', force=True)
bestparams = None
parameters = None
bestreward = 0
for episodios in range(10000):
parameters = np.random.rand(4) * 2 - 1
reward = run_episode(env,parameters)
print ("Episodio ",episodios," terminado con recompensa: ",reward)
if reward > bestreward:
bestreward = reward
bestparams = parameters
if reward == 200:
break
import gym
from gym import wrappers
import numpy as np
env = gym.make('CartPole-v0')
env = wrappers.Monitor(env, 'CartPole1', force=True)
bestparams = None
parameters = None
bestreward = 0
for episodios in range(10000):
parameters = np.random.rand(4) * 2 - 1
reward = run_episode(env,parameters)
print ("Episodio ",episodios," terminado con recompensa: ",reward)
if reward > bestreward:
bestreward = reward
bestparams = parameters
if reward == 200:
break
def run_episode(env, parameters):
totalreward = 0
observation = env.reset()
for intento in range(200):
action = 0 if np.matmul(parameters,observation) < 0 else 1
observation, reward, done, info = env.step(action)
totalreward += reward
if done:
break
return totalreward
input ("Pulsa Enter para probar el resultado del aprendizaje") for b in range(5000): run_episode(env,bestparams) input ("Terminado")
Vamos a ver un vídeo completo con una ejecución de aprendizaje y luego de puesta en práctica de la solución. Veremos cómo los episodios de aprendizaje terminan cuando se obtiene el valor de recompensa 200, en este caso ocurre en el episodio 5 como podemos ver en el siguiente fotograma del vídeo:
A partir de este punto se ejecutan varias simulaciones con los resultados obtenidos durante el entrenamiento: