260 lines
37 KiB
Plaintext
260 lines
37 KiB
Plaintext
|
|
{
|
|||
|
|
"cells": [
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"## Annexe optionnelle — Dijkstra avec une structure de données en dictionnaire\n",
|
|||
|
|
"\n",
|
|||
|
|
"### 2ème mise en œuvre de l'algorithme de Dijkstra\n",
|
|||
|
|
"VERSION ELEVE\n",
|
|||
|
|
"\n",
|
|||
|
|
"> **Cette annexe est facultative**, pour les étudiantes à l'aise en Python qui veulent aller plus loin après la Séance 7. Elle reprend le même algorithme que la Séance 7, mais avec une structure de données en dictionnaire plutôt qu'en liste — un bon exercice de transfert, mais pas un prérequis pour la suite du cours."
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"Conditions de réalisation :\n",
|
|||
|
|
"- soit en complétant le notebook fourni soit sous la forme d'un fichier exécutable .py."
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"attachments": {
|
|||
|
|
"image.png": {
|
|||
|
|
"image/png": "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
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"# 1- Présentation\n",
|
|||
|
|
" Lors de l'activité précédente vous avez abouti à l'implémentation de l'algorithme de Dijkstra en vous appuyant sur une structure de données sous forme de liste.\n",
|
|||
|
|
"Pour rappel la structure du graphe utilisé:\n",
|
|||
|
|
"\n",
|
|||
|
|
"Cette fois ci je vous demande de construire une solution dans laquelle le graphe serait représenté sous la forme d'un dictionnaire dans lequel les clés serait les sommets."
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"## 2- Représentation du graphe par un dictionnaire\n",
|
|||
|
|
" ### Travail 1 : définir la structure de donnée\n",
|
|||
|
|
"Définir la structure de donnée pour représenter le graphe sous forme d’un dictionnaire. \n",
|
|||
|
|
" L'idée est de créer un dictionnaire dans lequel chaque sommet serait une clé. Et pour chaque clé on aurait à nouveau un dictionnaire contenant les sommets adjacents et la distance depuis le sommet précédent.\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": null,
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"#création du dictionnaire du graphe pondéré pour la recherche du plus court chemin\n",
|
|||
|
|
"graph = {\n",
|
|||
|
|
"'sommet': {'s_voisin1': distance, 's_voisin2': distance},\n",
|
|||
|
|
"}"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"Vous avez la possibilité de revenir vers moi pour valider votre solution."
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"## 3- Implémentation de l'algorithme de Dijkstra\n",
|
|||
|
|
" ### Travail 2 : implémenter votre solution\n",
|
|||
|
|
" Votre solution sera documentée et s'appuiera sur le travail réalisé en classe.\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": null,
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"def initialisation(s_debut):\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" initialisation des variables permettant de parcourir le graphe\n",
|
|||
|
|
" Parameters\n",
|
|||
|
|
" ----------\n",
|
|||
|
|
" depart : string\n",
|
|||
|
|
" sommet de depart pour le parcours du graphe.\n",
|
|||
|
|
" Returns\n",
|
|||
|
|
" -------\n",
|
|||
|
|
" E_calcul : dict\n",
|
|||
|
|
" chemin en cours de calcul: poids et sommet précédent\n",
|
|||
|
|
" E_calcul = {s_debut:[poids,prédécesseur]}\n",
|
|||
|
|
" la distance au sommet de depart est nulle\n",
|
|||
|
|
" E_sommets : dict\n",
|
|||
|
|
" on met dans le dictionnaire provisoire les sommets adjacents \n",
|
|||
|
|
" et leur poids par rapport au point de départ\n",
|
|||
|
|
" E_sommets = {s_voisin1: [poids,depart],...}\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" assert type(s_debut) ... , \" s_debut doit être un caractère \""
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": null,
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"def Maj_poids(s_voisin,s_mini,poids, E_sommets):\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" Mise à jour du poids et du prédécesseur:\n",
|
|||
|
|
" si le sommet est nouveau : mettre à jour poids et prédecesseur\n",
|
|||
|
|
" si le sommet est déjà découvert: mettre à jour uniquement le poids\n",
|
|||
|
|
" \n",
|
|||
|
|
" Parameters\n",
|
|||
|
|
" ----------\n",
|
|||
|
|
" s_voisin : str\n",
|
|||
|
|
" sommet voisin\n",
|
|||
|
|
" s_mini : str\n",
|
|||
|
|
" sommet de poids mini\n",
|
|||
|
|
" poids : int\n",
|
|||
|
|
" poids du chemin le plus court \n",
|
|||
|
|
" E_sommets : dict\n",
|
|||
|
|
" dictionnaire des chemins en cours d'exploration'\n",
|
|||
|
|
"\n",
|
|||
|
|
" Returns\n",
|
|||
|
|
" -------\n",
|
|||
|
|
" E_sommets : dict\n",
|
|||
|
|
" dictionnaire des chemins en cours d'exploration mise à jour\n",
|
|||
|
|
" avec le poids et le sommet de poids mini\n",
|
|||
|
|
"\n",
|
|||
|
|
" \"\"\"\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": null,
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"def Dijkstra(graphe, s_debut):\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" Cette fonction implémente l'algorithme de dijkstra\n",
|
|||
|
|
" Parameters\n",
|
|||
|
|
" ----------\n",
|
|||
|
|
" graphe : dict\n",
|
|||
|
|
" DESCRIPTION. description du graphe\n",
|
|||
|
|
" s_debut : str\n",
|
|||
|
|
" DESCRIPTION. le sommet de départ\n",
|
|||
|
|
"\n",
|
|||
|
|
" Returns\n",
|
|||
|
|
" -------\n",
|
|||
|
|
" calcul: dict\n",
|
|||
|
|
" le résultat de l'algorithme de dijkstra\n",
|
|||
|
|
"\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" assert type(s_debut) == str, \" s_debut doit être un caractère \"\n",
|
|||
|
|
" assert type(graphe) == dict, \"graphe doit être un dictionnaire\"\n",
|
|||
|
|
" \n",
|
|||
|
|
" \n",
|
|||
|
|
" #phase d'initialisation des données\n",
|
|||
|
|
" E_calcul,E_sommets=initialisation(s_debut)\n",
|
|||
|
|
" \n",
|
|||
|
|
" #tant que provisoire non vide\n",
|
|||
|
|
" while E_sommets!= {}: \n",
|
|||
|
|
" #recherche de la distance la plus faible\n",
|
|||
|
|
" s_mini=min(E_sommets, key=E_sommets.get)\n",
|
|||
|
|
" #---------------------Partie à compléter\n",
|
|||
|
|
" \n",
|
|||
|
|
" \n",
|
|||
|
|
" \n",
|
|||
|
|
" #------------------------------------- \n",
|
|||
|
|
" #fin while \n",
|
|||
|
|
" return E_calcul "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"### Travail 3: La vérification de votre implémentation\n",
|
|||
|
|
" "
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": null,
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"def routage(calcul,depart,arrivee): \n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" Cette fonction donne le routage d'un sommet A au sommet B à partir\n",
|
|||
|
|
" du résultat obtenu par l'algorithme de dijkstra\n",
|
|||
|
|
"\n",
|
|||
|
|
" Parameters\n",
|
|||
|
|
" ----------\n",
|
|||
|
|
" calcul : dict\n",
|
|||
|
|
" résultat de l'algo de dijkstra\n",
|
|||
|
|
" depart : str\n",
|
|||
|
|
" sommet de départ\n",
|
|||
|
|
" arrivee : string\n",
|
|||
|
|
" sommet d'arrivée\n",
|
|||
|
|
"\n",
|
|||
|
|
" Returns\n",
|
|||
|
|
" -------\n",
|
|||
|
|
" routage : list\n",
|
|||
|
|
" le routage de A à B\n",
|
|||
|
|
" distance : int\n",
|
|||
|
|
" la distance\n",
|
|||
|
|
"\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" \n",
|
|||
|
|
" routage = [arrivee]\n",
|
|||
|
|
" distance=calcul[arrivee][0]\n",
|
|||
|
|
" #création de la liste de routage\n",
|
|||
|
|
" while routage[0]!= depart: \n",
|
|||
|
|
" for key in calcul:\n",
|
|||
|
|
" if key==routage[0]:\n",
|
|||
|
|
" routage.insert(0,calcul[routage[0]][1]) \n",
|
|||
|
|
" return routage,distance"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": null,
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"resultat = Dijkstra(graph,\"A\")\n",
|
|||
|
|
"routage, distance= routage(resultat,\"A\",\"G\")\n",
|
|||
|
|
"print(\"le plus court chemin est: \", routage)\n",
|
|||
|
|
"print(\"la distance parcourue : \", distance)"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"metadata": {
|
|||
|
|
"kernelspec": {
|
|||
|
|
"display_name": "Python 3",
|
|||
|
|
"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.7.6"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"nbformat": 4,
|
|||
|
|
"nbformat_minor": 4
|
|||
|
|
}
|