Soluciones tabulares

En esta proyecto nos centraremos en la definición de un entorno e implementaremos los diferentes métodos para buscar una solución óptima del problema.

0. El entorno WindyGridWorld

El entorno WindyGridWorld consiste en un agente que se mueve en una cuadrícula 7x10 (alto x ancho). En cada paso, el agente tiene 4 opciones de acción o movimiento: ARRIBA, ABAJO, DERECHA, IZQUIERDA. El agente siempre sale de la misma casilla [3, 0] y el juego termina cuando el agente llega a la casilla de llegada [3, 7].

El entorno se corresponde con el ejemplo 'Cuadrícula con viento' explicado en la sección 3.1.2. el módulo "Métodos de Diferencia Temporal". El problema radica en que hay un viento que empuja al agente hacia arriba en la parte central de la cuadrícula. Esto provoca que, aunque se ejecute una acción estándar, en la región central los estados resultantes se desplazan hacia arriba por un viento cuya fuerza varía entre columnas.

El código para implementar este entorno, que se encuentra disponible en el fichero adjunto windy_gridworld_env.py, ha sido adaptado del siguiente enlace:

Vamos a empezar cargando el entorno y ver qué características tiene, ejecutando un episodio de prueba.

0.1. Carga de datos

El siguiente código carga los paquetes necesarios para el ejemplo, crea el entorno mediante la instanciación de un objeto de la clase WindyGridworldEnv (importada del archivo adjunto windy_gridworld_env.py) e imprime por pantalla la dimensión del espacio de acciones (0=arriba, 1=derecha, 2=abajo y 3=izquierda), el espacio de observaciones (una tupla que indica la posición del agente en la cuadrícula) y el rango de la variable de recompensa (cuyo valor es -1 para cualquier acción y que por tanto va de menos infinito a más infinito).

In [1]:
!pip install gym
DEPRECATION: Python 3.5 reached the end of its life on September 13th, 2020. Please upgrade your Python as Python 3.5 is no longer maintained. pip 21.0 will drop support for Python 3.5 in January 2021. pip 21.0 will remove support for this functionality.
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: gym in /usr/local/lib/python3.5/dist-packages (0.17.3)
Requirement already satisfied: pyglet<=1.5.0,>=1.4.0 in /usr/local/lib/python3.5/dist-packages (from gym) (1.5.0)
Requirement already satisfied: numpy>=1.10.4 in /usr/local/lib/python3.5/dist-packages (from gym) (1.14.3)
Requirement already satisfied: cloudpickle<1.7.0,>=1.2.0 in /usr/local/lib/python3.5/dist-packages (from gym) (1.6.0)
Requirement already satisfied: scipy in /home/al118345/.local/lib/python3.5/site-packages (from gym) (1.4.1)
Requirement already satisfied: future in /usr/local/lib/python3.5/dist-packages (from pyglet<=1.5.0,>=1.4.0->gym) (0.18.2)
In [2]:
import gym
import numpy as np
import windy_gridworld_env as wge
from collections import defaultdict
import sys

env=wge.WindyGridworldEnv()
print("Action space is {
                } ".format(env.action_space))
print("Observation space is {} ".format(env.observation_space))
print("Reward range is {
                } ".format(env.reward_range))
Action space is Discrete(4)
Observation space is Tuple(Discrete(7), Discrete(10))
Reward range is (-inf, inf)

0.2. Ejecución de un episodio

A continuación, realizaremos la ejecución de un episodio del entorno WindyGridWorld utilizando un agente que selecciona las acciones de forma aleatoria.

In [3]:
# Inicializamos el entorno
obs = env.reset()
t, total_reward, done = 0, 0, False

print("Obs inicial: {
                } ".format(obs))

switch_action = {
        0: "U",
        1: "R",
        2: "D",
        3: "L",
    }

while not done:

    # Elegir una acción aleatoria (ésta es la implementación del agente)
    action = env.action_space.sample()

    # Ejecutar la acción y esperar la respuesta del entorno
    new_obs, reward, done, info = env.step(action)

    # Imprimir time-step
    print("Action: {
                } -> Obs: {} and reward: {}".format(switch_action[action], new_obs, reward))

    # Actualizar variables
    obs = new_obs
    total_reward += reward
    t += 1

print("Episode finished after {} timesteps and reward was {
                } ".format(t, total_reward))
env.close()
Obs inicial: (3, 0)
Action: D -> Obs: (4, 0) and reward: -1
Action: L -> Obs: (4, 0) and reward: -1
Action: L -> Obs: (4, 0) and reward: -1
Action: L -> Obs: (4, 0) and reward: -1
[...]salto algonos acciones[...]
Action: D -> Obs: (4, 9) and reward: -1
Action: L -> Obs: (4, 8) and reward: -1
Action: L -> Obs: (3, 7) and reward: -1
Episode finished after 16728 timesteps and reward was -16728

1. Modificación del entorno

El entorno WindyGridWorld tiene varios parámetros que pueden ser modificados:

  • La dimensión de la cuadrícula.
  • La posición y fuerza del viento.
  • La posición de las casillas de salida y de llegada.
Ejercicio 1.1

Modificar el codigo de WindyGridWorld (fichero adjunto windy_gridworld_env.py) para que represente las propiedades de la cuadrícula descritas a continuación.

  • Cuadrícula 15x15
  • Fuerza del viento = [0, 0, 0, 1, 1, 1, 2, 2, 2, 1, 1, 1, 0, 0, 0]
  • Casilla de inicio [8,0]
  • Casilla final [8,7]

Guardar el entorno modificado en el archivo windy_gridworld_env_v2.py, en la misma carpeta que el original.

In [56]:
import gym
import numpy as np
import windy_gridworld_env_v2 as wge

env=wge.WindyGridworldEnv()
print("Action space is {
                } ".format(env.action_space))
print("Observation space is {} ".format(env.observation_space))
print("Reward range is {
                } ".format(env.reward_range))
print("Obs inicial: {
                } ".format(obs))
Action space is Discrete(4)
Observation space is Tuple(Discrete(15), Discrete(15))
Reward range is (-inf, inf)
Obs inicial: (8, 0)
Ejercicio 1.2

A continuación, implementar un agente que siempre realice la misma acción: ir hacia la derecha y modificar el código para que sólo realice 10 time-steps.

Mostrar la trayectoria seguida por el agente. No es necesario graficarla, tan sólo mostrar las coordenadas de las casillas visitadas en orden.

In [57]:
# Environment reset
obs = env.reset()
t, total_reward, done = 0, 0, False

print("Obs inicial: {
                } ".format(obs))

switch_action = {
        0: "U",
        1: "R",
        2: "D",
        3: "L"
    }
Obs inicial: (8, 0)
In [6]:
def print_mapa(Movimientos, height, width):
    print("")
    print("")
    print("Mapa:")
    print("")
    contador=0
    for fila in range(0,height):
        print('--------------------------------------------------------------\n', end="")
        resultado= []
        for columna in range(0,width):
                    #print(np.where(Q[fila,columna] == max(Q[fila,columna])))
                    coordenada = (fila, columna)

                    if coordenada in Movimientos.keys():
                        if Movimientos[coordenada]== 0:
                            resultado.append(' | U' )
                        if Movimientos[coordenada]== 1:
                            resultado.append(' | R' )
                        if Movimientos[coordenada]== 2:
                            resultado.append(' | D' )
                        if Movimientos[coordenada]== 3:
                            resultado.append(' | L')
                        if Movimientos[coordenada]== 4:
                            resultado.append(' | G')

                    else:
                        resultado.append(' |  ')

        print(''.join(resultado)+' |\n',end="")
    print('--------------------------------------------------------------\n', end="")

In [7]:
# Escribir el código aquí
# Inicializamos el entorno
obs = env.reset()
t, total_reward, done = 0, 0, False

print("Obs inicial: {
                } ".format(obs))

switch_action = {
        0: "U",
        1: "R",
        2: "D",
        3: "L",
    }

Movimientos = defaultdict(lambda: np.zeros(env.action_space.n))

while not done and t<10:
    print('Acción número ' + str(t+1))
    # Elegir una acción aleatoria (ésta es la implementación del agente)
    action = 1

    # Ejecutar la acción y esperar la respuesta del entorno
    new_obs, reward, done, info = env.step(action)

    # Imprimir time-step
    print("Action: {
                } -> Obs: {} and reward: {}".format(switch_action[action], new_obs, reward))
    Movimientos[obs]= action

    # Actualizar variables
    obs = new_obs
    total_reward += reward
    t += 1


print("Episode finished after {} timesteps and reward was {
                } ".format(t, total_reward))
env.close()


print("A continucación muestro el movimiento del agente para validar la implementación del ejercio.");
print_mapa(Movimientos, 15, 15)
Obs inicial: (8, 0)
Acción número 1
Action: R -> Obs: (8, 1) and reward: -1
Acción número 2
Action: R -> Obs: (8, 2) and reward: -1
Acción número 3
Action: R -> Obs: (8, 3) and reward: -1
Acción número 4
Action: R -> Obs: (7, 4) and reward: -1
Acción número 5
Action: R -> Obs: (6, 5) and reward: -1
Acción número 6
Action: R -> Obs: (5, 6) and reward: -1
Acción número 7
Action: R -> Obs: (3, 7) and reward: -1
Acción número 8
Action: R -> Obs: (1, 8) and reward: -1
Acción número 9
Action: R -> Obs: (0, 9) and reward: -1
Acción número 10
Action: R -> Obs: (0, 10) and reward: -1
Episode finished after 10 timesteps and reward was -10
A continucación muestro el movimiento del agente para validar la implementación del ejercio.


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   | R |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   | R |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   | R |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | R | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------

2. Métodos de Montecarlo

Dado que el entorno es determinista, es factible encontrar una política óptima (que puede no ser única) que consiga el mayor retorno (y por tanto la trayectoria más corta).

El objetivo de este apartado es realizar una estimación de la política óptima mediante los métodos de Montecarlo, en concreto estudiaremos el algoritmo On-policy first-visit MC control (para políticas $\epsilon$-soft).

Ejercicio 2.1

Implementar el Algoritmo 3 explicado en el módulo "Métodos de Montecarlo" utilizando los siguientes parámetros:

  • Número de episodios = 250000
  • Epsilon = 0.1
  • Factor de descuento = 1
