Nantes Université

Skip to content
Extraits de code Groupes Projets
Valider 9fd583bd rédigé par Louis BRUNETEAU's avatar Louis BRUNETEAU
Parcourir les fichiers

La machine à café fait du café donc c'est bien.

parent ba31a9df
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
# 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
!pip install graphviz !pip install graphviz
import graphviz import graphviz
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
def creation_graphe_graphviz(g): def creation_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
for i in range(len(g)): for i in range(len(g)):
dot.node(str(i)) dot.node(str(i))
# ajout des arcs # ajout des arcs
for i in range(len(g)): for i in range(len(g)):
for j in range(i): for j in range(i):
if g[i][j] == 1: if g[i][j] == 1:
dot.edge(str(i), str(j)) dot.edge(str(i), str(j))
return dot return dot
``` ```
%% 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
def graphe_vide(n): def graphe_vide(n):
g = [] g = []
for i in range(n): for i in range(n):
l = [] l = []
for j in range(n): for j in range(n):
l.append(0) l.append(0)
g.append(l) g.append(l)
return g return g
``` ```
%% 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
def est_arete(g, i, j): def est_arete(g, i, j):
return g[i][j] return g[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
def successeurs(g, i): def successeurs(g, i):
succs = [] return g[i]
# à compléter
return succs
``` ```
%% 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
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
def importe_graphe(fich): def importe_graphe(fich):
# à compléter # à compléter
s = graphviz.Source.from_file(fich)
return graphe, noms_sommets s.view()
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# test de la fonction importe_graphe importe_graphe('a.dot')
``` ```
%% Output
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/E219111P/sae-algo-partitions/Notebooks/SAE-graphes_partie-2_plus-courts-chemins.ipynb Cell 16' in <cell line: 1>()
----> <a href='vscode-notebook-cell:/home/E219111P/sae-algo-partitions/Notebooks/SAE-graphes_partie-2_plus-courts-chemins.ipynb#ch0000015?line=0'>1</a> importe_graphe('a.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)
<a href='vscode-notebook-cell:/home/E219111P/sae-algo-partitions/Notebooks/SAE-graphes_partie-2_plus-courts-chemins.ipynb#ch0000014?line=4'>5</a> s.view()
----> <a href='vscode-notebook-cell:/home/E219111P/sae-algo-partitions/Notebooks/SAE-graphes_partie-2_plus-courts-chemins.ipynb#ch0000014?line=5'>6</a> print(graphviz.Graph(s))
File ~/.local/lib/python3.9/site-packages/graphviz/base.py:32, in Base.__str__(self)
30 def __str__(self) -> str:
31 """The DOT source code as string."""
---> 32 return self.source
File ~/.local/lib/python3.9/site-packages/graphviz/graphs.py:79, in BaseGraph.source(self)
76 @property
77 def source(self) -> str:
78 """The generated DOT source code as string."""
---> 79 return ''.join(self)
File ~/.local/lib/python3.9/site-packages/graphviz/dot.py:173, in Dot.__iter__(self, subgraph)
171 else:
172 head = self._head_strict if self.strict else self._head
--> 173 yield head(self._quote(self.name) + ' ' if self.name else '')
175 for kw in ('graph', 'node', 'edge'):
176 attrs = getattr(self, f'{kw}_attr')
File ~/.local/lib/python3.9/site-packages/graphviz/_tools.py:171, in deprecate_positional_args.<locals>.decorator.<locals>.wrapper(*args, **kwargs)
162 wanted = ', '.join(f'{name}={value!r}'
163 for name, value in deprecated.items())
164 warnings.warn(f'The signature of {func.__name__} will be reduced'
165 f' to {supported_number} positional args'
166 f' {list(supported)}: pass {wanted}'
167 ' as keyword arg(s)',
168 stacklevel=stacklevel,
169 category=category)
--> 171 return func(*args, **kwargs)
File ~/.local/lib/python3.9/site-packages/graphviz/quoting.py:82, in quote(identifier, is_html_string, is_valid_id, dot_keywords, endswith_odd_number_of_backslashes, escape_unescaped_quotes)
40 @_tools.deprecate_positional_args(supported_number=1)
41 def quote(identifier: str,
42 is_html_string=HTML_STRING.match,
(...)
45 endswith_odd_number_of_backslashes=FINAL_ODD_BACKSLASHES.search,
46 escape_unescaped_quotes=ESCAPE_UNESCAPED_QUOTES) -> str:
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
def exporte_graphe(fich, graphe, noms_sommets): def exporte_graphe(fich, graphe, noms_sommets):
# à compléter # à compléter
return True return True
``` ```
%% 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
def algo_dijkstra(s, graphe): def algo_dijkstra(s, graphe):
pred = [s for i in range(len(graphe))]
# à compléter distance = [float('inf') for _ in graphe]
distance[s] = 0
return distances, predecesseurs non_visites = [i for i in range(len(graphe))]
while non_visites:
liste = [distance[i] for i in range(len(non_visites))]
index = liste.index(min(liste))
point = non_visites.pop(index)
for i, v in enumerate(graphe[point]):
if v <= 0 or v == float('inf') or i not in non_visites:
continue
if distance[point] + v < distance[i]:
distance[i] = distance[point] + v
pred[i] = point
return distance, 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
!pip install geopy !pip install geopy
#import geopy #import geopy
from geopy.distance import geodesic as gd from geopy.distance import geodesic as gd
``` ```
%% 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
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
def cree_graphe_distances(nom_sommet, lat_sommet, long_sommet, fich_csv, dpt): def cree_graphe_distances(nom_sommet, lat_sommet, long_sommet, fich_csv, dpt):
# à compléter # à compléter
return graphe, noms_sommets return graphe, noms_sommets
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## Calcul de plus courts chemins, en utilisant l'algorithme de Dijkstra implémenté ## Calcul de plus courts chemins, en utilisant l'algorithme de Dijkstra implémenté
Vous donnerez le nom et l'adresse des lieux à lister. Vous donnerez le nom et l'adresse des lieux à lister.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
#### Quelle est l'aire de covoiturage la plus proche de la manifestation culturelle choisie ? #### Quelle est l'aire de covoiturage la plus proche de la manifestation culturelle choisie ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# à compléter # à compléter
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
#### Quel est l'hôtel le plus proche de la manifestation culturelle choisie ? #### Quel est l'hôtel le plus proche de la manifestation culturelle choisie ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# à compléter # à compléter
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
#### Quels sont les 10 hôtels les plus proches de la manifestation culturelle choisie ? #### Quels sont les 10 hôtels les plus proches de la manifestation culturelle choisie ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# à compléter # à compléter
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
#### Quels sont les 10 hôtels 3 étoiles les plus proches de la manifestation culturelle choisie ? #### Quels sont les 10 hôtels 3 étoiles les plus proches de la manifestation culturelle choisie ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# à compléter # à compléter
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
#### Quel est l'hôtel 4 étoile le plus proche de la manifestation culturelle choisie ? #### Quel est l'hôtel 4 étoile le plus proche de la manifestation culturelle choisie ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# à compléter # à compléter
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
#### Quel est le restaurant le plus proche de la manifestation culturelle choisie ? #### Quel est le restaurant le plus proche de la manifestation culturelle choisie ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# à compléter # à compléter
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
#### Quels sont les 10 restaurants les plus proches de la manifestation culturelle choisie ? #### Quels sont les 10 restaurants les plus proches de la manifestation culturelle choisie ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# à compléter # à compléter
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
#### Quels sont les 10 restaurants de cuisine traditionelle les plus proches de la manifestation culturelle choisie ? #### Quels sont les 10 restaurants de cuisine traditionelle les plus proches de la manifestation culturelle choisie ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# à compléter # à compléter
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
#### Quelle est la crêperie la plus proche de la manifestation culturelle choisie ? #### Quelle est la crêperie la plus proche de la manifestation culturelle choisie ?
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# à compléter # à compléter
``` ```
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter