Vous avez décidé d'essayer de créer un réseau social Types_au_top. Pour cela, vous avez réuni vos bons amis proches et vous leur avez demandé à chacun d'en parler à leurs propres amis proches. Pour simplifier, on note A, B, ..., G et H les 8 personnes acceptant de faire partie de votre réseau social Types_au_top. Voici la liste des relation entre ces individus :
A est ami avec tout le monde sauf D et G,
B est ami avec A, D et H,
C est ami avec A, F, G et H,
D est ami avec B et H,
E est ami avec A et H,
F est ami avec A et C,
G est ami avec C et H,
H est ami avec A, B, C, D, E et G.
Malgré la faible taille de votre réseau social actuel, vous vous rendez-compte que sa description deviendra vite très obscure s'il grandi fortement, comme vous l'espérez.
Un des amis de votre réseau vous propose de visualiser votre réseau social ainsi :
Chaque membre du réseau sera modélisé par un point nommé par une lettre,
chaque relation entre deux amis sera modélisé par un trait reliant les points représentant les amis.
Afin d'illustrer sa proposition, votre ami vous propose le schéma suivant :
Ce type de représentation s'appelle un graphe (non-orienté). Ce qui est bien c'est que ce cours va détailler cette notion et que l'on verra, aussi dans un autre chapitre, des algorithmes pour les étudier. Quelle chance pour votre réseau social ! Vive la NSI !
Pour les curieux, voici le problème historique qui a conduit au développement initial des graphes.
La ville de Königsberg était une ville de Prusse puis une des principales villes de l'Empire Allemand avant d'être céder à l'URSS en 1945. Cette ville est désormais appelée Kaliningrad et fait partie de la Fédération de Russie.
Cette ville s'étendait au $XVIII^e$ siècle autour de deux îles situées sur le fleuve Pregel. Ces deux îles étaient reliées entre elles par un pont. Six autres ponts reliaient les rives de la rivière à l'une ou l'autre des deux îles, comme représenté sur le plan ci-dessous.
La légende raconte que certains habitants de cette ville cherchaient lors de promenade à passer une fois et une seule par chacun des ponts pour revenir au point de départ (évidemment, ils ne pouvaient traverser l'eau du Pregel qu'en passant par un des ponts.)
Est-ce possible ? Si oui, par quel chemin ?
Les habitants ont cherché des solutions et l'un d'eux, le grand mathématicien Euler, a réussi en 1735 à répondre à la question précédente. Pour cela, il a développé des outils mathématiques à la base de la théorie des graphes, théorie qui sera effleurée dans ce cours.
Modélisation à l'aide d'un graphe :
Une des idées d'Euler fut de modéliser la situation pour réduire à l'essentiel le problème ; il a représentée la configuration précédente des ponts dans la ville en la figure ci-dessous :
figure qui peut être déformée ainsi :
Un graphe non-orienté est un ensemble formé de points, appelés sommets, reliés par des lignes, appelées arêtes.
Deux sommets reliés par une arête sont dits adjacents.
Un graphe est dit complet lorsque tous ses sommets sont adjacents.
Voici ci-dessous un graphe non-orienté qui remprésente une modélisation possible du problème des ponts de Königsberg expliqué dans la remarque historique.
Donner deux sommets adjacents du graphe ci-dessus.
Donner deux sommets non adjacents du graphe ci-dessus.
Le graphe ci-dessus est-il un graphe complet ? Pourquoi ?
Comment rendre le graphe ci-dessous complet ?
Un des amis de votre réseau travaille pour un distributeur d'électricité.
Il doit proposer à son supérieur une représentation du réseau reliant différentes villes.
Comme il n'y arrive pas trop, il voudrait que vous la lui fassiez.
Pour simplifier le problème, il a déjà renommé les villes en A, B, C, D, E et F. De plus, il vous donne les informations suivantes :
la ville A est reliée par un réseau électrique aux villes B, E et F,
la ville B est reliée par un réseau électrique aux villes A, C et D,
la ville C est reliée par un réseau électrique aux villes B, D, E et F,
la ville D est reliée par un réseau électrique aux villes B, C et F,
la ville E est reliée par un réseau électrique aux villes A, C et F,
la ville F est relié par un réseau électrique aux villes A, C, D et E.
Proposer un graphe qui modélise la situation.
Ce graphe est-il complet ? Pourquoi ?
L'ordre d'un graphe est le nombre de sommets de ce graphe.
Le degré d'un sommet est le nombre d'arêtes dont ce sommet est une extrémité.
Quel est l'ordre de ce graphe ?
Quel est le degré du sommet $A$ ?
Lister les sommets de degré 3 de ce graphe.
Il est possible de considérer un graphe comme une liste de sommets, liste où on associe à chaque élément la liste des sommets liés à cet élément.
Reprenons l'exemple introductif. L'ensemble des relations :
A est ami avec tout le monde sauf G,
B est ami avec A, D et H,
C est ami avec A, F, G et H,
D est ami avec B et H,
E est ami avec A et H,
F est ami avec A et C,
G est ami avec C et H,
H est ami avec A, B, C, D, E et G.
peut être vu comme une liste d'adjacence :
En s'inspirant des listes d'adjacence d'un graphe vues ci-dessus, une façon d’encoder un graphe sous Python est d’utiliser un dictionnaire : les clés seront les sommets du graphe et leur valeur sera la liste des sommets adjacents.
Reprenons le graphe introductif :
Le code suivant permet d'implémenter un graphe en langage Python
graphe = dict() # création d'un dictionnaire vide
graphe["A"] = ["B","C","E","F","H"] # liens de A vers les sommets listés
graphe["B"] = ["A","D","H"]
graphe["C"] = ["A","F", "G","H"]
graphe["D"] = ["B","H"]
graphe["E"] = ["A","H"]
graphe["F"] = ["A","C"]
graphe["G"] = ["C","H"]
graphe["H"] = ["A","B","C","D","E","G"]
Rappels :
Vous avez vu l'an dernier dans le cours sur les dictionnaires, qu'il est possible :
d'obtenir l'ensemble des clés avec la méthode keys()
en sachant que graphe.keys()
est un itérable,
d'obtenir l'ensemble des clés avec la méthode values()
en sachant que graphe.values()
est un itérable.
En s'aidant de la remarque précédente, proposer une fonction ordre
en langage Python qui reçoit en paramètre un dictionnaire et renvoie l'ordre de ce graphe.
Tester votre fonction ordre
en utilisant le graphe de l'exemple introductif, implémenté en langage Python ci-dessus.
Écrire une fonction sommets_adjacents
qui prend en paramètre un dictionnaire ainsi qu'un sommet sous forme de chaîne de caractères et qui renvoie la liste des sommets adjacents à ce sommet entré comme paramètre.
Tester la fonction sommets_adjacents
sur le sommet $A$.
Proposer des préconditions.
Proposer une fonction lister_aretes
qui prend en paramètre un dictionnaire et renvoie la liste des arêtes d'un graphe. Une arête sera représentée par un tuple à deux éléments. ( Attention aux doublons)
Dans un graphe non-orienté, on appelle chaîne une suite d'arêtes consécutives reliant deux sommets (éventuellement confondus).
La longueur d'une chaîne est le nombre d'arêtes qui composent la chaîne.
Une chaîne fermée est une chaîne dont l'origine de la première arête et l'extrémité de la dernière arête sont confondues.
Un cycle est une chaîne fermée dont les arêtes sont distinctes.
Un graphe est dit connexe si deux sommets distincts quelconque peuvent être reliés par une chaîne.
On considère le graphe non-orienté suivant :
Quel est l'ordre du graphe ?
Quel nom peut porter la chaîne $B - C - E - B$ ? Quelle est sa longueur ?
Déterminer une chaîne de longueur 8 reliant $E$ à $A$
Déterminer un cycle d'origine $G$.
Le graphe est-il connexe ?
Proposer un graphe qui n'est pas connexe.
Voici une carte où sont positionnées 6 lieux notés A, B, C, D, E et F dans le centre ville de Vitry-le-François.
On cherche à modéliser les trajets possibles simples permettant de relier directement en voiture ces positions : pour cela on utilise encore un graphe.
Cependant, comme il y a des sens unique, certains trajets ne peuvent se faire que dans un sens. On va donc utiliser des flèches pour modéliser un trajet possible entre deux points. On obtient ainsi le graphe suivant :
Ce type de graphe est appelé un graphe orienté.
Un graphe orienté est un graphe dont les arêtes sont orientées : chaque arête ne peut être parcourue que dans le sens de la flèche.
Ces arêtes orientées sont aussi appelés arc.
Dans un graphe orienté, on appelle chemin de longueur $n$ une succession de $n$ arcs tels que l'extrémité de chacun est l'origine du suivant (sauf pour le dernier arc).
On dit que le chemin est fermé lorsque l'origne du premier arc coïncide avec l'extrémité du dernier.
Un chemin fermé composé d'arcs tous distincts est appelé circuit.
Proxémie des termes suivant l'orientation ou non du graphe :
Graphe non-orienté | Graphe orienté |
---|---|
arête | arc |
chaîne | chemin |
cycle | circuit |
Voici de nouveau le graphe d'introduction :
On peut se rendre du sommet $C$ vers le sommet $E$ mais pas du sommet $E$ vers le sommet $C$ : c'est donc un graphe orienté.
On peut se rendre du sommet $B$ vers le sommet $A$ et du sommet $A$ vers le sommet $B$ : deux arcs sont nécessaires.
À partir du sommet $C$, on peut se rendre au sommet $C$ grâce à un circuit : $ C - B - D - C$.
Le chemin $ A - B - C - E - D - B$ est un chemin de longueur 5.
Le chemin $A - B - D - E - F - A$ est un circuit de ce graphe.
Le graphe suivant représente le plan d’une ville. Les arcs du graphe représentent ses avenues commerçantes, en prenant en compte le sens de circulation, et les sommets du graphe les carrefours de ces avenues.
Est-ce un graphe orienté ou non-orienté ? Pourquoi ?
Quel est l'ordre du graphe ?
Proposer un chemin de longueur 4 d'origine $F$ et d'extrémité $B$.
Proposer un circuit passant par tous les sommets.
networkx
Le but de cette partie est d'étudier le graphe orienté précédent sur Python.
Nous utiliserons la bibliothèque networkx
.
Vous pourrez retrouver l'exercice ci-dessous sous forme de TP jupyter-notebook ici.
Pour implémenter le graphe de l'exercice précédent, il vous suffit de saisir progressivement les instructions suivantes :
Commencer par importer le module networkx
, sous l'alias nx
ici.
Créer un graphe orienté vide avec le script nx.DiGraph()
:
Ajouter au graphe chaque sommet (appelé node
) avec la méthode add_node
:
Ajouter au graphe chaque arc (appelé edge
) avec la méthode add_edges_from
:
Pour ajouter à un graphe non-orienté des arêtes, il suffit d'utiliser la méthode add.edges
au lieu de add.edges_from
.
Pour visualiser le graphe utiliser ce script:
nx.draw(graphe, node_size=800,node_color='blue', edge_color='red',with_labels=True)
plt.show() # pour visualiser le graphique créé
Vous devez voir apparaître une fenêtre contenant une figure proche de celle-ci :
Les flèches correspondent aux traits plus épais de la liaison entre dans deux sommets.
Il est possible d'intégrer séparément toutes les options du tracé du graphique ainsi :
# ensemble des options
options = {
'node_size' : 800, # taille des sommets
'node_color' : 'blue', # couleur de fond des sommets
'edge_color' : 'red', # couleur des arcs
'with_labels' : 'True', # avec le nom des sommets
}
nx.draw(graphe, **options)
plt.show() # pour visualiser le graphique créé
Cela permet entre autre de définir une fois pour toutes les caractéristiques des tracés pour les utiliser pour chacun des graphes : cohérence dans la présentation générale.
Pour des compléments et des précisions sur l'utilisation du module networkx
, vous pouvez consulter :
ou ce tutoriel officiel en anglais.
La bibliothèque networkx
contient aussi différentes méthodes portant sur les graphes, sommets et arcs :
Une documentation complète est disponible à cette adresse.
Utiliser les méthodes et fonctions de la bibliothqèe networkx
pour :
obtenir le degré du sommet 'A'
du graphe de l'exercice précédent.
obtenir le nombre de sommets de ce graphe.
obtenir le nombre d'arcs de ce graphe.
obtenir la liste des sommets voisins au sommet 'D'
de ce graphe.
Tester aussi la méthode successors
avec :
graphe.successors('E')
Tester aussi la méthode predecessors
avec :
graphe.predecessors('E')
On a déjà vu qu'il est possible d'implémenter un graphe à l'aide d'une liste de listes d'adjacence. Une seconde implémentation est possible : avec une matrice d'adjacence. Voici un exemple introductif.
Un journaliste britannique d’une revue consacrée à l’automobile doit tester les autoroutes françaises. Pour remplir sa mission, il décide de louer une voiture et de circuler entre six grandes villes françaises : Bordeaux ($B$),Lyon ($L$), Marseille ($M$), Nantes ($N$), Paris ($P$) et Toulouse($T$). Le réseau autoroutier reliant ces six villes est modélisé par le graphe ci-dessous sur lequel les sommets représentent les villes et les arêtes les liaisons autoroutières entre ces villes.
Plutôt que de représenter la situation par un graphe, le journaliste visualise le réseau avec un tableau dans lequel il met 1 s'il existe une liaison directe entre les deux villes correspondant à la case et 0 sinon. Il obtient donc le tableau ci-dessous :
Villes | $B$ | $L$ | $M$ | $N$ | $P$ | $T$ |
---|---|---|---|---|---|---|
$B$ | 0 | 1 | 0 | 1 | 1 | 1 |
$L$ | 1 | 0 | 1 | 1 | 1 | 1 |
$M$ | 0 | 1 | 0 | 0 | 0 | 1 |
$N$ | 1 | 1 | 0 | 0 | 1 | 0 |
$P$ | 1 | 1 | 0 | 1 | 0 | 1 |
$T$ | 1 | 1 | 1 | 0 | 1 | 0 |
Par exemple, il existe une autoroute reliant directement Paris $P$ à Nantes $N$, donc il y a le nombre 1 dans les cases repérées par $N$ et $P$ ; il n'existe pas d'autoroute reliant directement Marseille $M$ à Bordeaux $B$, donc il y a le nombre 0 dans les cases repérées par $M$ et $B$.
Pour synthétiser l'information (en mémorisant le fait que les villes sont rangées dans l'ordre alphabétique), il suffit de considérer le tableau extrait contenant les données chiffrées. On peut appeler ce tableau matrice. Voici la matrice représentant la situation :
$$G = \begin{pmatrix} 0 &1 &0 &1 &1 &1 \\ 1 &0 &1 &1 &1 &1\\ 0 &1 &0 &0 &0 &1\\ 1 &1 &0 &0 &1 &0 \\ 1 &1 &0 &1 &0 &1\\ 1 &1 &1 &0 &1 &0 \end{pmatrix} $$La matrice associée à un graphe d'ordre $n$ est la matrice carrée de taille $n$, où le terme de la $i$-ème ligne et de la $j$-ème colonne est égal au nombre d'arêtes (ou d'arc) partant du sommet $i$ pour arriver au sommet $j$.
Cette matrice s'appelle la matrice d'adjacence de ce graphe.
Un graphe orienté a aussi une matrice d'adjacence.
Le graphe ci-dessous représente, dans un aéroport donné, toutes les voies empruntées par les avions au roulage. Ces voies, sur lesquelles circulent les avions avant ou après atterrissage, sont appelées taxiways. Les sommets du graphe sont les intersections. Les arcs du graphe représentent les voies de circulation (les « taxiways ») en prenant en compte le sens de circulation pour les avions dans les différentes voies ainsi que le temps de parcours pour chacune en minute(s).
Ici, on ne prend pas en compte ici les distances, mais seulement l'existence ou non d'un arc partant d'un sommet et aboutissant à un autre.
Dans la matrice d'adjacence pour un graphe orienté :
Chaque ligne correspond à un sommet de départ,
chaque colonne correspond à un sommet d'arrivée,
un 1 au niveau du terme de la ligne i et de la colonne j signfie l'existence d'un arc qui part du sommet correspondant à la ligne i et qui pointe vers le sommet correspondant à la colonne j,
un 0 au niveau du terme de la ligne i et de la colonne j signfie l'absence d'un arc qui part du sommet correspondant à la ligne i et qui pointe vers le sommet correspondant à la colonne j.
Pour simplifier, les sommets sont rangés par ordre croissant, on a donc :
Ainsi, on a par exemple :
Il y une liaison directe de $A$ vers $B$, donc le deuxième coefficient ($2^{ème}$ car l'arrivée $B$ est le deuxième sommet) de la première ligne (celle du départ $A$) vaut 1.
Il n'y a pas de liaison directe de $C$ vers $A$, donc le premier coefficient (colonne correspond à l'arrivée $A$) de la troisième ligne (celle du départ $C$) est 0.
Ainsi, la matrice $M$ d'ajacence du graphe de cet exemple est
$$M = \begin{pmatrix} 0 & 1 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 1 & 0 & 0 \\ 0 & 1 & 0 & 1 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ \end{pmatrix}$$Le graphe suivant représente le plan d’une ville. Les arcs du graphe représentent ses avenues commerçantes, en prenant en compte le sens de circulation, et les sommets du graphe les carrefours de ces avenues.
Écrire la matrice $M$ associée à ce graphe. (On rangera les sommets dans l’ordre alphabétique).
Cette matrice est-elle symétrique (par rapport à la diagonale descendante) ? Pourquoi ceci était-il prévisible ?
D'un graphe vers matrice en langage Python.
On reprend l'exercice précédent :
Le graphe suivant représente le plan d’une ville. Les arcs du graphe représentent ses avenues commerçantes, en prenant en compte le sens de circulation, et les sommets du graphe les carrefours de ces avenues.
En vous aidant du travail déjà effectué lors de l' exercice 10, implémenter en Python le graphe orienté ci-dessus.
Voici un programme à rajouter à la suite du programme précédent ; l'objectif est que la matrice M
corresponde à la fin à la matrice d'adjacence du graphe :
liste = ['A','B','C','D','E','F']
n = len(liste)
M = [[0]*n for i in range(n)]
for i in range(n):
for j in range(n):
......................
M[i][j] = 1
Que permet le ligne M = [[0]*n for i in range(n)]
?
compléter le programme en remplaçant la ligne ............... par un script qui permet d'avoir la matrice d'adjacence stockée dans M
.
Le module networkx
contient aussi une fonction permettant d'obtenir la matrice d'adjacence : adjacency_matrix
.
Cependant, Le type de données de cette matrice obtenue avec M = adjacency_matrix(graphe)
peut être vu comme une sorte de dictionnaire de dictionnaires, où la clé est un couple de nombres, nombres correspondant
à des deux sommets définissant un arc et où la valeur correspond au nombre d'arcs reliant ces deux sommets.
Or, les nombres des couples des clés ne correspondent pas forcément aux mêmes sommets lors de deux exécutions identiques.
Ainsi, nous n'utiliserons pas cette méthode ensemble.
Dans cet exercice, vous allez construire un graphe à partir d'une matrice d'adjacence.
Une matrice, étant une sorte de tableau à deux dimensions, peut être implémentée en langage Python sous la forme d'une liste de listes.
On considère la matrice d'adjacence suivante :
$$\begin{pmatrix} 0 & 1 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 & 0 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & 1 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 0 & 1 & 1 & 0 & 0 \\ 1 & 0 & 1 & 0 & 0 & 0 & 1 & 0 \\ \end{pmatrix}$$Implémenter cette matrice en exécutant le code suivant
import networkx as nx #import de cette bibliothèque gérant les graphes
# importer aussi la bibliothèque suivante afin de représentaer graphiquement le graphe :
import matplotlib.pyplot as plt
# matrice d'adjacence :
M = [[0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 0, 0, 0],
[0, 1, 0, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 1, 1],
[0, 1, 0, 0, 1, 1, 0, 0],
[1, 0, 1, 0, 0, 0, 1, 0]]
Cette matrice représente les liens d'amitié dans un réseau social de 8 personnes : Ada, Bryan, Carla, Duc, Elie, Felix, Grace, Hector. (l'ordre alphabétique permet de retrouver l'ordre d'apparition dans la matrice d'ajacence.)
Explications :
Le fait que M[0][1]=1
signifie Qu'Ada considère Bryan comme un ami ; le fait que M[2][0]=0
signifie Que Carla ne considère pas Ada comme un amie .
Proposer une fonction creer_graphe
qui prend en paramètre une matrice d'ajacence et une liste de noms et qui renvoie le graphe associé à cette matrice.
Tester la fonction avec la matrice précédente.
Représenter graphiquement le graphe du réseau social des 8 personnes mentionnées ci-dessous dont est donnée la matrice d'adjacence.
N'hésitez pas à reprendre une partie des codes déjà utilisés afin de gérer le tracé.
Vous devez obtenir un graphique proche de celui-ci :
Dans de nombreux problème concret, il peut être utile de rajouter une information chiffrée au niveau des arcs ou des arêtes d'un graphe.
Reprenons l'exemple historique des ponts de Königsberg.
Nous avons vu dans l'exemple introductif historique que le problème concret peut être modélisé par le graphe suivant :
On peut modifier ce graphe en ne prenant en compte que le nombre de trajets simples permet de relier deux lieux, on a alors :
À ce graphe pondéré, on peut associer la matrice suivante :
$$\begin{pmatrix} 0 & 2 & 2 & 1 \\ 2 & 0 & 0 & 1 \\ 2 & 0 & 0 & 1 \\ 1 & 1 & 1 & 0 \\ \end{pmatrix}$$On peut modifier le graphe en prenant en compte la distance la plus courte pour relier deux lieux correspondant à des sommets adjacents (le 0 signifiant ici que l'arête n'existe pas). On a alors :
À ce graphe pondéré, on peut associer la matrice suivante :
$$\begin{pmatrix} 0 & 2 & 1 & 1.5 \\ 2 & 0 & 0 & 3 \\ 2 & 0 & 0 & 2 \\ 1.5 & 3 & 2 & 0 \\ \end{pmatrix}$$On peut modifier le graphe en prenant en compte le temps minimum , en minutes, pour relier deux lieux correspondant à des sommets adjacents (le 0 signifiant ici que l'arête n'existe pas). On a alors :
À ce dernier graphe pondéré, on peut associer la matrice suivante :
$$\begin{pmatrix} 0 & 14 & 10 & 17 \\ 14 & 0 & 0 & 25 \\ 10 & 0 & 0 & 21 \\ 17 & 25 & 21 & 0 \\ \end{pmatrix}$$Dans le chapitre sur les algorithmes sur les graphes, l'absence d'un arc entre deux sommets conduira à mettre comme coefficient $\infty$ plutôt que 0.
On appelle graphe pondéré
tout graphe dans lequel chaque arête d'un (ou arc) est affectée nombre réel positif appelé poids de cet arête (ou de cet arc).Le graphe ci-dessous représente, dans un aéroport donné, toutes les voies empruntées par les avions au roulage. Ces voies, sur lesquelles circulent les avions avant ou après atterrissage, sont appelées taxiways. Les sommets du graphe sont les intersections. Les arcs du graphe représentent les voies de circulation (les « taxiways ») en prenant en compte le sens de circulation pour les avions dans les différentes voies ainsi que le temps de parcours pour chacune en minute(s).
En rangeant les sommets par ordre alphabétique, déterminer la matrice associée à ce graphe orienté pondéré.
Implémenter cette matrice en Python en tant que tableau de tableaux.
On considère un réseau électrique reliant 5 villes appelées "Lorin", "Magis", "Nolin", "Outa" et "Permi".
Les distances du réseau électrique reliant ces villes est donné par la matrice d'adjance suivante :
$$\begin{pmatrix} 0 & 30& 0 & 35 & 0 \\ 30 & 0 & 97 & 0 & 45 \\ 0 & 97 & 0 & 51 & 59 \\ 35 & 0 & 51 & 0 & 40 \\ 0 & 45 & 59 & 40 & 0 \\ \end{pmatrix}$$L'objectif est de pouvoir implémenter le graphe pondéré associé à ce type de matrice d'adjacence où les termes sont les poids.
Proposer une fonction matrice_vers_liste
qui :
prend comme premier paramètre matrice
une matrice d'adjacence de type d'un tableau de tableaux, matrice qui contient les poids du graphe pondéré,
prend comme second paramètre noms
une liste de chaînes de caractères qui correspond aux noms des sommets, sommets appraissant dans l'ordre de la matrice,
renvoie un dictionnaire dont les clés sont les sommets et les valeurs sont une liste de tuples au format ("nom_sommet",poids)
Utiliser cette fonction matrice_vers_liste
pour créer le graphe pondéré associé à la matrice d'adjacence donnée au début de l'exercice.
Obtenir une représentation graphique de ce graphe.
idée venant de Nathalie Daval : accès au document ayant donné l'idée.
Profitant de vacances, vous partez à la Réunion pour oublier l'informatique.
Mais à peine arrivé.e.s à l'aéroport de Saint-Denis de la Réunion, vous voilà coincé.e.s dans un bouchon.
Par chance, le conducteur vous donne des informations sur le temps pour parcourir le trajets entre différents lieux de la ville.
Grâce aux compétences acquises en NSI, vous avez traduit les informations données par le conducteur par ce graphe pondéré :
Dans ce plan, pour simplifier les notations suivantes ont été prises : M correspondant à La Montagne, H pour Hôpital, C pour Cimetière, U pour Université, A pour Aéroport et R pour Rivière des pluies.
Implémenter le graphe pondéré sous forme d'un dictionnaire où les clés sont les sommets et les valeurs sont une liste de tuples au format ("sommets",temps)
Proposer une fonction dict_vers_matrice
qui :
prend comme paramètre graphe
un dictionnaire où les clés sont les sommets et les valeurs sont une liste de tuples au format ("sommets",temps),
renvoie un tuple constitué de la matrice d'adjacence associée au graphe pondéré et de la liste des sommets du graphe.
Pour revoir une explication complète sur les graphes et le vocabulaire, vous vouvez visionner la vidéo accessible ici.