{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ed7bd367-160a-48cb-85e7-9977d975ab11",
   "metadata": {},
   "source": [
    "# Analyse de l’approche DQN (Deep Q-Learning Network)\n",
    "\n",
    "### Réalisé par :  \n",
    "- **Akram DOUBLI** Groupe A\n",
    "- **Mohammed FARAJI**  Groupe A\n",
    "\n",
    "### Objectif de cette partie du projet   \n",
    "comprendre les éléments structurels de l'approche DQN et les différences par rapport aux approches précédentes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3a8e4b1-2563-4f64-bd1d-0954af517639",
   "metadata": {},
   "source": [
    "## Présentation de l’approche DQN\n",
    "\n",
    "Le **Deep Q-Learning Network (DQN)** est une extension du Q-Learning qui utilise un **réseau de neurones** pour approximer la fonction de valeur d’action `Q(s, a)`. Contrairement au Q-Learning classique qui utilise une **table Q** pour stocker les valeurs des actions possibles, DQN apprend directement une fonction `Q` à l’aide d’un **réseau de neurones profond**.  \n",
    "\n",
    "L’objectif de DQN est d’améliorer l’efficacité de l’apprentissage par renforcement en gérant des **espaces d’états continus et de grande dimension**, où une table `Q` devient inefficace à cause de la **combinatoire explosive**.  \n",
    "\n",
    "**Principaux éléments introduits par DQN :**  \n",
    "- Approximation de `Q(s, a)` par un réseau de neurones \n",
    "- Utilisation d’une mémoire de rejoue (Replay Buffer pour stabiliser l’apprentissage \n",
    "- Ciblage différé (Target Network pour éviter les mises à jour instables "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b9b0996e-0378-4b0f-ad4c-640daae80063",
   "metadata": {},
   "source": [
    "## Structure du tutoriel TensorFlow/Keras  \n",
    "\n",
    "Le tutoriel TensorFlow/Keras propose un **exemple d’application de DQN** sur l’environnement **CartPole** de la bibliothèque `gym`.  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "13838180-91b7-4c86-83af-18751b209411",
   "metadata": {},
   "source": [
    "### **Description de l’environnement CartPole**  \n",
    "L’agent doit équilibrer un **poteau sur un chariot mobile**. Il peut **déplacer le chariot à gauche ou à droite** et reçoit une **récompense positive** pour chaque pas de temps où le poteau reste en équilibre.  \n",
    "\n",
    "**États et actions possibles :**  \n",
    "- **Espaces d’états** : position, vitesse, angle du poteau, vitesse angulaire.  \n",
    "- **Espaces d’actions** : `0` (déplacer à gauche), `1` (déplacer à droite).  \n",
    "- **Objectif** : maintenir l’équilibre du poteau aussi longtemps que possible.  "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b989890a-c207-4b0b-ac0a-e525c6d3b300",
   "metadata": {},
   "source": [
    "### **Configuration de l’agent DQN**  \n",
    "L’agent DQN est défini en utilisant **TF-Agents**, une bibliothèque spécialisée pour l’apprentissage par renforcement avec TensorFlow.  \n",
    "\n",
    "**Principales étapes de configuration :**  \n",
    "1. **Définition de l’environnement** avec OpenAI Gym (`tf_agents.environments`).\n",
    "2. **Création du réseau de neurones** (`tf_agents.networks.q_network.QNetwork`).\n",
    "3. **Initialisation de l’agent DQN** (`tf_agents.agents.dqn.dqn_agent.DqnAgent`).\n",
    "4. **Configuration de la mémoire de rejoue** (`Replay Buffer`).\n",
    "5. **Stratégie d’exploration** (`epsilon-greedy`)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a016d9dd-2a4e-4ed8-8f7a-f9a38789d319",
   "metadata": {},
   "source": [
    "### **Processus d’entraînement de l’agent**  \n",
    "L’agent est entraîné en jouant plusieurs épisodes du jeu **CartPole**, avec les étapes suivantes :  \n",
    "1. **Exécuter une action `a` selon la politique actuelle (`π`)**.  \n",
    "2. **Observer la récompense `r` et le nouvel état `s'`**.  \n",
    "3. **Stocker l’expérience `(s, a, r, s')` dans la mémoire de rejoue**.  \n",
    "4. **Mettre à jour le réseau de neurones en minimisant l’erreur de Bellman**.  "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94ddf14e-4ccc-4971-9717-cfa88aabb0db",
   "metadata": {},
   "source": [
    "### **Évaluation des performances**  \n",
    "Après l’entraînement, l’agent est testé **sans exploration (`ε = 0`)** pour mesurer sa capacité à maintenir l’équilibre du poteau."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02550abb-1d4f-4cc3-8391-35fadf1f4f84",
   "metadata": {},
   "source": [
    "## Comparaison entre DQN et Q-Learning  \n",
    "\n",
    "| **Critère**         | **Q-Learning Classique** | **DQN (Deep Q-Network)** |\n",
    "|--------------------|----------------------|-----------------------|\n",
    "| **Représentation de `Q(s, a)`** | Table `Q` | Réseau de neurones |\n",
    "| **Gestion des grands espaces d’états** | Mauvaise (trop de valeurs à stocker) | Très bonne (approximation continue) |\n",
    "| **Exploration/Exploitation** | `ε-greedy` simple | `ε-greedy` + Replay Buffer |\n",
    "| **Stabilité de l’apprentissage** | Instable sur problèmes complexes | Plus stable grâce au Target Network |\n",
    "| **Mémoire** | Besoin de stocker `Q(s, a)` | Besoin d’une mémoire de rejoue |\n",
    "| **Vitesse d’apprentissage** | Rapide sur petits environnements | Plus lent mais mieux adapté aux problèmes complexes |\n",
    "\n",
    "DQN est particulièrement efficace pour les environnements complexes où Q-Learning classique devient impraticable à cause de la taille des espaces d’états"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a895b0b9-7833-462a-ad64-813c33f84661",
   "metadata": {},
   "source": [
    "## Conclusion  \n",
    "\n",
    "L’approche **DQN (Deep Q-Learning Network)** représente une amélioration majeure par rapport au Q-Learning classique en remplaçant la **table Q** par un **réseau de neurones** capable d’approximer `Q(s, a)` dans des environnements de grande dimension. Grâce à des techniques comme la **mémoire de rejoue** et le **Target Network**, il améliore la stabilité et l’efficacité de l’apprentissage.  \n",
    "\n",
    "Comparé à **Value Iteration et Policy Iteration**, qui supposent une connaissance complète du MDP, DQN permet d’apprendre dans des environnements complexes et inconnus à condition d’avoir un grand nombre d’épisodes et un bon réglage des hyperparamètres (`ε`, `α`, `γ`).  \n",
    "\n",
    "Cette approche est aujourd’hui utilisée dans des applications avancées comme les jeux vidéo (Atari), la robotique et la finance"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
