{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "83c2b1e7-b401-4a15-adf0-d43cebf9ad81",
   "metadata": {},
   "source": [
    "# **Algorithm project** # \n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "0b4f92e5-ac40-4491-983d-890c4f0f6694",
   "metadata": {},
   "source": [
    "## <u> Contexte du projet </u>\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "5f483b31-1246-4f00-ae39-718ef92ce9eb",
   "metadata": {},
   "source": [
    "L'ADEME a lancé un appel pour promouvoir de nouvelles solutions de mobilité. CesiCDP, avec son équipe de 4 personnes, répond à cet appel en se concentrant sur la gestion de tournées de livraison. L'objectif est de minimiser la durée totale de la tournée en tenant compte du trafic et d'autres contraintes. Des financements attractifs sont en jeu pour développer l'activité de CesiCDP. L'ajout de contraintes supplémentaires au problème rendra l'étude plus réaliste et plus difficile à résoudre, mais cela démontrera l'expertise de l'équipe."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "fc23daaf-9f25-4c5a-bf6c-300a7ed8d623",
   "metadata": {},
   "source": [
    "Notre objectif est de développer un algorithme qui nous permettra de passer par tous les points de livraison dans un temps optimisé."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "d633beb7-8f26-46d4-9cd9-1d0093e5b5c3",
   "metadata": {},
   "source": [
    "## <u>Contraintes choisies </u>\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "35fc1c3c-d7a9-4423-a948-aa00ab51dbf4",
   "metadata": {},
   "source": [
    "La contrainte que nous avons choisie est la suivante :\n",
    "\n",
    "- Avoir plusieurs camions disponibles simultanément pour effectuer les livraisons."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "ba356166-604a-4627-ac0f-93b76eb7a22d",
   "metadata": {},
   "source": [
    "## <u>Formulation du problème  </u>"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "c4d6888b-14e6-4745-880f-0a063ebf7476",
   "metadata": {},
   "source": [
    "Considérons un graphe G=(V,E), où V est l'ensemble des villes (ou points de livraison) et E est l'ensemble des routes entre les villes. Il y a k camions disponibles pour effectuer les livraisons.\n",
    "\n",
    "Le problème consiste à trouver un itinéraire pour chaque camion, de sorte que toutes les livraisons soient effectuées dans le temps le plus court possible, à la fois vers et depuis l'entrepôt.\n",
    "\n",
    "Le problème que nous avons avec les contraintes mentionnées ci-dessus est le VRP (Problème de Routage des Véhicules)."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "6d392f68",
   "metadata": {},
   "source": [
    "## <u> Contraintes du problème </u>"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "f95dba22",
   "metadata": {},
   "source": [
    "Liste des contraintes du problème :\n",
    "\n",
    "- Tous les clients doivent être servis.\n",
    "- Un client ne peut être servi que par un seul véhicule.\n",
    "- Lorsqu'un véhicule quitte un client, il ne peut se rendre que chez un autre client.\n",
    "\n",
    "Nous allons donc attribuer à chaque client une route desservie par un seul véhicule."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "c1ca5507",
   "metadata": {},
   "source": [
    "## <u>Demonstration de la complexité du VRP </u>"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "37632b4b",
   "metadata": {},
   "source": [
    "#### **Introduction**\n",
    "\n",
    "Le Problème de Routage des Véhicules (VRP) est une extension du Problème du Voyageur de Commerce (TSP) et est connu pour être un problème NP-difficile. Nous allons démontrer la complexité du VRP en nous basant sur le problème de la chaîne Hamiltonienne, qui est connu pour être NP-complet."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "6a63522a",
   "metadata": {},
   "source": [
    "#### **Définitions préliminaires**\n",
    "\n",
    "- Problème de la chaîne Hamiltonienne : le problème consiste à déterminer si un graphe non orienté donné possède une chaîne Hamiltonienne, c'est-à-dire un chemin qui visite chaque sommet exactement une fois.\n",
    "\n",
    "- Problème du voyageur de commerce (TSP) : le problème consiste à trouver le circuit le plus court possible qui visite chaque ville d'un ensemble donné de villes et revient à la ville d'origine.\n",
    "\n",
    "- Problème de routage des véhicules (VRP) : le problème consiste à livrer une série de clients avec plusieurs véhicules tout en minimisant le coût total, tel que le temps de livraison ou la distance parcourue."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "589a1874",
   "metadata": {},
   "source": [
    "#### **Preuve de complexité du TSP**.\n",
    "\n",
    "Le TSP (Traveling Salesman Problem) est une extension du problème de chaîne Hamiltonienne. En fait, un cas particulier du TSP est le problème de chaîne Hamiltonienne, dans lequel toutes les arêtes ont le même poids (ou coût). Dans ce cas, trouver le circuit le plus court dans le TSP revient à trouver une chaîne Hamiltonienne dans le graphe. Puisque le problème de chaîne Hamiltonienne est NP-complet, le TSP doit être au moins aussi difficile, donc le TSP est NP-complet."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "92658e81",
   "metadata": {},
   "source": [
    "#### **Preuve de complexité du VRP**.\n",
    "\n",
    "Le VRP (Vehicle Routing Problem) est une extension du TSP (Traveling Salesman Problem). En fait, un cas particulier du VRP est le TSP où il n'y a qu'un seul véhicule disponible pour effectuer les livraisons. Dans ce cas, trouver la solution au VRP revient à trouver la solution au TSP.\n",
    "\n",
    "Puisque le TSP est NP-complet, le VRP doit être au moins aussi difficile, donc le VRP est NP-difficile. De plus, le VRP introduit des contraintes supplémentaires, telles que la présence de plusieurs véhicules et éventuellement des capacités de véhicule et des fenêtres de temps, ce qui le rend encore plus complexe."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "a4106346",
   "metadata": {},
   "source": [
    "#### **Conclusion**\n",
    "\n",
    "En conclusion, nous avons démontré que le problème de VRP (Vehicle Routing Problem) est un problème NP-difficile en le réduisant au problème TSP (Traveling Salesman Problem) NP-complet, qui à son tour peut être réduit au problème de chaîne Hamiltonienne NP-complet. Cette démonstration met en évidence la difficulté de résoudre le VRP, en particulier pour de grandes instances. En pratique, des méthodes (méta)heuristiques et approximatives sont souvent utilisées pour résoudre le VRP, comme nous le verrons plus tard."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "16b3b8a7-4658-4509-a511-7a395654e6f1",
   "metadata": {},
   "source": [
    "## <u> Modélisation mathématique </u>"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "b54bfa8c",
   "metadata": {},
   "source": [
    "#### **Paramètres :**"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "8e80a196",
   "metadata": {},
   "source": [
    "\n",
    "$V=\\{0,1,2,...,n_v\\}$ : l'ensemble des villes, où 0 est la base (ou dépôt), $1,2,...,n_v$ sont les villes de livraison. $n_v+1$ sera le dépôt pour le retour. <br>\n",
    "$K=\\{1,2,...,k\\}$ : tous les camions. <br>\n",
    "$E$ représente les arcs entre deux clients $i,j \\in V$ <br>\n",
    "$G=(V,E)$ : le graphe avec V comme sommets (villes) et E comme arêtes <br>\n",
    "$d_{ij}$​ : distance (ou temps de voyage) de la ville i à la ville $j$ (coût de voyage) <br>\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "1219e4f2",
   "metadata": {},
   "source": [
    "#### **Variables de décisions**"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "a6d398fa",
   "metadata": {},
   "source": [
    "$x_{ijk}$​ : variable binaire qui vaut 1 si le camion $k$ va d'une ville $i$ à une ville $j$, sinon elle vaut 0."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "e635cf14",
   "metadata": {},
   "source": [
    "#### **Fonction objectif**"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "56652859",
   "metadata": {},
   "source": [
    "$$\\min \\sum_{k∈K} \\sum_{⁡i∈V} \\sum_{⁡j∈V} d_{ij} x_{ijk} $$"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "a1465000",
   "metadata": {},
   "source": [
    "#### **Contraintes du VRP**\n",
    "\n",
    "- Chaque ville est visitée qu'une et une seule fois :\n",
    "$$\\sum_{⁡k \\in K} \\sum_{⁡j \\in V} x_{ijk} = 1, \\forall i \\in V, i \\ne 0$$\n",
    "\n",
    "- Si un camion arrive à une ville il doit en partir :\n",
    "$$\\sum_{i \\in V} x_{ijk} = \\sum_{j \\in V} x_{ijk}, \\forall k \\in K, \\forall i \\in V, \\forall j \\in V $$\n",
    "<br> \n",
    "\n",
    "- Contrainte d'élimination des sous-tours (pour s'assurer que chaque camion effectue un tour complet)\n",
    "$$\\sum_{i \\in S, j \\notin S} x_{ijk} \\geq 1, \\forall k \\in K, \\forall \\; sous-ensemble \\; S \\; de \\; V, 0 \\in S, S \\ne V $$"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "4abc2a0f",
   "metadata": {},
   "source": [
    "# Pour le VRP avec les contraintes de TW"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "e3f015b9",
   "metadata": {},
   "source": [
    "## Variable de décision : \n",
    "\n",
    "$[a_i, b_i]$ la fenêtre de temps pour le client $i$ <br>\n",
    "$T_{ik}$ le moment auquel le véhicule $k$ arrive au client $i$\n",
    "\n",
    "\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "2adf2be7",
   "metadata": {},
   "source": [
    "# Contrainte de TW \n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "549b1ea9",
   "metadata": {},
   "source": [
    "$T_{ik}$ est le moment auquel le véhicule $k$ arrive au client $i$. <br>\n",
    "$d_{ij}$ est le temps nécessaire pour se rendre du client $i$ au client $j$. <br>\n",
    "$T_{jk}$ est le moment auquel le véhicule $k$ arrive au client $j$. <br>\n",
    "$M$ est une grande constante  <br>\n",
    "\n",
    "\n",
    "- Les fenêtres de temps doivent être respectées :\n",
    "\n",
    "​$ a_j \\leq T_{jk} \\leq b_j,∀k∈ K ,∀j∈V$ <br>\n",
    "\n",
    "- Les temps d'arrivé aux différentes villes pour chaque camion doivent être cohérent :\n",
    "\n",
    "$ T_{ik} + d_{ij} \\leq T_{jk} + M(1-x_{ijk}), ∀i, j ∈ V, ∀k∈ K $"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "559a2325",
   "metadata": {},
   "source": [
    "Dans notre cas, lorsque $x_{ijk}$ est égal à 1, la partie de droite de l'inégalité devient simplement $T_{jk}$, ce qui rend la contrainte effective.\n",
    "Cependant, lorsque $x_{ijk}$ est égal à 0 (ce qui signifie que le véhicule $k$ ne se rend pas directement du client $i$ au client $j$), la partie de droite de l'inégalité devient $T_{jk} + M$. Ici, \"M\" est choisi assez grand pour que cette contrainte soit toujours satisfaite quelles que soient les valeurs de $T_{ik}$ et $T_{jk}$. En d'autres termes, lorsque $x_{ijk}$ est égal à 0, cette contrainte n'a pas d'impact sur le modèle."
   ]
  }
 ],
 "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.11.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