In [27]:
def make_epsilon_greedy_policy(Q, epsilon, nA):
    """
    Creates an epsilon-greedy policy based on a given Q-function and epsilon.
    
    Args:
        Q: A dictionary that maps from state -> action-values.
            Each value is a numpy array of length nA (see below)
        epsilon: The probability to select a random action . float between 0 and 1.
        nA: Number of actions in the environment.
    
    Returns:
        A function that takes the observation as an argument and returns
        the probabilities for each action in the form of a numpy array of length nA.
    
    """
    def policy_fn(observation):
        A = np.ones(nA, dtype=float) * epsilon / nA
        best_action = np.argmax(Q[observation])
        A[best_action] += (1.0 - epsilon)
        return A
    return policy_fn

def mc_control_epsilon_greedy(env, num_episodes, discount_factor=1.0, epsilon=0.1):
    """
    Monte Carlo Control using Epsilon-Greedy policies.
    Finds an optimal epsilon-greedy policy.
    
    Args:
        env: OpenAI gym environment.
        num_episodes: Number of episodes to sample.
        discount_factor: Gamma discount factor.
        epsilon: Chance the sample a random action. Float betwen 0 and 1.
    
    Returns:
        A tuple (Q, policy).
        Q is a dictionary mapping state -> action values.
        policy is a function that takes an observation as an argument and returns
        action probabilities
    """

    # Keeps track of sum and count of returns for each state
    # to calculate an average. We could use an array to save all
    # returns (like in the book) but that's memory inefficient.
    returns_sum = defaultdict(float)
    returns_count = defaultdict(float)

    # The final action-value function.
    # A nested dictionary that maps state -> (action -> action-value).
    Q = defaultdict(lambda: np.zeros(env.action_space.n))

    # The policy we're following
    policy = make_epsilon_greedy_policy(Q, epsilon, env.action_space.n)

    for i_episode in range(1, num_episodes + 1):
        # Print out which episode we're on, useful for debugging.
        if i_episode % 100 == 0:
            print("\rEpisode {}/{
                }.".format(i_episode, num_episodes), end="")
            sys.stdout.flush()

        # Generate an episode.
        # An episode is an array of (state, action, reward) tuples
        episode = []
        state = env.reset()
        #for t in range(1000000): #si es hasta que done se hace eterno
        for t in range(1000): #considero que este  es el mejor limite
        #while True:
            probs = policy(state)
            action = np.random.choice(np.arange(len(probs)), p=probs)
            next_state, reward, done, _ = env.step(action)
            episode.append((state, action, reward))
            if done:
                break
            state = next_state

        # Find all (state, action) pairs we've visited in this episode
        # We convert each state to a tuple so that we can use it as a dict key
        sa_in_episode = set([(tuple(x[0]), x[1]) for x in episode])
        for state, action in sa_in_episode:
            sa_pair = (state, action)
            # Find the first occurance of the (state, action) pair in the episode
            first_occurence_idx = next(i for i,x in enumerate(episode)
                                       if x[0] == state and x[1] == action)
            # Sum up all rewards since the first occurance
            G = sum([x[2]*(discount_factor**i) for i,x in enumerate(episode[first_occurence_idx:])])
            # Calculate average return for this state over all sampled episodes
            returns_sum[sa_pair] += G
            returns_count[sa_pair] += 1.0
            Q[state][action] = returns_sum[sa_pair] / returns_count[sa_pair]

        # The policy is improved implicitly by changing the Q dictionary

    return Q, policy
In [9]:
# Environment reset
obs = env.reset()
t, total_reward, done = 0, 0, False

print("Obs inicial: {
                } ".format(obs))

Q, policy = mc_control_epsilon_greedy(env, num_episodes=250000, epsilon=0.1,discount_factor=1.0)
Obs inicial: (8, 0)
Episode 250000/250000.
In [10]:
# Environment reset
obs = env.reset()
t, total_reward, done = 0, 0, False
state = env.reset()
episode = []
print("Ruta óptima")
while True:
            probs = policy(state)
            action = np.argmax(probs)
            next_state, reward, done, info = env.step(action)
            print("Action: {
                } -> Obs: {} and reward: {}".format(action, next_state, reward))
            episode.append((state, action, reward))
            if done:
                break
            state = next_state
Ruta óptima
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 1 -> Obs: (9, 1) and reward: -1
Action: 2 -> Obs: (10, 1) and reward: -1
Action: 2 -> Obs: (11, 1) and reward: -1
Action: 2 -> Obs: (12, 1) and reward: -1
Action: 2 -> Obs: (13, 1) and reward: -1
Action: 1 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
Ejercicio 2.2

Implementar una función que imprima por pantalla la política óptima encontrada para cada celda.

Se muestra a continuación una imagen de ejemplo para la cuadrícula del entorno modificado de 15x15.

In [20]:
import sys


def print_all(policy, height, width):
    obs = env.reset()
    t, total_reward, done = 0, 0, False
    state = env.reset()
    episode = []
    Movimientos = defaultdict(lambda: np.zeros(env.action_space.n))
    print("Movimientos:")
    print("")
    for fila in range(0,15):
        for columna in range(0,15):
            state = (fila, columna)
            probs = policy(state)
            action = np.argmax(probs)

            next_state, reward, done, info = env.step(action)


            Movimientos[state]= action
            #print(state+ '\n' , end="")

            state = next_state
            # Escribir el código aquí

            #print(Movimientos.keys()

    print_mapa(Movimientos, height, width)



def print_policy(policy, height, width):
    obs = env.reset()
    t, total_reward, done = 0, 0, False
    state = env.reset()
    episode = []
    Movimientos = defaultdict(lambda: np.zeros(env.action_space.n))
    print("Movimientos:")
    print("")
    reward_final = 0;
    movimientos_realizados = 0;
    while True:
            probs = policy(state)
            action = np.argmax(probs)
            next_state, reward, done, info = env.step(action)

            print("Action: {
                } -> Obs: {} and reward: {} \n".format(action, next_state, reward), end="")
            sys.stdout.flush()

            episode.append((state, action, reward))

            Movimientos[state]= action
            #print(state+ '\n' , end="")
            reward_final=reward_final+reward
            movimientos_realizados = movimientos_realizados +1
            if movimientos_realizados>50 and state in Movimientos.keys():
                sys.stdout.flush()
                print('Posible bucle en la Solución- Considero que la solución no va a ser valida.')
                print('Para evitar bucles infinitos en las soluciones con un nivel bajo de episodios añado esta condición')
                break;


            if movimientos_realizados>12 and  state == next_state:
                sys.stdout.flush()
                print('Bucle en la solucion-  Con este metodo no se ha encontrado una solucion valida.')
                break;
                '''
                probs = np.delete(probs,np.argmax(probs))
                action = np.argmax(probs)
                next_state, reward, done, info = env.step(action)
                print("Action: {} -> Obs: {} and reward: {} \n".format(action, next_state, reward), end="")
                sys.stdout.flush()
                episode.append((state, action, reward)) 
                Movimientos[state]= action
                '''
            else:
                state = next_state
                sys.stdout.flush()
            if done:
                print('La recompensa final es: ' + str(reward_final) + " ; además se han realizado "+ str(movimientos_realizados) + " Movimientos")
                Movimientos[state]= 4
                break




            # Escribir el código aquí

            #print(Movimientos.keys())

    print_mapa(Movimientos, height, width)


def print_mapa(Movimientos, height, width):
    print("")
    print("")
    print("Mapa:")
    print("")
    contador=0
    for fila in range(0,height):
        print('--------------------------------------------------------------\n', end="")
        resultado= []
        for columna in range(0,width):
                    #print(np.where(Q[fila,columna] == max(Q[fila,columna])))
                    coordenada = (fila, columna)

                    if coordenada in Movimientos.keys():
                        if Movimientos[coordenada]== 0:
                            resultado.append(' | U' )
                        if Movimientos[coordenada]== 1:
                            resultado.append(' | R' )
                        if Movimientos[coordenada]== 2:
                            resultado.append(' | D' )
                        if Movimientos[coordenada]== 3:
                            resultado.append(' | L')
                        if Movimientos[coordenada]== 4:
                            resultado.append(' | G')

                    else:
                        resultado.append(' |  ')

        print(''.join(resultado)+' |\n',end="")
    print('--------------------------------------------------------------\n', end="")

In [12]:
print_policy(policy,15,15)
Movimientos:

Action: 2 -> Obs: (9, 0) and reward: -1
Action: 1 -> Obs: (9, 1) and reward: -1
Action: 2 -> Obs: (10, 1) and reward: -1
Action: 2 -> Obs: (11, 1) and reward: -1
Action: 2 -> Obs: (12, 1) and reward: -1
Action: 2 -> Obs: (13, 1) and reward: -1
Action: 1 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -12 ; además se han realizado 12 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | D |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | D |   |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | D |   |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | D |   |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | R | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
In [13]:
print_all(policy,15,15)
Movimientos:



Mapa:

--------------------------------------------------------------
 | D | L | L | L | L | L | L | L | U | L | L | D | D | U | R |
--------------------------------------------------------------
 | D | R | U | U | L | L | D | L | U | L | R | L | D | U | L |
--------------------------------------------------------------
 | D | D | R | R | U | D | D | D | U | D | U | L | U | U | L |
--------------------------------------------------------------
 | D | L | U | R | U | L | U | L | L | D | D | L | U | R | D |
--------------------------------------------------------------
 | R | D | R | L | L | U | D | L | D | U | D | U | L | L | U |
--------------------------------------------------------------
 | L | D | U | R | L | L | L | U | L | U | L | R | R | L | R |
--------------------------------------------------------------
 | U | D | U | R | L | L | R | L | U | U | R | D | R | D | U |
--------------------------------------------------------------
 | D | L | L | L | R | U | L | U | U | U | U | R | R | L | U |
--------------------------------------------------------------
 | D | D | D | D | L | U | L | U | U | U | U | U | L | R | U |
--------------------------------------------------------------
 | R | D | L | R | D | L | L | R | U | U | U | R | R | R | D |
--------------------------------------------------------------
 | L | D | L | L | U | D | R | U | U | U | U | U | D | R | U |
--------------------------------------------------------------
 | D | D | D | L | R | R | D | U | U | U | U | U | U | R | R |
--------------------------------------------------------------
 | D | D | D | L | R | R | U | U | U | U | U | U | U | U | U |
--------------------------------------------------------------
 | R | R | R | R | D | U | U | U | U | U | U | U | U | U | U |
