{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2e096bf4-7ea9-46d2-bc65-5828860c29ad",
   "metadata": {},
   "source": [
    "<img style = \"float: left\" src=\"https://mirrors.creativecommons.org/presskit/buttons/88x31/png/by-nc-nd.png\" width=\"120\"> &copy; 2026 Roger Villemaire, [villemaire.roger@uqam.ca](mailto:villemaire.roger@uqam.ca)  \n",
    "[Creative Commons Paternité - Pas d'Utilisation Commerciale - Pas de Modification 3.0 non transcrit](http://creativecommons.org/licenses/by-nc-nd/3.0/)\n",
    "\n",
    "# Planification avec Fast Downward\n",
    "\n",
    "Cette semaine, nous allons utiliser la bibliothèque [Fast Downward](https://www.fast-downward.org) pour résoudre un problème de planification. Il s'agit d'une bibliothèque de code très efficace et largement utilisée.\n",
    "\n",
    "Comme la dernière fois : faites Ctrl-entrée dans une cellule ou utilisez le bouton &#9654; pour faire exécuter le code."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a19ed242-a4f3-4bd3-a0ec-e2564722b505",
   "metadata": {},
   "source": [
    "## Installation\n",
    "\n",
    "Tout d'abord, il faut faire l'installation de la bibliothèque de code dans notre environnement. Pour ce faire, faites exécuter la cellule suivante. Ceci n'est d'ailleurs nécessaire qu'une seule fois."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2655061d-c40b-4507-b699-25f55735f9c2",
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install unified_planning up-fast-downward"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7cb9c7e3-2add-42ef-a91f-7584ba053d8f",
   "metadata": {},
   "source": [
    "## Exécution du planificateur\n",
    "\n",
    "On peut maintenant se servir de ce planificateur pour trouver une solution au problème `problemeRobot2.pddl` du `domaineRobot2.pddl`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c34aabc8-3e21-4299-95f1-3a1c7320087b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from unified_planning.io import PDDLReader\n",
    "from unified_planning.shortcuts import OneshotPlanner\n",
    "\n",
    "# On indique ici les noms des fichiers qui doivent se trouver dans ce même répertoire et donc être visibles à gauche.\n",
    "domain_file = \"domaineRobot2.pddl\"\n",
    "problem_file = \"problemeRobot2.pddl\"\n",
    "\n",
    "# On charge les fichiers dans le moteur du planificateur.\n",
    "reader = PDDLReader()\n",
    "problem = reader.parse_problem(domain_file, problem_file)\n",
    "\n",
    "# On demande au planificateur de nous trouver une solution.\n",
    "with OneshotPlanner(name=\"fast-downward\") as planner:\n",
    "    result = planner.solve(problem)\n",
    "\n",
    "    # On affiche le plan, s'il a été trouvé.\n",
    "    if result.plan is not None:\n",
    "        print(\"--- Plan trouvé ! ---\")\n",
    "        for action in result.plan.actions:\n",
    "            print(action)\n",
    "    else:\n",
    "        print(\"Aucun plan n'a pu être trouvé pour ce problème.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "81fc8ca0-4209-46f1-b49a-d9a21e7accd4",
   "metadata": {},
   "source": [
    "**Remarque :** Par défaut, **Fast Downward** utilise sa configuration (LAMA) pour nous donner une solution valide le plus rapidement possible. Pour obtenir le chemin le plus court/le moins cher (plan optimal), on peut remplacer  \n",
    "name=\"fast-downward\"  \n",
    "par  \n",
    "name=\"fast-downward-opt\"  \n",
    "ci-dessus."
   ]
  }
 ],
 "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.14.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
