Exercice 1 : Expolartion de l'Environnement FrozenLake¶

Objectif : Charger l'environnement FrozenLake-v1 et explorer les espaces d'états et d'actions. Exécuter des actions aléatoires pour observer les transitions et les récompenses.

In [1]:
# Charger l'environnement FrozenLake
import gymnasium as gym

# Créer l'environnement FrozenLake avec des transitions glissantes
env = gym.make("FrozenLake-v1", is_slippery=True, render_mode="human")
env.reset()

# Afficher les informations de l'espace d'états et d'actions
print("Nombre d'états:", env.observation_space.n)
print("Nombre d'actions:", env.action_space.n)

# Exécuter une boucle où l'agent prend des actions aléatoires
num_episodes = 10
for episode in range(num_episodes):
    state = env.reset()[0]  # Réinitialiser l'environnement
    done = False
    while not done:
        action = env.action_space.sample()  # Action aléatoire
        next_state, reward, done, truncated, info = env.step(action)
        print(f"Épisode {episode+1} - État: {state}, Action: {action}, Récompense: {reward}")
        state = next_state

env.close()
Nombre d'états: 16
Nombre d'actions: 4
Épisode 1 - État: 0, Action: 1, Récompense: 0.0
Épisode 1 - État: 1, Action: 3, Récompense: 0.0
Épisode 1 - État: 0, Action: 2, Récompense: 0.0
Épisode 1 - État: 0, Action: 3, Récompense: 0.0
Épisode 1 - État: 1, Action: 1, Récompense: 0.0
Épisode 1 - État: 0, Action: 1, Récompense: 0.0
Épisode 1 - État: 1, Action: 0, Récompense: 0.0
Épisode 2 - État: 0, Action: 1, Récompense: 0.0
Épisode 2 - État: 1, Action: 1, Récompense: 0.0
Épisode 2 - État: 2, Action: 1, Récompense: 0.0
Épisode 2 - État: 1, Action: 1, Récompense: 0.0
Épisode 2 - État: 2, Action: 3, Récompense: 0.0
Épisode 2 - État: 2, Action: 0, Récompense: 0.0
Épisode 2 - État: 6, Action: 0, Récompense: 0.0
Épisode 2 - État: 2, Action: 2, Récompense: 0.0
Épisode 2 - État: 3, Action: 0, Récompense: 0.0
Épisode 2 - État: 2, Action: 0, Récompense: 0.0
Épisode 2 - État: 2, Action: 1, Récompense: 0.0
Épisode 2 - État: 3, Action: 0, Récompense: 0.0
Épisode 2 - État: 3, Action: 2, Récompense: 0.0
Épisode 3 - État: 0, Action: 1, Récompense: 0.0
Épisode 3 - État: 4, Action: 3, Récompense: 0.0
Épisode 3 - État: 4, Action: 1, Récompense: 0.0
Épisode 3 - État: 4, Action: 3, Récompense: 0.0
Épisode 3 - État: 4, Action: 3, Récompense: 0.0
Épisode 3 - État: 0, Action: 2, Récompense: 0.0
Épisode 3 - État: 0, Action: 1, Récompense: 0.0
Épisode 3 - État: 1, Action: 0, Récompense: 0.0
Épisode 3 - État: 1, Action: 1, Récompense: 0.0
Épisode 4 - État: 0, Action: 1, Récompense: 0.0
Épisode 4 - État: 0, Action: 1, Récompense: 0.0
Épisode 4 - État: 4, Action: 0, Récompense: 0.0
Épisode 4 - État: 0, Action: 1, Récompense: 0.0
Épisode 4 - État: 4, Action: 3, Récompense: 0.0
Épisode 4 - État: 4, Action: 2, Récompense: 0.0
Épisode 4 - État: 8, Action: 0, Récompense: 0.0
Épisode 5 - État: 0, Action: 2, Récompense: 0.0
Épisode 5 - État: 0, Action: 3, Récompense: 0.0
Épisode 5 - État: 1, Action: 1, Récompense: 0.0
Épisode 6 - État: 0, Action: 2, Récompense: 0.0
Épisode 6 - État: 1, Action: 3, Récompense: 0.0
Épisode 6 - État: 2, Action: 3, Récompense: 0.0
Épisode 6 - État: 3, Action: 3, Récompense: 0.0
Épisode 6 - État: 3, Action: 3, Récompense: 0.0
Épisode 6 - État: 2, Action: 0, Récompense: 0.0
Épisode 6 - État: 6, Action: 3, Récompense: 0.0
Épisode 7 - État: 0, Action: 3, Récompense: 0.0
Épisode 7 - État: 1, Action: 0, Récompense: 0.0
Épisode 7 - État: 1, Action: 0, Récompense: 0.0
Épisode 8 - État: 0, Action: 1, Récompense: 0.0
Épisode 8 - État: 0, Action: 1, Récompense: 0.0
Épisode 8 - État: 0, Action: 2, Récompense: 0.0
Épisode 8 - État: 4, Action: 0, Récompense: 0.0
Épisode 8 - État: 0, Action: 3, Récompense: 0.0
Épisode 8 - État: 1, Action: 1, Récompense: 0.0
Épisode 8 - État: 0, Action: 1, Récompense: 0.0
Épisode 8 - État: 1, Action: 1, Récompense: 0.0
Épisode 8 - État: 0, Action: 1, Récompense: 0.0
Épisode 8 - État: 4, Action: 2, Récompense: 0.0
Épisode 8 - État: 8, Action: 3, Récompense: 0.0
Épisode 8 - État: 9, Action: 2, Récompense: 0.0
Épisode 8 - État: 10, Action: 0, Récompense: 0.0
Épisode 8 - État: 14, Action: 1, Récompense: 1.0
Épisode 9 - État: 0, Action: 3, Récompense: 0.0
Épisode 9 - État: 0, Action: 2, Récompense: 0.0
Épisode 9 - État: 0, Action: 2, Récompense: 0.0
Épisode 9 - État: 4, Action: 3, Récompense: 0.0
Épisode 9 - État: 0, Action: 0, Récompense: 0.0
Épisode 9 - État: 4, Action: 2, Récompense: 0.0
Épisode 10 - État: 0, Action: 2, Récompense: 0.0
Épisode 10 - État: 0, Action: 2, Récompense: 0.0
Épisode 10 - État: 0, Action: 2, Récompense: 0.0
Épisode 10 - État: 0, Action: 2, Récompense: 0.0
Épisode 10 - État: 4, Action: 3, Récompense: 0.0
Épisode 10 - État: 4, Action: 2, Récompense: 0.0
Épisode 10 - État: 8, Action: 2, Récompense: 0.0
Épisode 10 - État: 4, Action: 0, Récompense: 0.0
Épisode 10 - État: 4, Action: 2, Récompense: 0.0
Épisode 10 - État: 0, Action: 2, Récompense: 0.0
Épisode 10 - État: 1, Action: 0, Récompense: 0.0
Épisode 10 - État: 1, Action: 2, Récompense: 0.0
Épisode 10 - État: 2, Action: 3, Récompense: 0.0
Épisode 10 - État: 1, Action: 3, Récompense: 0.0
Épisode 10 - État: 1, Action: 0, Récompense: 0.0
Épisode 10 - État: 0, Action: 0, Récompense: 0.0
Épisode 10 - État: 0, Action: 1, Récompense: 0.0
Épisode 10 - État: 1, Action: 3, Récompense: 0.0
Épisode 10 - État: 1, Action: 3, Récompense: 0.0
Épisode 10 - État: 1, Action: 3, Récompense: 0.0
Épisode 10 - État: 2, Action: 0, Récompense: 0.0
Épisode 10 - État: 2, Action: 0, Récompense: 0.0
Épisode 10 - État: 6, Action: 2, Récompense: 0.0
Épisode 10 - État: 10, Action: 2, Récompense: 0.0