--------------------------------------------------------------
 | U | L | U | L | U | U | U | U | U | U | U | U | U | U | U |
--------------------------------------------------------------
Ejercicio 2.3

Ejecutar un episodio con la política óptima encontrada y mostrar la trayectoria del agente y el retorno obtenido.

In [14]:
print_policy(policy,15,15)
Movimientos:

Action: 2 -> Obs: (9, 0) and reward: -1
Action: 1 -> Obs: (9, 1) and reward: -1
Action: 2 -> Obs: (10, 1) and reward: -1
Action: 2 -> Obs: (11, 1) and reward: -1
Action: 2 -> Obs: (12, 1) and reward: -1
Action: 2 -> Obs: (13, 1) and reward: -1
Action: 1 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -12 ; además se han realizado 12 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | D |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | D |   |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | D |   |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | D |   |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | R | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------

3. Métodos de Diferencia Temporal

El objetivo de este apartado es realizar una estimación de la política óptima mediante los métodos de Diferencia Temporal en el entorno WindyGridWorld modificado anteriormente.

Ejercicio 3.1

Implementar el algoritmo de Q-learning explicado en el modulo "Aprendizaje por Diferencia Temporal" utilizando los siguientes parámetros (1 punto):

  • Número de episodios = 200
  • learning rate = 0.5
  • discount factor = 1
  • epsilon = 0.05

Además, se pide:

  1. Mostrar por pantalla los valores Q estimados para cada estado.
  2. Mostrar por pantalla los valores de la función de valor $v_\pi(s)$ estimada para cada estado.
  3. Ejecutar un episodio siguiendo la política óptima encontrada, donde se pueda reconocer la trayectoria seguida por el agente.
In [37]:
import numpy as np
import pandas as pd

import itertools



def createEpsilonGreedyPolicy(Q, epsilon, num_actions):
    """ 
    Creates an epsilon-greedy policy based 
    on a given Q-function and epsilon. 
       
    Returns a function that takes the state 
    as an input and returns the probabilities 
    for each action in the form of a numpy array  
    of length of the action space(set of possible actions). 
    """
    def policyFunction(state):

        Action_probabilities = np.ones(num_actions,
                dtype = float) * epsilon / num_actions

        best_action = np.argmax(Q[state])
        Action_probabilities[best_action] += (1.0 - epsilon)
        return Action_probabilities

    return policyFunction

def qLearning(env, num_episodes, discount_factor = 1.0,
                            alpha = 0.5, epsilon = 0.05):
    """ 
    Q-Learning algorithm: Off-policy TD control. 
    Finds the optimal greedy policy while improving 
    following an epsilon-greedy policy"""

    # Action value function 
    # A nested dictionary that maps 
    # state -> (action -> action-value). 
    Q = defaultdict(lambda: np.zeros(env.action_space.n))
    # Create an epsilon greedy policy function 
    # appropriately for environment action space 
    policy = createEpsilonGreedyPolicy(Q, epsilon, env.action_space.n)

    # For every episode 
    for ith_episode in range(num_episodes):

        # Reset the environment and pick the first action 
        state = env.reset()

        for t in itertools.count():

            # get probabilities of all actions from current state 
            action_probabilities = policy(state)

            # choose action according to  
            # the probability distribution 
            action = np.random.choice(np.arange(
                      len(action_probabilities)),
                       p = action_probabilities)

            # take action and get reward, transit to next state 
            next_state, reward, done, _ = env.step(action)



            # TD Update 
            best_next_action = np.argmax(Q[next_state])
            td_target = reward + discount_factor * Q[next_state][best_next_action]
            td_delta = td_target - Q[state][action]
            Q[state][action] += alpha * td_delta

            # done is True if episode terminated    
            if done:

                break

            state = next_state

    return Q,policy

Q,policy = qLearning(env, 1000)
In [16]:
for fila in range(0,15):
    print('--------------------------------------------------------------')
    resultado= []
    for columna in range(0,15):
        #print(np.where(Q[fila,columna] == max(Q[fila,columna])))
        #resultado.append(' |'+str(Q[fila,columna]) )
        print("Para la fila {} y la columna {} tenemos el siguiente estado Q {} ".format(fila,columna,Q[fila,columna]))

    #print(''.join(resultado)+' |')
