# Présentation de la partie 2 de la SAE sur les graphes
Dans cette seconde partie de SAE sur les graphes, l'objectif est de pouvoir faire de la recherche de plus courts chemins, en utilisant l'algorithme de Dijkstra.
La recherche de plus courts chemins sera ensuite utilisée pour trouver les hôtels, restaurants et aire de covoiturage les plus proches d'une manifestation culturelle choisie.
La représentation choisie pour les graphes est une matrice d'adjacence, qui sera représentée par un tableau de tableau (les noms des sommets sont des entiers et seront numérotés en commençant à 0). Nous considérons que le nombre de sommets du graphe ne pourra pas être modifié une fois le graphe construit. Un tableau contenant le nom associé à chaque sommet sera également créé.
%% Cell type:markdown id: tags:
### Présentation du problème et choix d'une manifestation culturelle à étudier
L'office de tourisme de votre département propose une liste de restaurants et d'hôtels les plus proches d'une manifestation culturelle ainsi que l'aire de covoiturage la plus proche de celle-ci. Vous aurez à implémenter les fonctions permettant de créer cette liste.
Chaque binôme doit choisir la manifestation culturelle qu'il souhaite considérer et l'indiquer dans l'onglet correspondant du document partagé suivant : https://uncloud.univ-nantes.fr/index.php/s/BXwyNfYHbfKYbB8 (chaque binôme doit choisir parmi les manifestations culturelles du département assigné à son groupe).
%% Cell type:markdown id: tags:
## Installation de graphviz pour pouvoir visualiser les graphes
%% Cell type:code id: tags:
``` python
!pipinstallgraphviz
importgraphviz
graphviz.__version__,graphviz.version()
importpandasaspd
importmath
```
%% Output
Defaulting to user installation because normal site-packages is not writeable
[2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m47.0/47.0 kB[0m [31m127.4 kB/s[0m eta [36m0:00:00[0m [36m0:00:01[0m
[?25hInstalling collected packages: graphviz
Successfully installed graphviz-0.20
%% Cell type:markdown id: tags:
## Création d'une fonction de conversion d'un graphe, défini par une matrice d'adjacence, vers le format graphviz
%% Cell type:code id: tags:
``` python
defcreation_graphe_graphviz(g):
# création d'un graphe non orienté
dot=graphviz.Graph()
# ajout des sommets
foriinrange(len(g)):
dot.node(str(i))
# ajout des arcs
foriinrange(len(g)):
forjinrange(i):
ifg[i][j]==1:
dot.edge(str(i),str(j))
returndot
```
%% Cell type:markdown id: tags:
## Fonctions utiles pour manipuler les graphes
%% Cell type:markdown id: tags:
#### Fonction qui construit un graphe vide (sans aretes), avec le nombre de sommets donné, et qui retourne la matrice d'adjacence correspondante
%% Cell type:code id: tags:
``` python
defgraphe_vide(n):
g=[]
foriinrange(n):
l=[]
forjinrange(n):
l.append(0)
g.append(l)
returng
```
%% Cell type:markdown id: tags:
#### Fonction qui retourne vrai si l'arete, dont les numéros de sommets extrémités sont donnés, existe
%% Cell type:code id: tags:
``` python
defest_arete(g,i,j):
returng[i][j]
```
%% Cell type:markdown id: tags:
#### Fonction qui calcule les successeurs d'un sommet
%% Cell type:code id: tags:
``` python
defsuccesseurs(g,i):
returng[i]
```
%% Cell type:markdown id: tags:
#### Fonction qui importe un graphe contenu dans un fichier, au format dot
%% Cell type:code id: tags:
``` python
defimporte_graphe(fich):
# à compléter
s=graphviz.Source.from_file(fich)
s.view()
```
%% Cell type:markdown id: tags:
#### Fonction qui exporte un graphe dans un fichier, au format dot
%% Cell type:code id: tags:
``` python
defexporte_graphe(fich,graphe,noms_sommets):
# à compléter
returnTrue
```
%% Cell type:markdown id: tags:
## Calcul de plus courts chemins avec l'algorithme de Dijkstra
%% Cell type:markdown id: tags:
#### Fonction qui implémente l'algorithme de Dijkstra pour le calcul de plus courts chemins, à partir d'un sommet de départ s, et qui retourne le tableau des distances du sommet s aux autres sommets ainsi que le tableau des sommets prédécesseurs sur les plus courts chemins
%% Cell type:code id: tags:
``` python
defalgo_dijkstra(s,graphe):
pred=[sforiinrange(len(graphe))]
distance=[float('inf')for_ingraphe]
distance[s]=0
non_visites=[iforiinrange(len(graphe))]
whilenon_visites:
liste=[distance[i]foriinrange(len(non_visites))]
index=liste.index(min(liste))
point=non_visites.pop(index)
fori,vinenumerate(graphe[point]):
ifv<=0orv==float('inf')orinotinnon_visites:
continue
ifdistance[point]+v<distance[i]:
distance[i]=distance[point]+v
pred[i]=point
returndistance,pred
```
%% Cell type:code id: tags:
``` python
g1=[
[0,2,1,3,0],
[2,0,6,4,7],
[1,6,0,3,3],
[3,4,3,0,9],
[0,7,3,9,0]
]
algo_dijkstra(2,g1)
```
%% Output
([1, 3, 0, 3, 3], [2, 0, 2, 2, 2])
%% Cell type:markdown id: tags:
## Création de graphes de distances entre points
%% Cell type:markdown id: tags:
#### Installation de geopy pour calculer des distances à partir de coordonnées gps
%% Cell type:code id: tags:
``` python
!pipinstallgeopy
#import geopy
fromgeopy.distanceimport*
```
%% Output
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: geopy in /Users/lwi/Library/Python/3.10/lib/python/site-packages (2.2.0)
Requirement already satisfied: geographiclib<2,>=1.49 in /Users/lwi/Library/Python/3.10/lib/python/site-packages (from geopy) (1.52)
%% Cell type:code id: tags:
``` python
FETE_DU_PAIN=('FÊTE DU PAIN 2022',48.183,-0.894)
```
%% Cell type:markdown id: tags:
#### Fonction qui crée un graphe de distance entre un sommet de départ, dont le nom et les coordonnées gps sont données (latitude et longitude), et des sommets contenus dans un fichier csv, pour un département choisi