Exercice 2 : Initialisation de la Q-Table¶

Objectif : Initialiser une Q-Table avec des valeurs nulles pour chaque état-action.

In [2]:
import numpy as np

# Initialiser la Q-table avec des zéros
num_states = env.observation_space.n
num_actions = env.action_space.n

q_table = np.zeros((num_states, num_actions))

# Affichage de la Q-Table initialisée
print("Q-Table initialisée:")
print(q_table)
Q-Table initialisée:
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

Exercice 3 : Implementation du Q-Learning avec Mise A jour¶

Objectif : Implémenter l'algorithme Q-Learning pour apprendre les meilleures actions à prendre dans chaque état.

In [5]:
import gymnasium as gym
import numpy as np


env = gym.make("FrozenLake-v1", is_slippery=True)


alpha = 0.1  # Taux d'apprentissage
gamma = 0.99  # Facteur de discount
epsilon = 1.0  # Exploration initiale
epsilon_decay = 0.995  # Décroissance d'epsilon
num_episodes = 1000  # Nombre d'épisodes

# Initialisation de la Q-table
num_states = env.observation_space.n
num_actions = env.action_space.n
q_table = np.zeros((num_states, num_actions))

for episode in range(num_episodes):
    state, _ = env.reset()  
    done = False

    while not done:
        
        if np.random.uniform(0, 1) < epsilon:
            action = env.action_space.sample()  # Exploration
        else:
            action = np.argmax(q_table[state, :])  # Exploitation

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

        
        q_table[state, action] = q_table[state, action] + alpha * (
            reward + gamma * np.max(q_table[next_state, :]) - q_table[state, action]
        )

        state = next_state

   
    epsilon *= epsilon_decay

env.close()  

print("Q-Table après apprentissage:")
print(q_table)
Q-Table après apprentissage:
[[4.55325515e-01 3.30128174e-01 3.03743465e-01 2.83100367e-01]
 [3.93584984e-02 6.07668429e-02 3.48409588e-02 1.88395873e-01]
 [1.28907277e-01 4.34843500e-03 4.04681843e-03 1.82988758e-02]
 [3.53961632e-05 9.97287105e-04 1.99536934e-04 1.10395859e-03]
 [4.62847973e-01 2.93485088e-01 2.23050948e-01 2.03149009e-01]
 [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
 [2.83443278e-02 1.20796592e-01 1.85281001e-02 0.00000000e+00]
 [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
 [1.84689384e-01 2.26050303e-01 3.23309970e-01 4.90224207e-01]
 [2.34132866e-01 5.08018571e-01 2.26871642e-01 1.99337449e-01]
 [1.28685668e-01 3.98675869e-01 8.93723578e-02 7.84362375e-02]
 [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
 [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
 [2.01998140e-01 3.18079863e-01 6.69163875e-01 2.65208981e-01]
 [2.99399244e-01 8.29967099e-01 4.74885063e-01 5.21204981e-01]
 [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]

Exercice 4 : Évaluation des Performances de l’Agent¶

Objectif : Évaluer les performances de l'agent en utilisant la Q-Table apprise.

In [6]:
num_test_episodes = 100
successes = 0

for episode in range(num_test_episodes):
    state = env.reset()[0]
    done = False
    
    while not done:
        action = np.argmax(q_table[state, :]) 
        next_state, reward, done, truncated, _ = env.step(action)
        state = next_state

        if reward == 1:  
            successes += 1

print(f"Taux de réussite: {successes}/{num_test_episodes} ({(successes/num_test_episodes) * 100:.2f}%)")
Taux de réussite: 68/100 (68.00%)