print('--------------------------------------------------------------')
--------------------------------------------------------------
Para la fila 0 y la columna 0 tenemos el siguiente estado Q [-17.3180731  -17.09213945 -17.17422174 -17.27402398]
Para la fila 0 y la columna 1 tenemos el siguiente estado Q [-17.69084763 -17.72973025 -17.47320867 -17.52428105]
Para la fila 0 y la columna 2 tenemos el siguiente estado Q [-18.         -18.50498955 -17.99647756 -18.08470307]
Para la fila 0 y la columna 3 tenemos el siguiente estado Q [-19.25297377 -19.87306392 -19.06538177 -18.97274283]
Para la fila 0 y la columna 4 tenemos el siguiente estado Q [-20.14267849 -20.75429279 -20.32874281 -19.93043812]
Para la fila 0 y la columna 5 tenemos el siguiente estado Q [-20.74835035 -21.29820723 -20.625      -20.74759069]
Para la fila 0 y la columna 6 tenemos el siguiente estado Q [-21.49821158 -21.26972256 -21.29581127 -21.26745942]
Para la fila 0 y la columna 7 tenemos el siguiente estado Q [-20.90966408 -20.51703258 -20.78823017 -21.17302355]
Para la fila 0 y la columna 8 tenemos el siguiente estado Q [-20.         -19.71507478 -19.84338233 -19.82444608]
Para la fila 0 y la columna 9 tenemos el siguiente estado Q [-19.22632306 -18.78291008 -18.82050265 -19.36593866]
Para la fila 0 y la columna 10 tenemos el siguiente estado Q [-18.26171875 -17.85544523 -18.30402723 -18.26501564]
Para la fila 0 y la columna 11 tenemos el siguiente estado Q [-16.91624801 -16.93013141 -16.98999524 -17.55634051]
Para la fila 0 y la columna 12 tenemos el siguiente estado Q [-16.19683486 -16.09622085 -15.97117417 -16.9207818 ]
Para la fila 0 y la columna 13 tenemos el siguiente estado Q [-15.52858951 -15.54091435 -15.48913513 -15.59381573]
Para la fila 0 y la columna 14 tenemos el siguiente estado Q [-15.14518738 -15.         -14.88069133 -15.58599296]
--------------------------------------------------------------
Para la fila 1 y la columna 0 tenemos el siguiente estado Q [-16.67243934 -16.61374893 -16.69748449 -16.94042969]
Para la fila 1 y la columna 1 tenemos el siguiente estado Q [-17.3584782  -17.21467131 -16.85358014 -16.732977  ]
Para la fila 1 y la columna 2 tenemos el siguiente estado Q [-17.86238062 -17.18585229 -16.99963826 -17.1940637 ]
Para la fila 1 y la columna 3 tenemos el siguiente estado Q [-18.60277797 -18.31314476 -18.24594687 -18.43746763]
Para la fila 1 y la columna 4 tenemos el siguiente estado Q [-19.00447574 -19.20835379 -18.9921875  -19.26146711]
Para la fila 1 y la columna 5 tenemos el siguiente estado Q [-20.02570805 -19.89781697 -19.         -19.82888385]
Para la fila 1 y la columna 6 tenemos el siguiente estado Q [-19.6669365  -19.04646022 -19.69041814 -20.04516894]
Para la fila 1 y la columna 7 tenemos el siguiente estado Q [-19.26141898 -19.48409537 -19.57938369 -20.70728315]
Para la fila 1 y la columna 8 tenemos el siguiente estado Q [-17.90657806 -18.67609091 -18.81159533 -18.72049907]
Para la fila 1 y la columna 9 tenemos el siguiente estado Q [-18.12744224 -16.98631122 -17.         -18.13864836]
Para la fila 1 y la columna 10 tenemos el siguiente estado Q [-17.11394407 -15.98915709 -16.         -17.16354048]
Para la fila 1 y la columna 11 tenemos el siguiente estado Q [-16.69526376 -15.9802788  -16.         -16.6548348 ]
Para la fila 1 y la columna 12 tenemos el siguiente estado Q [-15.69195818 -15.41732614 -15.11766346 -15.75159311]
Para la fila 1 y la columna 13 tenemos el siguiente estado Q [-15.05723983 -15.01628702 -14.7574036  -15.36708614]
Para la fila 1 y la columna 14 tenemos el siguiente estado Q [-14.80728689 -14.5        -14.4253092  -14.78626856]
--------------------------------------------------------------
Para la fila 2 y la columna 0 tenemos el siguiente estado Q [-16.34332834 -16.26421237 -16.00804453 -16.        ]
Para la fila 2 y la columna 1 tenemos el siguiente estado Q [-16.43751485 -16.72762038 -16.04856756 -16.10090019]
Para la fila 2 y la columna 2 tenemos el siguiente estado Q [-17.05023254 -17.20346117 -15.99997288 -16.21478529]
Para la fila 2 y la columna 3 tenemos el siguiente estado Q [-18.18040002 -18.00612349 -17.5        -17.58815639]
Para la fila 2 y la columna 4 tenemos el siguiente estado Q [-18.580497   -18.08182422 -17.359375   -18.02931797]
Para la fila 2 y la columna 5 tenemos el siguiente estado Q [-18.26144068 -19.02353069 -18.5        -18.26508177]
Para la fila 2 y la columna 6 tenemos el siguiente estado Q [-19.81486551 -18.52142626 -18.26072343 -18.50489851]
Para la fila 2 y la columna 7 tenemos el siguiente estado Q [-19.48263998 -18.7495592  -18.14862594 -18.57893008]
Para la fila 2 y la columna 8 tenemos el siguiente estado Q [-17.2190803  -17.57683488 -17.42296698 -18.75259556]
Para la fila 2 y la columna 9 tenemos el siguiente estado Q [-16.49615337 -15.83035305 -15.46875    -16.93515489]
Para la fila 2 y la columna 10 tenemos el siguiente estado Q [-16.34142549 -15.06321834 -15.32771901 -16.25211703]
Para la fila 2 y la columna 11 tenemos el siguiente estado Q [-15.02756838 -15.06470326 -14.5        -15.15469243]
Para la fila 2 y la columna 12 tenemos el siguiente estado Q [-14.38561983 -14.45845621 -14.29501254 -14.48903429]
Para la fila 2 y la columna 13 tenemos el siguiente estado Q [-14.54141182 -13.95518918 -14.05211528 -14.0472964 ]
Para la fila 2 y la columna 14 tenemos el siguiente estado Q [-14.26755448 -13.61825795 -13.70612097 -13.95386175]
--------------------------------------------------------------
Para la fila 3 y la columna 0 tenemos el siguiente estado Q [-15.65986957 -15.60536252 -15.31402229 -15.4139672 ]
Para la fila 3 y la columna 1 tenemos el siguiente estado Q [-16.10509011 -15.49841395 -15.24459939 -15.51586086]
Para la fila 3 y la columna 2 tenemos el siguiente estado Q [-16.05042545 -15.63202695 -14.99999901 -15.47882642]
Para la fila 3 y la columna 3 tenemos el siguiente estado Q [-17.13253511 -17.20619931 -16.5        -16.45151463]
Para la fila 3 y la columna 4 tenemos el siguiente estado Q [-17.63762692 -16.63617576 -17.         -17.29687675]
Para la fila 3 y la columna 5 tenemos el siguiente estado Q [-18.30616118 -18.01720301 -17.5        -17.2688366 ]
Para la fila 3 y la columna 6 tenemos el siguiente estado Q [-18.24531827 -18.54999239 -17.5495766  -18.15545272]
Para la fila 3 y la columna 7 tenemos el siguiente estado Q [-19.31439167 -18.01641768 -17.97896848 -17.38645295]
Para la fila 3 y la columna 8 tenemos el siguiente estado Q [-18.12243157 -16.58853923 -16.8018344  -17.86841009]
Para la fila 3 y la columna 9 tenemos el siguiente estado Q [-15.21600458 -15.0152573  -14.5        -15.69041771]
Para la fila 3 y la columna 10 tenemos el siguiente estado Q [-14.86033567 -14.88749516 -14.5        -14.96565328]
Para la fila 3 y la columna 11 tenemos el siguiente estado Q [-15.19648259 -14.36585907 -13.8037796  -14.56800235]
Para la fila 3 y la columna 12 tenemos el siguiente estado Q [-13.56465072 -13.68707093 -13.51677316 -13.50907381]
Para la fila 3 y la columna 13 tenemos el siguiente estado Q [-13.85363577 -13.5136354  -13.24833795 -13.52265057]
Para la fila 3 y la columna 14 tenemos el siguiente estado Q [-13.51709196 -13.         -13.04832635 -13.50467851]
--------------------------------------------------------------
Para la fila 4 y la columna 0 tenemos el siguiente estado Q [-14.70226065 -14.7940383  -14.63984131 -14.90784401]
Para la fila 4 y la columna 1 tenemos el siguiente estado Q [-15.13082142 -14.66686882 -14.42528346 -14.53889295]
Para la fila 4 y la columna 2 tenemos el siguiente estado Q [-14.06157765 -14.25425288 -13.99999997 -14.2802865 ]
Para la fila 4 y la columna 3 tenemos el siguiente estado Q [-16.85946037 -15.67815285 -15.69660093 -15.83051348]
Para la fila 4 y la columna 4 tenemos el siguiente estado Q [-16.9301654  -16.56191711 -16.78716727 -16.74810937]
Para la fila 4 y la columna 5 tenemos el siguiente estado Q [-17.0865383  -16.25266486 -16.41190767 -16.78168004]
Para la fila 4 y la columna 6 tenemos el siguiente estado Q [-17.89952137 -17.20238337 -17.37964973 -17.75844549]
Para la fila 4 y la columna 7 tenemos el siguiente estado Q [-17.72975409 -16.78429221 -17.24000951 -16.50475784]
Para la fila 4 y la columna 8 tenemos el siguiente estado Q [-15.04374326 -15.26423127 -15.8714025  -15.7095115 ]
Para la fila 4 y la columna 9 tenemos el siguiente estado Q [-14.02653154 -13.86751448 -14.         -15.02377809]
Para la fila 4 y la columna 10 tenemos el siguiente estado Q [-14.40842982 -14.24641733 -14.         -13.97357942]
Para la fila 4 y la columna 11 tenemos el siguiente estado Q [-13.29948143 -13.53186207 -13.38993456 -14.34142555]
Para la fila 4 y la columna 12 tenemos el siguiente estado Q [-13.62940456 -12.67519867 -12.74729702 -13.04328145]
Para la fila 4 y la columna 13 tenemos el siguiente estado Q [-12.97851189 -12.63631658 -12.42899298 -12.76032736]
Para la fila 4 y la columna 14 tenemos el siguiente estado Q [-12.4896003  -12.25140413 -12.37264935 -12.41454188]
--------------------------------------------------------------
Para la fila 5 y la columna 0 tenemos el siguiente estado Q [-14.32192721 -14.30987511 -14.13613488 -14.37039662]
Para la fila 5 y la columna 1 tenemos el siguiente estado Q [-13.8970289  -13.8140471  -13.70067078 -13.84546219]
Para la fila 5 y la columna 2 tenemos el siguiente estado Q [-13.77508495 -13.15790856 -13.         -13.37996324]
Para la fila 5 y la columna 3 tenemos el siguiente estado Q [-14.05159105 -15.79142552 -14.         -14.49477301]
Para la fila 5 y la columna 4 tenemos el siguiente estado Q [-15.77045597 -15.8155114  -15.39108022 -16.01200561]
Para la fila 5 y la columna 5 tenemos el siguiente estado Q [-16.64358855 -16.23353762 -16.25757569 -16.73836224]
Para la fila 5 y la columna 6 tenemos el siguiente estado Q [-16.66142699 -16.69169406 -17.06256409 -16.97551346]
Para la fila 5 y la columna 7 tenemos el siguiente estado Q [-16.83941956 -15.94185819 -16.3852723  -15.70244195]
Para la fila 5 y la columna 8 tenemos el siguiente estado Q [-15.32670894 -13.61197918 -14.39125978 -15.74604408]
Para la fila 5 y la columna 9 tenemos el siguiente estado Q [-14.13116523 -13.34439653 -13.         -13.6655305 ]
Para la fila 5 y la columna 10 tenemos el siguiente estado Q [-13.3352808  -13.16654969 -13.         -12.55834076]
Para la fila 5 y la columna 11 tenemos el siguiente estado Q [-12.9304923  -12.51400747 -12.75       -13.48078901]
Para la fila 5 y la columna 12 tenemos el siguiente estado Q [-12.64755341 -11.88229484 -11.93721378 -12.00302137]
Para la fila 5 y la columna 13 tenemos el siguiente estado Q [-12.32625571 -12.00514235 -11.70471182 -12.02533422]
Para la fila 5 y la columna 14 tenemos el siguiente estado Q [-11.76005786 -11.67641133 -11.69157099 -12.01921051]
--------------------------------------------------------------
Para la fila 6 y la columna 0 tenemos el siguiente estado Q [-14.17036119 -13.48918991 -13.54777836 -13.5       ]
Para la fila 6 y la columna 1 tenemos el siguiente estado Q [-12.94955981 -12.89644981 -12.83808688 -13.48341247]
Para la fila 6 y la columna 2 tenemos el siguiente estado Q [-13.5261319  -12.07359811 -12.         -12.17370066]
Para la fila 6 y la columna 3 tenemos el siguiente estado Q [-15.07230646 -13.82828808 -13.76890083 -13.68751487]
Para la fila 6 y la columna 4 tenemos el siguiente estado Q [-14.92706937 -15.45289631 -14.80078125 -14.69734895]
Para la fila 6 y la columna 5 tenemos el siguiente estado Q [-15.10953742 -16.03511347 -15.         -15.27235266]
Para la fila 6 y la columna 6 tenemos el siguiente estado Q [-16.23419781 -15.93322553 -16.08459409 -16.23220168]
Para la fila 6 y la columna 7 tenemos el siguiente estado Q [-15.08855207 -14.24067333 -14.01118402 -13.48008211]
Para la fila 6 y la columna 8 tenemos el siguiente estado Q [-14.30602568 -12.15533532 -12.45133229 -13.64206988]
Para la fila 6 y la columna 9 tenemos el siguiente estado Q [-12.99951172 -12.07368874 -11.76443581 -12.17046933]
Para la fila 6 y la columna 10 tenemos el siguiente estado Q [-13.33532945 -12.34180814 -12.         -12.63802873]
Para la fila 6 y la columna 11 tenemos el siguiente estado Q [-12.19228402 -11.06295341 -11.5        -12.01270593]
Para la fila 6 y la columna 12 tenemos el siguiente estado Q [-11.62128645 -11.28154219 -11.09779512 -11.22638408]
Para la fila 6 y la columna 13 tenemos el siguiente estado Q [-11.46851819 -11.27553943 -10.97471773 -11.03281714]
Para la fila 6 y la columna 14 tenemos el siguiente estado Q [-10.99918557 -11.16620784 -11.00442792 -10.94139924]
--------------------------------------------------------------
Para la fila 7 y la columna 0 tenemos el siguiente estado Q [-13.12414987 -12.98352301 -12.97218941 -13.20380885]
Para la fila 7 y la columna 1 tenemos el siguiente estado Q [-12.32752135 -11.99987204 -11.99984505 -12.55896256]
Para la fila 7 y la columna 2 tenemos el siguiente estado Q [-12.63202886 -11.29491738 -11.         -12.00337204]
Para la fila 7 y la columna 3 tenemos el siguiente estado Q [-13.43575596 -13.65611132 -13.         -12.75639859]
Para la fila 7 y la columna 4 tenemos el siguiente estado Q [-15.32136958 -13.51286639 -13.5        -13.48331421]
Para la fila 7 y la columna 5 tenemos el siguiente estado Q [-15.20716572 -14.96035371 -14.5        -14.52872271]
Para la fila 7 y la columna 6 tenemos el siguiente estado Q [-16.38682064 -16.05334027 -15.83124346 -16.12984616]
Para la fila 7 y la columna 7 tenemos el siguiente estado Q [-12.65642061 -12.76376221 -12.07431054 -12.4914542 ]
Para la fila 7 y la columna 8 tenemos el siguiente estado Q [-10.30916765 -11.5        -10.85550808 -12.7668873 ]
Para la fila 7 y la columna 9 tenemos el siguiente estado Q [-12.59388135 -10.29199219 -10.         -10.09488343]
Para la fila 7 y la columna 10 tenemos el siguiente estado Q [-11.36571834 -11.08208735 -10.5        -11.14749952]
Para la fila 7 y la columna 11 tenemos el siguiente estado Q [-11.16215508 -10.9849438  -11.         -11.61900636]
Para la fila 7 y la columna 12 tenemos el siguiente estado Q [-10.91823057 -10.58950631 -10.21357569 -10.37301567]
Para la fila 7 y la columna 13 tenemos el siguiente estado Q [-10.98463553 -10.2368751  -10.17193165 -10.36474046]
Para la fila 7 y la columna 14 tenemos el siguiente estado Q [-10.15658447 -10.5        -10.26844911 -10.48849775]
--------------------------------------------------------------
Para la fila 8 y la columna 0 tenemos el siguiente estado Q [-13.93980473 -12.         -12.         -12.99932559]
Para la fila 8 y la columna 1 tenemos el siguiente estado Q [-12.99899546 -11.         -11.         -12.99964571]
Para la fila 8 y la columna 2 tenemos el siguiente estado Q [-11.62107478 -12.94712929 -10.         -11.9991398 ]
Para la fila 8 y la columna 3 tenemos el siguiente estado Q [-13.24584173 -12.26978269 -12.34412813 -11.99338305]
Para la fila 8 y la columna 4 tenemos el siguiente estado Q [-14.32981964 -13.53626192 -13.5        -13.32772214]
Para la fila 8 y la columna 5 tenemos el siguiente estado Q [-14.74984622 -14.98255473 -14.         -13.95464227]
Para la fila 8 y la columna 6 tenemos el siguiente estado Q [-14.27159204 -13.17273667 -13.30876062 -13.56188533]
Para la fila 8 y la columna 7 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 8 y la columna 8 tenemos el siguiente estado Q [ -9.17451025 -10.26357414  -9.61754399  -8.96577377]
Para la fila 8 y la columna 9 tenemos el siguiente estado Q [-10.27492956  -9.91324083  -9.          -9.07528034]
Para la fila 8 y la columna 10 tenemos el siguiente estado Q [-10.83408425  -9.78588671  -9.5         -9.92562898]
Para la fila 8 y la columna 11 tenemos el siguiente estado Q [-10.10188098  -9.84975553  -9.5         -9.95680215]
Para la fila 8 y la columna 12 tenemos el siguiente estado Q [-10.08144861  -9.83120145  -9.30852003  -9.37204311]
Para la fila 8 y la columna 13 tenemos el siguiente estado Q [-9.4277829  -9.60808515 -9.49719852 -9.71834928]
Para la fila 8 y la columna 14 tenemos el siguiente estado Q [-9.83414474 -9.77307272 -9.60220677 -9.66809246]
--------------------------------------------------------------
Para la fila 9 y la columna 0 tenemos el siguiente estado Q [-12.98640408 -11.         -11.         -11.9687234 ]
Para la fila 9 y la columna 1 tenemos el siguiente estado Q [-11.53726549 -10.         -10.         -11.78969057]
Para la fila 9 y la columna 2 tenemos el siguiente estado Q [-10.99958226 -11.99271508  -9.         -10.99943795]
Para la fila 9 y la columna 3 tenemos el siguiente estado Q [-11.15123266 -12.74792365 -11.65531672 -10.99999994]
Para la fila 9 y la columna 4 tenemos el siguiente estado Q [-11.79823102 -12.38695642 -10.85546875 -11.04370215]
Para la fila 9 y la columna 5 tenemos el siguiente estado Q [-14.08312661 -13.21596852 -13.5        -13.57686544]
Para la fila 9 y la columna 6 tenemos el siguiente estado Q [-11.54440271 -11.38749783 -11.00261199 -12.75734891]
Para la fila 9 y la columna 7 tenemos el siguiente estado Q [-3.74940749 -5.         -0.99987793 -5.04267635]
Para la fila 9 y la columna 8 tenemos el siguiente estado Q [-8.79566838 -7.18954811 -7.82244809 -7.29096393]
Para la fila 9 y la columna 9 tenemos el siguiente estado Q [-8.40625   -7.0867939 -7.        -8.0290871]
Para la fila 9 y la columna 10 tenemos el siguiente estado Q [-8.72628035 -8.79716479 -8.         -8.28815669]
Para la fila 9 y la columna 11 tenemos el siguiente estado Q [-10.43244376  -8.86609339  -8.8557663   -9.29881012]
Para la fila 9 y la columna 12 tenemos el siguiente estado Q [-8.86282824 -8.8944575  -8.46121357 -8.94224133]
Para la fila 9 y la columna 13 tenemos el siguiente estado Q [-9.3409152  -9.13582296 -8.78815177 -8.91702496]
Para la fila 9 y la columna 14 tenemos el siguiente estado Q [-9.29623763 -9.         -8.98418343 -9.19861197]
--------------------------------------------------------------
Para la fila 10 y la columna 0 tenemos el siguiente estado Q [-10.34343539 -10.         -10.         -10.90813915]
Para la fila 10 y la columna 1 tenemos el siguiente estado Q [-10.34994331  -9.          -9.          -9.17175854]
Para la fila 10 y la columna 2 tenemos el siguiente estado Q [ -9.99909776 -10.96530258  -8.          -9.99767317]
Para la fila 10 y la columna 3 tenemos el siguiente estado Q [-10.32106308 -10.32675794 -10.40625     -9.99627838]
Para la fila 10 y la columna 4 tenemos el siguiente estado Q [-12.91568248 -12.15764351 -12.         -11.99993894]
Para la fila 10 y la columna 5 tenemos el siguiente estado Q [-10.2359387   -7.63473515  -7.          -8.74740899]
Para la fila 10 y la columna 6 tenemos el siguiente estado Q [-16.35467302  -1.         -11.14166594 -14.19482594]
Para la fila 10 y la columna 7 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 10 y la columna 8 tenemos el siguiente estado Q [-3.         -2.5        -1.60815165 -0.99999952]
Para la fila 10 y la columna 9 tenemos el siguiente estado Q [-7.10614014 -6.5083314  -6.5        -6.48061651]
Para la fila 10 y la columna 10 tenemos el siguiente estado Q [-7.8427653  -7.3884938  -6.5        -6.95559858]
Para la fila 10 y la columna 11 tenemos el siguiente estado Q [-8.30944343 -8.58805873 -8.         -8.01445374]
Para la fila 10 y la columna 12 tenemos el siguiente estado Q [-8.01959811 -7.93146384 -7.66406815 -8.00509887]
Para la fila 10 y la columna 13 tenemos el siguiente estado Q [-8.51950894 -8.40338119 -8.01266856 -8.16150214]
Para la fila 10 y la columna 14 tenemos el siguiente estado Q [-9.3676915  -8.44946687 -8.42354493 -8.33357344]
--------------------------------------------------------------
Para la fila 11 y la columna 0 tenemos el siguiente estado Q [-10.39977365  -9.          -9.          -9.65054321]
Para la fila 11 y la columna 1 tenemos el siguiente estado Q [-9.60527491 -8.         -8.         -9.46427728]
Para la fila 11 y la columna 2 tenemos el siguiente estado Q [-8.99885052 -9.97868652 -7.         -8.99961987]
Para la fila 11 y la columna 3 tenemos el siguiente estado Q [-9.19339835 -9.80739106 -9.46419082 -8.99999999]
Para la fila 11 y la columna 4 tenemos el siguiente estado Q [-9.31560545 -7.30574214 -7.5        -8.9053978 ]
Para la fila 11 y la columna 5 tenemos el siguiente estado Q [-13.85255794  -2.          -2.99899292 -12.8770716 ]
Para la fila 11 y la columna 6 tenemos el siguiente estado Q [-6.12748856 -1.99108887 -1.99401045 -2.25      ]
Para la fila 11 y la columna 7 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 11 y la columna 8 tenemos el siguiente estado Q [-3.25505196 -2.5625     -1.88940382 -1.81079102]
Para la fila 11 y la columna 9 tenemos el siguiente estado Q [-4.4375     -3.18108535 -2.         -1.99994755]
Para la fila 11 y la columna 10 tenemos el siguiente estado Q [-5.84375    -6.0563736  -6.         -6.12544121]
Para la fila 11 y la columna 11 tenemos el siguiente estado Q [-8.03069999 -6.97197848 -6.9375     -6.77807939]
Para la fila 11 y la columna 12 tenemos el siguiente estado Q [-7.16971996 -7.12806285 -6.81658355 -7.22289385]
Para la fila 11 y la columna 13 tenemos el siguiente estado Q [-8.12609208 -7.44590753 -7.23962999 -7.38970977]
Para la fila 11 y la columna 14 tenemos el siguiente estado Q [-8.42106421 -8.         -7.68678806 -7.65548453]
--------------------------------------------------------------
Para la fila 12 y la columna 0 tenemos el siguiente estado Q [-9.12092698 -8.         -8.         -8.        ]
Para la fila 12 y la columna 1 tenemos el siguiente estado Q [-8.46927625 -7.         -7.         -8.13514439]
Para la fila 12 y la columna 2 tenemos el siguiente estado Q [-7.99991659 -8.91992968 -6.         -7.99332195]
Para la fila 12 y la columna 3 tenemos el siguiente estado Q [-8.07236147 -8.03534663 -8.3515625  -7.98772959]
Para la fila 12 y la columna 4 tenemos el siguiente estado Q [-12.99495946  -3.          -3.99996891  -9.99614806]
Para la fila 12 y la columna 5 tenemos el siguiente estado Q [-2.99609375 -2.97991219 -3.         -3.30078125]
Para la fila 12 y la columna 6 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 12 y la columna 7 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 12 y la columna 8 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 12 y la columna 9 tenemos el siguiente estado Q [-3.8839531  -3.6501236  -2.9296875  -2.61401367]
Para la fila 12 y la columna 10 tenemos el siguiente estado Q [-3.64648438 -5.00938429 -3.         -2.9993791 ]
Para la fila 12 y la columna 11 tenemos el siguiente estado Q [-5.51137168 -6.56427127 -5.5        -5.56644972]
Para la fila 12 y la columna 12 tenemos el siguiente estado Q [-6.25494776 -6.06593645 -5.9488449  -6.08870981]
Para la fila 12 y la columna 13 tenemos el siguiente estado Q [-6.64737851 -6.89610539 -6.52052155 -6.59500712]
Para la fila 12 y la columna 14 tenemos el siguiente estado Q [-7.47769036 -6.95255756 -6.97186148 -7.02805102]
--------------------------------------------------------------
Para la fila 13 y la columna 0 tenemos el siguiente estado Q [-8.04625839 -7.         -7.00053926 -7.49987769]
Para la fila 13 y la columna 1 tenemos el siguiente estado Q [-7.39550201 -6.         -6.21006596 -7.55203154]
Para la fila 13 y la columna 2 tenemos el siguiente estado Q [-6.99998881 -5.         -6.7666955  -6.99988631]
Para la fila 13 y la columna 3 tenemos el siguiente estado Q [-9.99856668 -4.         -4.99999191 -6.99939555]
Para la fila 13 y la columna 4 tenemos el siguiente estado Q [-4.51693726 -3.95615883 -4.29415894 -4.09912145]
Para la fila 13 y la columna 5 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 13 y la columna 6 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 13 y la columna 7 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 13 y la columna 8 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 13 y la columna 9 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 13 y la columna 10 tenemos el siguiente estado Q [-5.140625   -3.60913551 -3.5        -3.22557068]
Para la fila 13 y la columna 11 tenemos el siguiente estado Q [-6.20864894 -5.03407627 -4.79791696 -3.99622652]
Para la fila 13 y la columna 12 tenemos el siguiente estado Q [-5.1164614  -5.00086355 -5.22476373 -4.98518885]
Para la fila 13 y la columna 13 tenemos el siguiente estado Q [-6.37237061 -6.17027526 -5.92377293 -5.83718751]
Para la fila 13 y la columna 14 tenemos el siguiente estado Q [-6.880463   -6.5        -6.57634352 -6.12352573]
--------------------------------------------------------------
Para la fila 14 y la columna 0 tenemos el siguiente estado Q [-6.29859269 -6.37933807 -6.5        -6.5       ]
Para la fila 14 y la columna 1 tenemos el siguiente estado Q [-5.77994715 -6.27456105 -5.88083076 -5.83771896]
Para la fila 14 y la columna 2 tenemos el siguiente estado Q [-5.90993562 -5.83652421 -5.8828125  -6.25760235]
Para la fila 14 y la columna 3 tenemos el siguiente estado Q [-4.89035836 -4.91188832 -5.         -5.17014679]
Para la fila 14 y la columna 4 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 14 y la columna 5 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 14 y la columna 6 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 14 y la columna 7 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 14 y la columna 8 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 14 y la columna 9 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 14 y la columna 10 tenemos el siguiente estado Q [0. 0. 0. 0.]
Para la fila 14 y la columna 11 tenemos el siguiente estado Q [-3.83960193 -4.98287938 -4.31483161 -3.91814274]
Para la fila 14 y la columna 12 tenemos el siguiente estado Q [-5.13738731 -4.65969191 -4.50073242 -4.640773  ]
Para la fila 14 y la columna 13 tenemos el siguiente estado Q [-5.99574807 -5.91827711 -5.73880005 -5.35739257]
Para la fila 14 y la columna 14 tenemos el siguiente estado Q [-6.03452039 -6.12568349 -6.29046631 -6.16523658]
--------------------------------------------------------------
In [17]:
print_policy(policy,15,15)
Movimientos:

