# Présentation de la partie 2 de la SAE sur les graphes
# 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.
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 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éé.
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:
%% Cell type:markdown id: tags:
### Présentation du problème et choix d'une manifestation culturelle à étudier
### 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.
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).
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:
%% Cell type:markdown id: tags:
## Installation de graphviz pour pouvoir visualiser les graphes
## Installation de graphviz pour pouvoir visualiser les graphes
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
!pipinstallgraphviz
!pipinstallgraphviz
importgraphviz
importgraphviz
graphviz.__version__,graphviz.version()
graphviz.__version__,graphviz.version()
```
```
%% Output
%% Output
Requirement already satisfied: graphviz in /Users/quiniou-s-1/opt/anaconda3/lib/python3.8/site-packages (0.19.1)
Requirement already satisfied: graphviz in /home/E219111P/.local/lib/python3.9/site-packages (0.20)
('0.19.1', (3, 0, 0))
('0.20', (2, 43, 0))
%% Cell type:markdown id: tags:
%% 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
## 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:
%% Cell type:code id: tags:
``` python
``` python
defcreation_graphe_graphviz(g):
defcreation_graphe_graphviz(g):
# création d'un graphe non orienté
# création d'un graphe non orienté
dot=graphviz.Graph()
dot=graphviz.Graph()
# ajout des sommets
# ajout des sommets
foriinrange(len(g)):
foriinrange(len(g)):
dot.node(str(i))
dot.node(str(i))
# ajout des arcs
# ajout des arcs
foriinrange(len(g)):
foriinrange(len(g)):
forjinrange(i):
forjinrange(i):
ifg[i][j]==1:
ifg[i][j]==1:
dot.edge(str(i),str(j))
dot.edge(str(i),str(j))
returndot
returndot
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
## Fonctions utiles pour manipuler les graphes
## Fonctions utiles pour manipuler les graphes
%% Cell type:markdown id: tags:
%% 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
#### 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:
%% Cell type:code id: tags:
``` python
``` python
defgraphe_vide(n):
defgraphe_vide(n):
g=[]
g=[]
foriinrange(n):
foriinrange(n):
l=[]
l=[]
forjinrange(n):
forjinrange(n):
l.append(0)
l.append(0)
g.append(l)
g.append(l)
returng
returng
```
```
%% Cell type:markdown id: tags:
%% 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
#### 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:
%% Cell type:code id: tags:
``` python
``` python
defest_arete(g,i,j):
defest_arete(g,i,j):
returng[i][j]
returng[i][j]
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
#### Fonction qui calcule les successeurs d'un sommet
#### Fonction qui calcule les successeurs d'un sommet
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
defsuccesseurs(g,i):
defsuccesseurs(g,i):
succs=[]
returng[i]
# à compléter
returnsuccs
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
#### Fonction qui importe un graphe contenu dans un fichier, au format dot
#### Fonction qui importe un graphe contenu dans un fichier, au format dot
/home/E219111P/sae-algo-partitions/Notebooks/SAE-graphes_partie-2_plus-courts-chemins.ipynb Cell 15' in importe_graphe(fich)
<a href='vscode-notebook-cell:/home/E219111P/sae-algo-partitions/Notebooks/SAE-graphes_partie-2_plus-courts-chemins.ipynb#ch0000014?line=3'>4</a> s = graphviz.Source.from_file(fich)
47 r"""Return DOT identifier from string, quote if needed.
48
49 >>> quote('') # doctest: +NO_EXE
(...)
80 "\\\""
81 """
---> 82 if is_html_string(identifier) and not isinstance(identifier, NoHtml):
83 pass
84 elif not is_valid_id(identifier) or identifier.lower() in dot_keywords:
TypeError: expected string or bytes-like object
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
#### Fonction qui exporte un graphe dans un fichier, au format dot
#### Fonction qui exporte un graphe dans un fichier, au format dot
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
defexporte_graphe(fich,graphe,noms_sommets):
defexporte_graphe(fich,graphe,noms_sommets):
# à compléter
# à compléter
returnTrue
returnTrue
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
## Calcul de plus courts chemins avec l'algorithme de Dijkstra
## Calcul de plus courts chemins avec l'algorithme de Dijkstra
%% Cell type:markdown id: tags:
%% 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
#### 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:
%% Cell type:code id: tags:
``` python
``` python
defalgo_dijkstra(s,graphe):
defalgo_dijkstra(s,graphe):
pred=[sforiinrange(len(graphe))]
# à compléter
distance=[float('inf')for_ingraphe]
distance[s]=0
returndistances,predecesseurs
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:
%% Cell type:code id: tags:
``` python
``` python
# test de la fonction algo_dikstra avec un ou deux petits graphes
g1=[
[0,2,1,3,0],
# à compléter
[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:
%% Cell type:markdown id: tags:
## Création de graphes de distances entre points
## Création de graphes de distances entre points
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
#### Installation de geopy pour calculer des distances à partir de coordonnées gps
#### Installation de geopy pour calculer des distances à partir de coordonnées gps
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
!pipinstallgeopy
!pipinstallgeopy
#import geopy
#import geopy
fromgeopy.distanceimportgeodesicasgd
fromgeopy.distanceimportgeodesicasgd
```
```
%% Output
%% Output
Requirement already satisfied: geopy in /Users/quiniou-s-1/opt/anaconda3/lib/python3.8/site-packages (2.2.0)
Requirement already satisfied: geopy in /Users/quiniou-s-1/opt/anaconda3/lib/python3.8/site-packages (2.2.0)
Requirement already satisfied: geographiclib<2,>=1.49 in /Users/quiniou-s-1/opt/anaconda3/lib/python3.8/site-packages (from geopy) (1.52)
Requirement already satisfied: geographiclib<2,>=1.49 in /Users/quiniou-s-1/opt/anaconda3/lib/python3.8/site-packages (from geopy) (1.52)
%% Cell type:markdown id: tags:
%% 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
#### 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