Action: 1 -> Obs: (8, 1) and reward: -1
Action: 1 -> Obs: (8, 2) and reward: -1
Action: 2 -> Obs: (9, 2) and reward: -1
Action: 2 -> Obs: (10, 2) and reward: -1
Action: 2 -> Obs: (11, 2) and reward: -1
Action: 2 -> Obs: (12, 2) and reward: -1
Action: 2 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -12 ; además se han realizado 12 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | R | D |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
In [18]:
print_all(policy, 15, 15)
Movimientos:



Mapa:

--------------------------------------------------------------
 | R | D | D | L | L | D | L | R | R | R | R | U | D | D | D |
--------------------------------------------------------------
 | R | L | D | D | D | D | R | U | U | R | R | R | D | D | D |
--------------------------------------------------------------
 | L | D | D | D | D | U | D | D | U | D | R | D | D | R | R |
--------------------------------------------------------------
 | D | D | D | L | R | L | D | L | R | D | D | D | L | D | R |
--------------------------------------------------------------
 | D | D | D | R | R | R | R | L | U | R | L | U | R | D | R |
--------------------------------------------------------------
 | D | D | D | D | D | R | U | L | R | D | L | R | R | D | R |
--------------------------------------------------------------
 | R | D | D | L | L | D | R | L | R | D | D | R | D | D | L |
--------------------------------------------------------------
 | D | D | D | L | L | D | D | D | U | D | D | R | D | D | U |
--------------------------------------------------------------
 | R | R | D | L | L | L | R | U | L | D | D | D | D | U | D |
--------------------------------------------------------------
 | R | R | D | L | D | R | D | D | R | D | D | D | D | D | D |
--------------------------------------------------------------
 | R | R | D | L | L | D | R | U | L | L | D | D | D | D | L |
--------------------------------------------------------------
 | R | R | D | L | R | R | R | U | L | L | U | L | D | D | L |
--------------------------------------------------------------
 | R | R | D | L | R | R | U | U | U | L | L | D | D | D | R |
--------------------------------------------------------------
 | R | R | R | R | R | U | U | U | U | U | L | L | L | L | L |
--------------------------------------------------------------
 | U | U | R | U | U | U | U | U | U | U | U | U | D | L | U |
--------------------------------------------------------------

4. Comparativa de los algoritmos

En este apartado haremos diferentes comparativas de las implementaciones de los metodos de Montecarlo y los metodos de Diferencia Temporal implementados anteriormente.

Compararemos el comportamiento de los dos algoritmos al modificar los valores del factor de descuento, el learning rate y el numero de episodios.

Para cada ejercicio se debe mostrar y justificar el resultado.

NOTA: se recomienda realizar varias veces las simulaciones en cada ejercicio, ya que éstas son aleatorias, y comentar el resultado más frecuente.

Ejercicio 4.1-Influencia del número de episodios en Montecarlo

Analizar la búsqueda de la política óptima (convergencia al valor óptimo) ejecutando el algoritmo de Montecarlo al variar el número de episodios. En particular, se pide ejecutar el algoritmo para un número de episodios igual a 1000, 10000, 50000, 100000 y 200000, y describir los cambios en términos de la política encontrada para cada simulación, así como el número de pasos para alcanzar la casilla de llegada.

In [21]:
# Escribir el código de las simulaciones aquí 


obs = env.reset()
t, total_reward, done = 0, 0, False

print("Obs inicial: {
                } ".format(obs))

test = [ 1000 , 10000, 50000, 100000 , 200000]
for episodes in test:
    obs = env.reset()
    t, total_reward, done = 0, 0, False
    Q, policy = mc_control_epsilon_greedy(env, num_episodes=episodes, epsilon=0.1)
    print('------------------------------------------------------')
    print('Conclusión de la política '+ str(episodes))
    print_policy(policy,15,15)

Obs inicial: (8, 0)
Episode 1000/1000.------------------------------------------------------
Conclusión de la política 1000
Movimientos:

Action: 0 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Action: 0 -> Obs: (6, 0) and reward: -1
Action: 2 -> Obs: (7, 0) and reward: -1
Posible bucle en la Solución- Considero que la solución no va a ser valida.
Para evitar bucles infinitos en las soluciones con un nivel bajo de episodios añado esta condición


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | U |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | U |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Episode 10000/10000.------------------------------------------------------
Conclusión de la política 10000
Movimientos:

Action: 2 -> Obs: (9, 0) and reward: -1
Action: 2 -> Obs: (10, 0) and reward: -1
Action: 1 -> Obs: (10, 1) and reward: -1
Action: 2 -> Obs: (11, 1) and reward: -1
Action: 2 -> Obs: (12, 1) and reward: -1
Action: 2 -> Obs: (13, 1) and reward: -1
Action: 1 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -12 ; además se han realizado 12 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | D |   |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | D |   |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | D |   |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | R | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Episode 50000/50000.------------------------------------------------------
Conclusión de la política 50000
Movimientos:

Action: 2 -> Obs: (9, 0) and reward: -1
Action: 1 -> Obs: (9, 1) and reward: -1
Action: 2 -> Obs: (10, 1) and reward: -1
Action: 2 -> Obs: (11, 1) and reward: -1
Action: 3 -> Obs: (11, 0) and reward: -1
Action: 2 -> Obs: (12, 0) and reward: -1
Action: 2 -> Obs: (13, 0) and reward: -1
Action: 2 -> Obs: (14, 0) and reward: -1
Action: 1 -> Obs: (14, 1) and reward: -1
Action: 0 -> Obs: (13, 1) and reward: -1
Action: 1 -> Obs: (13, 2) and reward: -1
Action: 2 -> Obs: (14, 2) and reward: -1
Action: 1 -> Obs: (14, 3) and reward: -1
Action: 1 -> Obs: (13, 4) and reward: -1
Action: 1 -> Obs: (12, 5) and reward: -1
Action: 1 -> Obs: (11, 6) and reward: -1
Action: 2 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -18 ; además se han realizado 18 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | D |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | D |   |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D | L |   |   |   |   | D |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D | R | D |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | U | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Episode 100000/100000.------------------------------------------------------
Conclusión de la política 100000
Movimientos:

Action: 2 -> Obs: (9, 0) and reward: -1
Action: 2 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 2 -> Obs: (12, 0) and reward: -1
Action: 1 -> Obs: (12, 1) and reward: -1
Action: 1 -> Obs: (12, 2) and reward: -1
Action: 2 -> Obs: (13, 2) and reward: -1
Action: 3 -> Obs: (13, 1) and reward: -1
Action: 2 -> Obs: (14, 1) and reward: -1
Action: 1 -> Obs: (14, 2) and reward: -1
Action: 1 -> Obs: (14, 3) and reward: -1
Action: 1 -> Obs: (13, 4) and reward: -1
Action: 1 -> Obs: (12, 5) and reward: -1
Action: 1 -> Obs: (11, 6) and reward: -1
Action: 2 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -16 ; además se han realizado 16 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   | D |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | R | D |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | D | L |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | R | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Episode 200000/200000.------------------------------------------------------
Conclusión de la política 200000
Movimientos:

Action: 1 -> Obs: (8, 1) and reward: -1
Action: 2 -> Obs: (9, 1) and reward: -1
Action: 3 -> Obs: (9, 0) and reward: -1
Action: 2 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 1 -> Obs: (11, 1) and reward: -1
Action: 1 -> Obs: (11, 2) and reward: -1
Action: 2 -> Obs: (12, 2) and reward: -1
Action: 2 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -14 ; además se han realizado 14 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | D |   |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D | L |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | R | D |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------

CONCLUSIONES:

El resultado que he obtenido con el algoritmo de Montecarlo ha sido la siguiente tabla:

10001000050000100000200000
Fallido-12-18-16-14

Como se puede observar, el algoritmo de Montecarlo tiene cierto nivel de aleatoriedad. Esto significa que cuando más episodios realizamos más posibilidades tienes para encontrar la ruta óptima y, por lo tanto, de entrenar nuestra política para obtener un mejor resultado.

Dicho esto, en la iteración con 1000 episodios no hemos obtenido una política válida para encontrar el objetivo. Posteriormente, en las diferentes iteraciones superiores sí que hemos conseguido obtener una política válida.

Mi conclusión a esta observación es que, con esta configuración, el número de episodios afecta en la probabilidad de éxito para obtener la mejor política.

Y este matiz de probabilidad lo hemos encontrado en la segunda iteración del algoritmo, donde con una implementación de 10000 episodios de entrenamiento hemos conseguido obtener una política capaz de obtener la recompensa de la forma más óptima que la implementación con 200000 episodios. Ahora bien, los resultados muestran como a una mayor cantidad de episodios utilizada tendremos más probabilidades de implementar una política más certera.

Ejercicio 4.2-Influencia del número de episodios en Q-learning

Analizar la búsqueda de la política óptima ejecutando el algoritmo Q-learning al variar el número de episodios. En particular, se pide ejecutar el algoritmo para un número de episodios igual a 10000, 1000, 500, 100 y 50, y describir los cambios en términos de la función de valor, así como el número de pasos para alcanzar la casilla de llegada. Comentar las diferencias más significativas respecto al apartado anterior.

In [ ]:
def createEpsilonGreedyPolicy(Q, epsilon, num_actions):
    """ 
    Creates an epsilon-greedy policy based 
    on a given Q-function and epsilon. 
       
    Returns a function that takes the state 
    as an input and returns the probabilities 
    for each action in the form of a numpy array  
    of length of the action space(set of possible actions). 
    """
    def policyFunction(state):

        Action_probabilities = np.ones(num_actions,
                dtype = float) * epsilon / num_actions

        best_action = np.argmax(Q[state])
        Action_probabilities[best_action] += (1.0 - epsilon)
        return Action_probabilities

    return policyFunction

def qLearning(env, num_episodes, discount_factor = 1.0,
                            alpha = 0.5, epsilon = 0.05):
    """ 
    Q-Learning algorithm: Off-policy TD control. 
    Finds the optimal greedy policy while improving 
    following an epsilon-greedy policy"""

    # Action value function 
    # A nested dictionary that maps 
    # state -> (action -> action-value). 
    Q = defaultdict(lambda: np.zeros(env.action_space.n))
    # Create an epsilon greedy policy function 
    # appropriately for environment action space 
    policy = createEpsilonGreedyPolicy(Q, epsilon, env.action_space.n)
    steps = []
    # For every episode 
    for ith_episode in range(num_episodes):

        # Reset the environment and pick the first action 
        state = env.reset()

        for t in itertools.count():

            # get probabilities of all actions from current state 
            action_probabilities = policy(state)

            # choose action according to  
            # the probability distribution 
            action = np.random.choice(np.arange(
                      len(action_probabilities)),
                       p = action_probabilities)

            # take action and get reward, transit to next state 
            next_state, reward, done, _ = env.step(action)



            # TD Update 
            best_next_action = np.argmax(Q[next_state])
            td_target = reward + discount_factor * Q[next_state][best_next_action]
            td_delta = td_target - Q[state][action]
            Q[state][action] += alpha * td_delta

            # done is True if episode terminated    
            if done:
                steps.append(t)
                break

            state = next_state

    return Q,policy,steps
In [62]:
# Escribir el código de las simulaciones aquí
from pylab import *

# importar el módulo pyplot
import matplotlib.pyplot as plt
obs = env.reset()
t, total_reward, done = 0, 0, False

print("Obs inicial: {
                } ".format(obs))

test = [  10000, 1000, 500, 100 , 50]
for episodes in test:
    obs = env.reset()
    t, total_reward, done = 0, 0, False
    Q, policy, steps=  qLearning(env, episodes)
    print('------------------------------------------------------')
    print('Conclusión de la política '+ str(episodes))
    print_policy(policy,15,15)
    # importar todas las funciones de pylab

    print('Gráfica con la evolución de los steps a lo largo de los episodios')
    plot(steps)
    show()
    print('Mediana:' + str(median(steps)))
    print('Media:' + str(mean(steps)))
Obs inicial: (8, 0)
------------------------------------------------------
Conclusión de la política 10000
Movimientos:

Action: 1 -> Obs: (8, 1) and reward: -1
Action: 1 -> Obs: (8, 2) and reward: -1
Action: 2 -> Obs: (9, 2) and reward: -1
Action: 2 -> Obs: (10, 2) and reward: -1
Action: 2 -> Obs: (11, 2) and reward: -1
Action: 2 -> Obs: (12, 2) and reward: -1
Action: 2 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -12 ; además se han realizado 12 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | R | D |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Gráfica con la evolución de los steps a lo largo de los episodios
Mediana:11.0
Media:15.3876
------------------------------------------------------
Conclusión de la política 1000
Movimientos:

Action: 1 -> Obs: (8, 1) and reward: -1
Action: 1 -> Obs: (8, 2) and reward: -1
Action: 2 -> Obs: (9, 2) and reward: -1
Action: 2 -> Obs: (10, 2) and reward: -1
Action: 2 -> Obs: (11, 2) and reward: -1
Action: 2 -> Obs: (12, 2) and reward: -1
Action: 2 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -12 ; además se han realizado 12 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | R | D |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Gráfica con la evolución de los steps a lo largo de los episodios
Mediana:11.0
Media:33.797
------------------------------------------------------
Conclusión de la política 500
Movimientos:

Action: 1 -> Obs: (8, 1) and reward: -1
Action: 1 -> Obs: (8, 2) and reward: -1
Action: 2 -> Obs: (9, 2) and reward: -1
Action: 2 -> Obs: (10, 2) and reward: -1
Action: 2 -> Obs: (11, 2) and reward: -1
Action: 2 -> Obs: (12, 2) and reward: -1
Action: 2 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -12 ; además se han realizado 12 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | R | D |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Gráfica con la evolución de los steps a lo largo de los episodios
Mediana:11.0
Media:52.516
------------------------------------------------------
Conclusión de la política 100
Movimientos:

Action: 1 -> Obs: (8, 1) and reward: -1
Action: 2 -> Obs: (9, 1) and reward: -1
Action: 1 -> Obs: (9, 2) and reward: -1
Action: 2 -> Obs: (10, 2) and reward: -1
Action: 2 -> Obs: (11, 2) and reward: -1
Action: 2 -> Obs: (12, 2) and reward: -1
Action: 2 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -12 ; además se han realizado 12 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | D |   |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   | R | D |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Gráfica con la evolución de los steps a lo largo de los episodios
Mediana:13.0
Media:192.89
------------------------------------------------------
Conclusión de la política 50
Movimientos:

Action: 2 -> Obs: (9, 0) and reward: -1
Action: 2 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 0 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Posible bucle en la Solución- Considero que la solución no va a ser valida.
Para evitar bucles infinitos en las soluciones con un nivel bajo de episodios añado esta condición


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | U |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Gráfica con la evolución de los steps a lo largo de los episodios
Mediana:21.0
Media:365.42

El resultado que he obtenido con Q-learning ha sido el siguiente:

10000100050010050
-12-12-12-12Fallida

CONCLUSIONES: Realmente con este algoritmo he obtenido una política óptima en tan solo 100 episodios. Estos resultados confirman que Q-learning es capaz de obtener mejores resultados que el algoritmo Montecarlo en un entorno sin aleatoriedad como el que nos encontramos en este juego.

Dicho esto, este algoritmo aprende antes de ver el resultado final, debido a que puede estimar cual será el retorno de una situación dado el punto en donde se encuentra, esto quiere decir que TD puede ir aprendiendo durante cada paso dentro del camino.

También se observa que este algoritmo converge muy rápidamente y es capaz de obtener la política óptima en muy pocos episodios.

Ejercicio 4.3-Influencia del factor de descuento

Ejecutar el algoritmo de Montecarlo y el algoritmo Q-learning con discount factor=0.1 y el resto de parámetros iguales que en los ejercicios 2 y 3. Describir los cambios en la política óptima, comparando el resultado obtenido con el resultado de los ejercicios 2 y 3 (discount factor=1).

4.3.a Montecarlo

In [28]:
obs = env.reset()
t, total_reward, done = 0, 0, False

print("Obs inicial: {
                } ".format(obs))


obs = env.reset()
t, total_reward, done = 0, 0, False
Q, policy = mc_control_epsilon_greedy(env, num_episodes=250000,discount_factor=0.1, epsilon=0.1)

print('------------------------------------------------------')
print('Conclusión de la política '+ str(250000))
print_policy(policy,15,15)
Obs inicial: (8, 0)
Episode 250000/250000.------------------------------------------------------
Conclusión de la política 250000
Movimientos:

Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Action: 0 -> Obs: (8, 0) and reward: -1
Action: 2 -> Obs: (9, 0) and reward: -1
Posible bucle en la Solución- Considero que la solución no va a ser valida.
Para evitar bucles infinitos en las soluciones con un nivel bajo de episodios añado esta condición


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | U |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
In [23]:
# Escribir el código de las simulaciones aquí


# Escribir el código de las simulaciones aquí
# Escribir el código de las simulaciones aquí
obs = env.reset()
t, total_reward, done = 0, 0, False

print("Obs inicial: {
                } ".format(obs))


obs = env.reset()
t, total_reward, done = 0, 0, False
Q, policy = mc_control_epsilon_greedy(env, num_episodes=250000,discount_factor=0.1, epsilon=0.1)

print('------------------------------------------------------')
print('Conclusión de la política '+ str(250000))
print_policy(policy,15,15)



Obs inicial: (8, 0)
Episode 250000/250000.------------------------------------------------------
Conclusión de la política 250000
Movimientos:

Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Action: 2 -> Obs: (8, 0) and reward: -1
Action: 0 -> Obs: (7, 0) and reward: -1
Posible bucle en la Solución- Considero que la solución no va a ser valida.
Para evitar bucles infinitos en las soluciones con un nivel bajo de episodios añado esta condición


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | U |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------

4.3.b Q-learning

In [ ]:
def createEpsilonGreedyPolicy(Q, epsilon, num_actions):
    """ 
    Creates an epsilon-greedy policy based 
    on a given Q-function and epsilon. 
       
    Returns a function that takes the state 
    as an input and returns the probabilities 
    for each action in the form of a numpy array  
    of length of the action space(set of possible actions). 
    """
    def policyFunction(state):

        Action_probabilities = np.ones(num_actions,
                dtype = float) * epsilon / num_actions

        best_action = np.argmax(Q[state])
        Action_probabilities[best_action] += (1.0 - epsilon)
        return Action_probabilities

    return policyFunction

def qLearning(env, num_episodes, discount_factor = 1.0,
                            alpha = 0.5, epsilon = 0.05):
    """ 
    Q-Learning algorithm: Off-policy TD control. 
    Finds the optimal greedy policy while improving 
    following an epsilon-greedy policy"""

    # Action value function 
    # A nested dictionary that maps 
    # state -> (action -> action-value). 
    Q = defaultdict(lambda: np.zeros(env.action_space.n))
    # Create an epsilon greedy policy function 
    # appropriately for environment action space 
    policy = createEpsilonGreedyPolicy(Q, epsilon, env.action_space.n)
    steps = []
    # For every episode 
    for ith_episode in range(num_episodes):

        # Reset the environment and pick the first action 
        state = env.reset()

        for t in itertools.count():

            # get probabilities of all actions from current state 
            action_probabilities = policy(state)

            # choose action according to  
            # the probability distribution 
            action = np.random.choice(np.arange(
                      len(action_probabilities)),
                       p = action_probabilities)

            # take action and get reward, transit to next state 
            next_state, reward, done, _ = env.step(action)



            # TD Update 
            best_next_action = np.argmax(Q[next_state])
            td_target = reward + discount_factor * Q[next_state][best_next_action]
            td_delta = td_target - Q[state][action]
            Q[state][action] += alpha * td_delta

            # done is True if episode terminated    
            if done:
                steps.append(t)
                break

            state = next_state

    return Q,policy,steps
In [55]:
# Escribir el código de las simulaciones aquí
# Escribir el código de las simulaciones aquí
obs = env.reset()
t, total_reward, done = 0, 0, False

print("Obs inicial: {
                } ".format(obs))


obs = env.reset()
t, total_reward, done = 0, 0, False
Q, policy,steps =  qLearning(env, 1000,discount_factor=0.1)

print('------------------------------------------------------')
print('Conclusión de la política '+ str(1000))
print_policy(policy,15,15)


from pylab import *

import matplotlib.pyplot as plt
print('Gráfica con la evolución de los steps a lo largo de los episodios')
plot(steps)
show()
print('Mediana:' + str(median(steps)))
print('Media:' + str(mean(steps)))


Q,policy,steps = qLearning(env, 1000)
# importar todas las funciones de pylab
from pylab import *

# importar el módulo pyplot
import matplotlib.pyplot as plt
print('Gráfica con la evolución de los steps a lo largo de los episodios')
plot(steps)
show()
print('Mediana:' + str(median(steps)))
print('Media:' + str(mean(steps)))
Obs inicial: (8, 0)
------------------------------------------------------
Conclusión de la política 1000
Movimientos:

Action: 1 -> Obs: (8, 1) and reward: -1
Action: 1 -> Obs: (8, 2) and reward: -1
Action: 2 -> Obs: (9, 2) and reward: -1
Action: 2 -> Obs: (10, 2) and reward: -1
Action: 2 -> Obs: (11, 2) and reward: -1
Action: 2 -> Obs: (12, 2) and reward: -1
Action: 2 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -12 ; además se han realizado 12 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | R | D |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Gráfica con la evolución de los steps a lo largo de los episodios
Mediana:11.0
Media:8822.905
Gráfica con la evolución de los steps a lo largo de los episodios
Mediana:11.0
Media:33.745

CONCLUSIONES:

Si recordamos la teoría, el factor de descuento determina la importancia de recompensas futuras. Un factor de 0 hará que el agente sea "miope" (o corto de miras) por considerar únicamente las recompensas a corto plazo, mientras que un factor que se acerca a 1 hará que luche por una recompensa alta a largo plazo.

En el algoritmo de monte carlo no hemos pasado de las primeras casillas ya que con esta configuración no se prima la investigación. El factor de descuento se introduce para evitar que los problemas continuos manejen recompensas infinitas pero en un entorno tan limitado no son buenas ya que se ha primado los movimientos iniciales sobre los más alejados y, por lo tanto, las recompensas para los movimientos acertados no se diferencian lo suficiente con los aciertos. Por este motivo no es una solución óptima.

Respecto a Q-learning no he encontrado ninguna merma en el algoritmo en la cantidad de recompensas obtenida. Lo que sí que he observado es que disminuye bastante la media de los episodios si utilizamos discount factor = 1 y, en cambio, aumenta cuando tenemos un discount factor = 0.1. Entiendo que el algoritmo realiza más iteraciones y busca más soluciones en cada iteración que permitan resolver el juego ya que la merma de las recompensas con un discount factor = 0.1. provoca una pérdida de la capacidad de discernir entre las diferentes soluciones. Las recompensas han disminuido tanto que todas las soluciones tienen una recompensa muy pareja.

Ejercicio 4.4-Influencia del learning rate

Ejecutar el algoritmo de Q-learning con los siguientes valores de learning rate: 0.1 y 0.9. Analizar las diferencias con los resultados obtenidos en la pregunta 3 en términos de número de time-steps para llegar a la posición objetivo. Para ello, es necesario usar el mismo número de episodios. Finalmente, comparar el número de pasos por episodio (representar gráficamente el número de time-steps para cada episodio de la simulación en ambos casos) y verificar con que valor de learning rate el algoritmo converge más rápidamente.

In [54]:
# Escribir el código de las simulaciones aquí
# Escribir el código de las simulaciones aquí
obs = env.reset()
t, total_reward, done = 0, 0, False

print("Obs inicial: {
                } ".format(obs))


obs = env.reset()
t, total_reward, done = 0, 0, False
Q, policy, steps =  qLearning(env, 1000,  alpha = 0.1 )

print('------------------------------------------------------')
print('Conclusión de la política '+ str(250000))
print_policy(policy,15,15)

# importar todas las funciones de pylab
from pylab import *

# importar el módulo pyplot
import matplotlib.pyplot as plt
print('Gráfica con la evolución de los steps a lo largo de los episodios')
plot(steps)
show()
print('Mediana:' + str(median(steps)))
print('Media:' + str(mean(steps)))
Obs inicial: (8, 0)
------------------------------------------------------
Conclusión de la política 250000
Movimientos:

Action: 2 -> Obs: (9, 0) and reward: -1
Action: 2 -> Obs: (10, 0) and reward: -1
Action: 2 -> Obs: (11, 0) and reward: -1
Action: 2 -> Obs: (12, 0) and reward: -1
Action: 2 -> Obs: (13, 0) and reward: -1
Action: 1 -> Obs: (13, 1) and reward: -1
Action: 1 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -12 ; además se han realizado 12 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | D |   |   |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | R | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Gráfica con la evolución de los steps a lo largo de los episodios
Mediana:11.0
Media:98.842
In [50]:
# Escribir el código de las simulaciones aquí
# Escribir el código de las simulaciones aquí
obs = env.reset()
t, total_reward, done = 0, 0, False

print("Obs inicial: {
                } ".format(obs))


obs = env.reset()
t, total_reward, done = 0, 0, False
Q, policy, steps=  qLearning(env, 1000,  alpha = 0.9 )

print('------------------------------------------------------')
print('Conclusión de la política '+ str(250000))
print_policy(policy,15,15)


# importar todas las funciones de pylab
from pylab import *

# importar el módulo pyplot
import matplotlib.pyplot as plt
print('Gráfica con la evolución de los steps a lo largo de los episodios')
plot(steps)
show()
print('Mediana:' + str(median(steps)))
print('Media:' + str(mean(steps)))
Obs inicial: (8, 0)
------------------------------------------------------
Conclusión de la política 250000
Movimientos:

Action: 1 -> Obs: (8, 1) and reward: -1
Action: 1 -> Obs: (8, 2) and reward: -1
Action: 2 -> Obs: (9, 2) and reward: -1
Action: 2 -> Obs: (10, 2) and reward: -1
Action: 2 -> Obs: (11, 2) and reward: -1
Action: 2 -> Obs: (12, 2) and reward: -1
Action: 2 -> Obs: (13, 2) and reward: -1
Action: 1 -> Obs: (13, 3) and reward: -1
Action: 1 -> Obs: (12, 4) and reward: -1
Action: 1 -> Obs: (11, 5) and reward: -1
Action: 1 -> Obs: (10, 6) and reward: -1
Action: 1 -> Obs: (8, 7) and reward: -1
La recompensa final es: -12 ; además se han realizado 12 Movimientos


Mapa:

--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 | R | R | D |   |   |   |   | G |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   |   | R |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   |   | R |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | D |   | R |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   | R | R |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
--------------------------------------------------------------
Gráfica con la evolución de los steps a lo largo de los episodios
Mediana:11.0
Media:25.221

CONCLUSIONES:

Cómo puedo comprobar en las gráficas con la cantidad de pasos, al aumentar el valor de alpha disminuyen la cantidad de pasos en el algoritmo. Es decir, hemos obtenido una solución más óptima más rápidamente.

Alpha determina hasta qué punto la información adquirida sobrescribe la información vieja. Un factor de 0 hace que el agente no aprende (únicamente aprovechando el conocimiento previo), mientras un factor de 1 hace que el agente considere sólo la información más reciente (ignorando el conocimiento previo para explorar posibilidades).

En entornos totalmente deterministas cómo el juego analizado, un índice de aprendizaje de alpha=1 es óptimo. Cuándo el problema es estocástico, el algoritmo converge bajo determinadas condiciones técnicas en el índice de aprendizaje que requiere un descenso hasta cero. Esto es debido a que el escenario es el mismo y no es necesario reescribir lo aprendido.