ajout de tous les cours et TP préparés cet été
This commit is contained in:
212
Graphes/Corrige_Exercices.md
Normal file
212
Graphes/Corrige_Exercices.md
Normal file
@@ -0,0 +1,212 @@
|
||||
# Corrigé des Exercices sur les Graphes
|
||||
|
||||
---
|
||||
|
||||
## Exercice 1 : Réseau social (README.md)
|
||||
|
||||
### Rappel du graphe
|
||||
|
||||
```
|
||||
A --- B
|
||||
/|\ |
|
||||
/ | \ |
|
||||
C | D--+
|
||||
\ | /|
|
||||
\|/ |
|
||||
E--F
|
||||
```
|
||||
|
||||
Avec :
|
||||
- A ami avec B, C, D
|
||||
- B ami avec A, D
|
||||
- C ami avec A, E, D
|
||||
- D ami avec A, B, C, E, F
|
||||
- E ami avec C, D, F
|
||||
- F ami avec E, D
|
||||
|
||||
### 1°) Degré des sommets
|
||||
|
||||
| Sommet | Voisins | Degré |
|
||||
|--------|---------|-------|
|
||||
| A | B, C, D | 3 |
|
||||
| B | A, D | 2 |
|
||||
| C | A, E, D | 3 |
|
||||
| D | A, B, C, E, F | 5 |
|
||||
| E | C, D, F | 3 |
|
||||
| F | E, D | 2 |
|
||||
|
||||
**Vérification** : Somme des degrés = 3+2+3+5+3+2 = 18 = 2 × 9 arêtes ✓
|
||||
|
||||
### 2°) Ordre du graphe
|
||||
|
||||
L'ordre du graphe est **6** (il y a 6 sommets : A, B, C, D, E, F).
|
||||
|
||||
### 3°) Ce graphe est-il complet ?
|
||||
|
||||
**Non**, ce graphe n'est pas complet.
|
||||
|
||||
Dans un graphe complet d'ordre 6, chaque sommet serait de degré 5 (relié à tous les autres).
|
||||
|
||||
Contre-exemples :
|
||||
- A n'est pas relié à E et F
|
||||
- B n'est pas relié à C, E et F
|
||||
|
||||
---
|
||||
|
||||
## Exercice 2 : Matrice d'adjacence du réseau social
|
||||
|
||||
En numérotant les sommets dans l'ordre alphabétique (A, B, C, D, E, F) :
|
||||
|
||||
| | A | B | C | D | E | F |
|
||||
|---|---|---|---|---|---|---|
|
||||
| A | 0 | 1 | 1 | 1 | 0 | 0 |
|
||||
| B | 1 | 0 | 0 | 1 | 0 | 0 |
|
||||
| C | 1 | 0 | 0 | 1 | 1 | 0 |
|
||||
| D | 1 | 1 | 1 | 0 | 1 | 1 |
|
||||
| E | 0 | 0 | 1 | 1 | 0 | 1 |
|
||||
| F | 0 | 0 | 0 | 1 | 1 | 0 |
|
||||
|
||||
**En Python :**
|
||||
|
||||
```python
|
||||
M = [
|
||||
[0, 1, 1, 1, 0, 0],
|
||||
[1, 0, 0, 1, 0, 0],
|
||||
[1, 0, 0, 1, 1, 0],
|
||||
[1, 1, 1, 0, 1, 1],
|
||||
[0, 0, 1, 1, 0, 1],
|
||||
[0, 0, 0, 1, 1, 0]
|
||||
]
|
||||
```
|
||||
|
||||
**Remarque** : La matrice est symétrique car le graphe est non orienté.
|
||||
|
||||
---
|
||||
|
||||
## Exercice 3 : Réseau social d'Arthur (EXERCICES.md)
|
||||
|
||||
### Graphe
|
||||
|
||||
```
|
||||
Arthur ---- Benoit ---- Coralie
|
||||
| / |
|
||||
| / |
|
||||
Elodie ---- Franck ---- David
|
||||
```
|
||||
|
||||
### Représentation par dictionnaire
|
||||
|
||||
```python
|
||||
G = {
|
||||
'Arthur': ['Benoit', 'Elodie'],
|
||||
'Benoit': ['Arthur', 'Coralie'],
|
||||
'Coralie': ['Benoit', 'Franck', 'David'],
|
||||
'David': ['Coralie', 'Franck', 'Elodie'],
|
||||
'Elodie': ['Arthur', 'David', 'Franck'],
|
||||
'Franck': ['Coralie', 'David', 'Elodie']
|
||||
}
|
||||
```
|
||||
|
||||
### Matrice d'adjacence
|
||||
|
||||
En ordre alphabétique : Arthur, Benoit, Coralie, David, Elodie, Franck
|
||||
|
||||
| | Arthur | Benoit | Coralie | David | Elodie | Franck |
|
||||
|---------|--------|--------|---------|-------|--------|--------|
|
||||
| Arthur | 0 | 1 | 0 | 0 | 1 | 0 |
|
||||
| Benoit | 1 | 0 | 1 | 0 | 0 | 0 |
|
||||
| Coralie | 0 | 1 | 0 | 1 | 0 | 1 |
|
||||
| David | 0 | 0 | 1 | 0 | 1 | 1 |
|
||||
| Elodie | 1 | 0 | 0 | 1 | 0 | 1 |
|
||||
| Franck | 0 | 0 | 1 | 1 | 1 | 0 |
|
||||
|
||||
---
|
||||
|
||||
## Exercice 4 : Village d'Eva (graphe orienté pondéré)
|
||||
|
||||
### Graphe
|
||||
|
||||
```
|
||||
École
|
||||
/ | \
|
||||
3↓ 4↑ 6↕
|
||||
/ | \
|
||||
Boulangerie ←─── Mairie Salle des fêtes
|
||||
↓ ↕2 ↕7 ↕5
|
||||
4↓ Bureau Église Boucherie
|
||||
↓ de poste
|
||||
Boucherie
|
||||
```
|
||||
|
||||
**Sommets** : Boulangerie, Bureau de poste, École, Boucherie, Église, Mairie, Salle des fêtes
|
||||
|
||||
**Arêtes orientées avec poids** :
|
||||
- Boulangerie ↔ Bureau de poste : 2 min (double sens)
|
||||
- École → Boulangerie : 3 min (sens unique)
|
||||
- Boulangerie → Boucherie : 4 min (sens unique)
|
||||
- École → Église : 3 min (sens unique)
|
||||
- Mairie → École : 4 min (sens unique)
|
||||
- École ↔ Salle des fêtes : 6 min (double sens)
|
||||
- Boucherie ↔ Salle des fêtes : 5 min (double sens)
|
||||
- Mairie ↔ Église : 7 min (double sens)
|
||||
|
||||
---
|
||||
|
||||
## Exercice 5 : Ordre et degrés (img2.PNG)
|
||||
|
||||
*(Réponse basée sur l'image du fichier)*
|
||||
|
||||
Pour déterminer l'ordre : compter le nombre de sommets.
|
||||
|
||||
Pour déterminer le degré de chaque sommet : compter le nombre d'arêtes incidentes.
|
||||
|
||||
**Méthode générale :**
|
||||
```python
|
||||
def ordre(graphe):
|
||||
return len(graphe)
|
||||
|
||||
def degre(graphe, sommet):
|
||||
return len(graphe[sommet])
|
||||
|
||||
def degres(graphe):
|
||||
return {s: len(v) for s, v in graphe.items()}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Exercice 6 : Dictionnaire et matrice (img3.PNG)
|
||||
|
||||
*(Réponse basée sur l'image du fichier)*
|
||||
|
||||
**Méthode pour créer le dictionnaire :**
|
||||
|
||||
```python
|
||||
# Lire les sommets et leurs voisins depuis le graphe
|
||||
G = {}
|
||||
# Pour chaque sommet, lister ses voisins
|
||||
# G['A'] = ['B', 'C', ...]
|
||||
```
|
||||
|
||||
**Méthode pour créer la matrice d'adjacence :**
|
||||
|
||||
```python
|
||||
def creer_matrice(graphe):
|
||||
sommets = list(graphe.keys())
|
||||
n = len(sommets)
|
||||
matrice = [[0] * n for _ in range(n)]
|
||||
|
||||
for i, s1 in enumerate(sommets):
|
||||
for j, s2 in enumerate(sommets):
|
||||
if s2 in graphe[s1]:
|
||||
matrice[i][j] = 1
|
||||
|
||||
return matrice
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
@@ -6,14 +6,14 @@ Construire un graphe non orienté du réseau social à partir des informations s
|
||||
- **Benoit** est ami avec **Arthur** et **Coralie** ;
|
||||
- **Coralie** est amie avec **Benoit**, **Franck** et **David** ;
|
||||
- **David** est ami avec **Coralie**, **Franck** et **Elodie** ;
|
||||
- **Elodie** est ami avec **Arthur**, **David** et **Franck** ;
|
||||
- **Elodie** est amie avec **Arthur**, **David** et **Franck** ;
|
||||
- **Franck** est ami avec **Coralie**, **David** et **Elodie**.
|
||||
|
||||
---
|
||||
|
||||
Eva décide de faire un graphe orienté représentant les différentes ruelles de son village. On y trouve une boulangerie, une école, un bureau de poste, une boucherie, une mairie, une église et une salle des fêtes. Certaines ruelles sont à double sens et d'autres à sens unique.
|
||||
|
||||
Eva décide de donner pour chacune des arêtes de son graphe une valeur qui correpond au temps qu'elle met pour traverser la ruelle à pied (chaque arête représente un sens de circulation).
|
||||
Eva décide de donner pour chacune des arêtes de son graphe une valeur qui correspond au temps qu'elle met pour traverser la ruelle à pied (chaque arête représente un sens de circulation).
|
||||
|
||||
Voici ses données :
|
||||
|
||||
@@ -40,3 +40,10 @@ Voici ses données :
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## Graphes et POO
|
||||
# Graphes et POO
|
||||
|
||||
> Tout comme les arbres, il nous est possible de représenter les graphes sous la forme d'une classe Python.
|
||||
|
||||
@@ -67,4 +67,12 @@ class Graphe:
|
||||
|
||||
|
||||
|
||||
Merci à [Gilles Lassus](https://glassus.github.io/terminale_nsi/T1_Structures_de_donnees/1.4_Graphes/cours/#3-creation-dune-classe-graphe) pour la source.
|
||||
Merci à [Gilles Lassus](https://glassus.github.io/terminale_nsi/T1_Structures_de_donnees/1.4_Graphes/cours/#3-creation-dune-classe-graphe) pour la source.
|
||||
|
||||
---
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
@@ -1,9 +1,7 @@
|
||||
## Les Graphes
|
||||
# Les Graphes
|
||||
|
||||
|
||||
|
||||
>
|
||||
|
||||
------
|
||||
|
||||
### Le programme
|
||||
@@ -12,7 +10,7 @@
|
||||
|
||||
---------
|
||||
|
||||
### Qu’est-qu’un graphe?
|
||||
### Qu'est-ce qu'un graphe ?
|
||||
Imaginez un réseau social ayant 6 abonnés (A, B, C, D, E et F) où :
|
||||
* A est ami avec B, C et D
|
||||
* B est ami avec A et D
|
||||
@@ -24,7 +22,7 @@ Imaginez un réseau social ayant 6 abonnés (A, B, C, D, E et F) où :
|
||||
|
||||
On peut représenter ce réseau social par un schéma où :
|
||||
* Chaque abonné est représenté par un cercle avec son nom.
|
||||
* Chaque relation "X est ami avec Y" par un segment de droite reliant X et Y ("X est amiavec Y" et "Y est ami avec X" étant représenté par le même segment de droite).
|
||||
* Chaque relation "X est ami avec Y" par un segment de droite reliant X et Y ("X est ami avec Y" et "Y est ami avec X" étant représenté par le même segment de droite).
|
||||
|
||||
Voici ce que cela donne avec le réseau social décrit ci-dessus :
|
||||
|
||||
@@ -34,13 +32,13 @@ Voici ce que cela donne avec le réseau social décrit ci-dessus :
|
||||
|
||||
|
||||
|
||||
Ce genre de figure s’appelle un graphe. Les graphes sont des objets mathématiquestrès utilisés, notamment en informatique.Les cercles sont appelés des sommets et les segments de droites des arêtes.
|
||||
Ce genre de figure s'appelle un graphe. Les graphes sont des objets mathématiques très utilisés, notamment en informatique. Les cercles sont appelés des **sommets** et les segments de droites des **arêtes**.
|
||||
|
||||
|
||||
|
||||
### Définitions et terminologie
|
||||
|
||||
On appelle **graphe** un ensemble de points appelés **sommets** associés à un ensemble de lignes appelées **arrêtes** qui relient certains sommets entre eux.
|
||||
On appelle **graphe** un ensemble de points appelés **sommets** associés à un ensemble de lignes appelées **arêtes** qui relient certains sommets entre eux.
|
||||
|
||||
**Ordre d’un graphe :**
|
||||
L’ordre d’un graphe est le nombre de sommets du graphe.
|
||||
@@ -103,7 +101,7 @@ Chaque sommet est de degré 3
|
||||
|
||||
|
||||
|
||||
Un graphe paut être **orienté** ou **non-orienté**.
|
||||
Un graphe peut être **orienté** ou **non-orienté**.
|
||||
|
||||
|
||||
|
||||
@@ -193,7 +191,7 @@ Ecrire la matrice d'adjacence du réseau social de l'introduction
|
||||
### Chaine et cycle
|
||||
|
||||
**Définition:**
|
||||
On appelle **chaîne** toute succession d’arêtes dont l’extrémité de l’une (sauf la dernière) estl’origine de la suivante.
|
||||
On appelle **chaîne** toute succession d'arêtes dont l'extrémité de l'une (sauf la dernière) est l'origine de la suivante.
|
||||
|
||||
* Le nombre d’arêtes qui composent une chaîne est appelé **longueur de la chaîne**.
|
||||
* On appelle **chaîne fermée** toute chaîne dont l’origine et l’extrémité coïncident.
|
||||
@@ -201,7 +199,7 @@ On appelle **chaîne** toute succession d’arêtes dont l’extrémité de l’
|
||||
|
||||
**Exemple:**
|
||||
Dans le graphe ci-dessous:
|
||||
E-A-C-B est un chaîne de longueur 3.
|
||||
E-A-C-B est une chaîne de longueur 3.
|
||||
|
||||
E-A-C-B-A-E est une chaîne fermée de longueur 5. Ce n’est pas un cycle car l’arête A-E est parcourue deux fois.
|
||||
|
||||
@@ -209,5 +207,34 @@ D-B-A-C-D est un cycle de longueur 4.
|
||||
|
||||
<img src="assets/graphe_8.png" alt="graphe_8" style="zoom:67%;" />
|
||||
|
||||
---
|
||||
|
||||
## Pour aller plus loin
|
||||
|
||||
Les graphes sont une structure fondamentale en informatique. Dans les cours suivants, nous verrons :
|
||||
|
||||
- **Les parcours de graphes** (BFS et DFS) → voir [PARCOURS.md](PARCOURS.md)
|
||||
- **L'implémentation en POO** → voir [POO.md](POO.md)
|
||||
- **Les algorithmes de plus court chemin** (Dijkstra, Bellman-Ford) → voir le chapitre Routage
|
||||
|
||||
---
|
||||
|
||||
## Résumé
|
||||
|
||||
| Notion | Définition |
|
||||
|--------|------------|
|
||||
| **Graphe** | Ensemble de sommets reliés par des arêtes |
|
||||
| **Ordre** | Nombre de sommets |
|
||||
| **Degré** | Nombre d'arêtes issues d'un sommet |
|
||||
| **Adjacents** | Deux sommets reliés par une arête |
|
||||
| **Chaîne** | Succession d'arêtes consécutives |
|
||||
| **Cycle** | Chaîne fermée sans répétition d'arêtes |
|
||||
| **Matrice d'adjacence** | Représentation matricielle du graphe |
|
||||
|
||||
---
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
|
||||
334
Graphes/TP_KevinBacon.md
Normal file
334
Graphes/TP_KevinBacon.md
Normal file
@@ -0,0 +1,334 @@
|
||||
# TP : Les 6 degrés de Kevin Bacon — Le petit monde des réseaux
|
||||
|
||||
> **Thème** : Parcours de graphes et théorie des réseaux sociaux
|
||||
|
||||
---
|
||||
|
||||
## Contexte
|
||||
|
||||
En 2026, les réseaux sociaux connectent des milliards de personnes. TikTok, Instagram, LinkedIn... Mais saviez-vous que vous êtes probablement relié(e) à n'importe quelle célébrité par seulement **6 intermédiaires** ?
|
||||
|
||||
C'est la théorie des **"Six degrés de séparation"**, popularisée par le jeu **"Six Degrees of Kevin Bacon"** : tout acteur d'Hollywood peut être relié à Kevin Bacon en moins de 6 films.
|
||||
|
||||
Dans ce TP, vous allez explorer cette théorie en utilisant les **algorithmes de parcours de graphes**.
|
||||
|
||||
---
|
||||
|
||||
## Partie 1 : Comprendre le problème
|
||||
|
||||
### Le nombre de Bacon
|
||||
|
||||
Le **nombre de Bacon** d'un acteur est la distance minimale (en nombre de films) qui le sépare de Kevin Bacon.
|
||||
|
||||
- Kevin Bacon a un nombre de Bacon de **0**
|
||||
- Un acteur qui a joué avec Kevin Bacon a un nombre de Bacon de **1**
|
||||
- Un acteur qui a joué avec quelqu'un qui a joué avec Kevin Bacon a un nombre de Bacon de **2**
|
||||
- Et ainsi de suite...
|
||||
|
||||
### Exemple
|
||||
|
||||
```
|
||||
Tom Hanks ──[Apollo 13]── Kevin Bacon
|
||||
→ Nombre de Bacon = 1
|
||||
|
||||
Natalie Portman ──[Heat]── Robert De Niro ──[Sleepers]── Kevin Bacon
|
||||
→ Nombre de Bacon = 2
|
||||
```
|
||||
|
||||
### Questions préliminaires
|
||||
|
||||
1. Si un acteur A a joué avec un acteur B, quelle est la relation entre eux dans un graphe ?
|
||||
|
||||
2. Quel algorithme de parcours permet de trouver le **plus court chemin** entre deux sommets ?
|
||||
|
||||
3. Pourquoi BFS est-il préférable à DFS pour ce problème ?
|
||||
|
||||
---
|
||||
|
||||
## Partie 2 : Modélisation du problème
|
||||
|
||||
### Le graphe des acteurs
|
||||
|
||||
Nous allons modéliser Hollywood comme un graphe où :
|
||||
- Chaque **sommet** représente un acteur
|
||||
- Chaque **arête** relie deux acteurs qui ont joué dans le même film
|
||||
|
||||
### Mini-base de données
|
||||
|
||||
Voici une petite base de données de films :
|
||||
|
||||
```python
|
||||
films = {
|
||||
"Apollo 13": ["Tom Hanks", "Kevin Bacon", "Bill Paxton"],
|
||||
"Forrest Gump": ["Tom Hanks", "Robin Wright", "Gary Sinise"],
|
||||
"The Dark Knight": ["Christian Bale", "Heath Ledger", "Gary Oldman"],
|
||||
"Inception": ["Leonardo DiCaprio", "Tom Hardy", "Marion Cotillard"],
|
||||
"Interstellar": ["Matthew McConaughey", "Anne Hathaway", "Jessica Chastain"],
|
||||
"Mystic River": ["Sean Penn", "Kevin Bacon", "Tim Robbins"],
|
||||
"X-Men First Class": ["James McAvoy", "Michael Fassbender", "Kevin Bacon"],
|
||||
"The Shawshank Redemption": ["Tim Robbins", "Morgan Freeman"],
|
||||
"Se7en": ["Morgan Freeman", "Brad Pitt", "Kevin Spacey"],
|
||||
"Fight Club": ["Brad Pitt", "Edward Norton", "Helena Bonham Carter"],
|
||||
"Harry Potter": ["Daniel Radcliffe", "Emma Watson", "Gary Oldman"],
|
||||
"Batman Begins": ["Christian Bale", "Liam Neeson", "Gary Oldman"],
|
||||
"Taken": ["Liam Neeson", "Maggie Grace"],
|
||||
"Lost in Translation": ["Bill Murray", "Scarlett Johansson"],
|
||||
"The Avengers": ["Scarlett Johansson", "Robert Downey Jr", "Chris Evans"],
|
||||
"Captain America": ["Chris Evans", "Sebastian Stan", "Robert Downey Jr"]
|
||||
}
|
||||
```
|
||||
|
||||
### Exercice 1 : Construire le graphe
|
||||
|
||||
Complétez la fonction suivante qui construit le graphe des acteurs à partir de la base de films :
|
||||
|
||||
```python
|
||||
def construire_graphe_acteurs(films):
|
||||
"""
|
||||
Construit un graphe où chaque acteur est un sommet
|
||||
et deux acteurs sont reliés s'ils ont joué dans le même film.
|
||||
|
||||
Paramètre:
|
||||
films (dict): dictionnaire {nom_film: [liste_acteurs]}
|
||||
|
||||
Retourne:
|
||||
dict: graphe sous forme de dictionnaire d'adjacence
|
||||
"""
|
||||
graphe = {}
|
||||
|
||||
for film, acteurs in films.items():
|
||||
# Pour chaque paire d'acteurs dans le film, créer une arête
|
||||
# À compléter...
|
||||
pass
|
||||
|
||||
return graphe
|
||||
```
|
||||
|
||||
**Indice** : Utilisez `itertools.combinations(acteurs, 2)` pour obtenir toutes les paires d'acteurs.
|
||||
|
||||
---
|
||||
|
||||
## Partie 3 : Algorithme BFS pour le nombre de Bacon
|
||||
|
||||
### Rappel : Parcours en largeur (BFS)
|
||||
|
||||
Le BFS explore le graphe **niveau par niveau**. Il est idéal pour trouver le plus court chemin dans un graphe non pondéré.
|
||||
|
||||
### Exercice 2 : Implémenter le calcul du nombre de Bacon
|
||||
|
||||
Complétez la fonction suivante :
|
||||
|
||||
```python
|
||||
from collections import deque
|
||||
|
||||
def nombre_de_bacon(graphe, acteur, bacon="Kevin Bacon"):
|
||||
"""
|
||||
Calcule le nombre de Bacon d'un acteur.
|
||||
|
||||
Paramètres:
|
||||
graphe (dict): graphe des acteurs
|
||||
acteur (str): nom de l'acteur
|
||||
bacon (str): nom de la référence (Kevin Bacon par défaut)
|
||||
|
||||
Retourne:
|
||||
int: le nombre de Bacon, ou -1 si non connecté
|
||||
"""
|
||||
if acteur == bacon:
|
||||
return 0
|
||||
|
||||
if acteur not in graphe or bacon not in graphe:
|
||||
return -1
|
||||
|
||||
# BFS
|
||||
file = deque([(bacon, 0)]) # (sommet, distance)
|
||||
visite = {bacon}
|
||||
|
||||
while file:
|
||||
# À compléter...
|
||||
pass
|
||||
|
||||
return -1 # Non trouvé
|
||||
```
|
||||
|
||||
### Exercice 3 : Trouver le chemin
|
||||
|
||||
Modifiez l'algorithme pour retourner non seulement la distance, mais aussi le **chemin** (la liste des acteurs intermédiaires) :
|
||||
|
||||
```python
|
||||
def chemin_vers_bacon(graphe, acteur, bacon="Kevin Bacon"):
|
||||
"""
|
||||
Trouve le plus court chemin entre un acteur et Kevin Bacon.
|
||||
|
||||
Retourne:
|
||||
list: liste des acteurs formant le chemin, ou None si non connecté
|
||||
"""
|
||||
# À compléter...
|
||||
pass
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Partie 4 : Analyse du réseau
|
||||
|
||||
### Exercice 4 : Statistiques globales
|
||||
|
||||
Écrivez des fonctions pour calculer les statistiques suivantes :
|
||||
|
||||
```python
|
||||
def nombre_bacon_moyen(graphe, bacon="Kevin Bacon"):
|
||||
"""Calcule le nombre de Bacon moyen de tous les acteurs."""
|
||||
# À compléter...
|
||||
pass
|
||||
|
||||
def acteur_le_plus_eloigne(graphe, bacon="Kevin Bacon"):
|
||||
"""Trouve l'acteur avec le plus grand nombre de Bacon."""
|
||||
# À compléter...
|
||||
pass
|
||||
|
||||
def acteurs_non_connectes(graphe, bacon="Kevin Bacon"):
|
||||
"""Liste les acteurs qui ne sont pas connectés à Kevin Bacon."""
|
||||
# À compléter...
|
||||
pass
|
||||
```
|
||||
|
||||
### Exercice 5 : Visualisation
|
||||
|
||||
Utilisez la bibliothèque `networkx` pour visualiser le graphe :
|
||||
|
||||
```python
|
||||
import networkx as nx
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
def visualiser_graphe(graphe, acteur_central="Kevin Bacon"):
|
||||
"""
|
||||
Affiche le graphe avec des couleurs selon la distance à l'acteur central.
|
||||
"""
|
||||
G = nx.Graph(graphe)
|
||||
|
||||
# Calculer les distances
|
||||
distances = nx.single_source_shortest_path_length(G, acteur_central)
|
||||
|
||||
# Couleurs selon la distance
|
||||
couleurs = [distances.get(node, -1) for node in G.nodes()]
|
||||
|
||||
# Affichage
|
||||
plt.figure(figsize=(12, 8))
|
||||
pos = nx.spring_layout(G, seed=42)
|
||||
nx.draw(G, pos, with_labels=True, node_color=couleurs,
|
||||
cmap=plt.cm.RdYlGn_r, node_size=500, font_size=8)
|
||||
plt.title(f"Graphe des acteurs (distance à {acteur_central})")
|
||||
plt.show()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Partie 5 : Extension — Votre propre réseau
|
||||
|
||||
### Exercice 6 : Réseau social de la classe
|
||||
|
||||
Créez un graphe représentant les relations d'amitié dans votre classe (ou un réseau fictif) et calculez :
|
||||
|
||||
1. Qui est le "Kevin Bacon" de la classe (la personne la plus centrale) ?
|
||||
2. Quel est le diamètre du graphe (la plus grande distance entre deux personnes) ?
|
||||
3. Y a-t-il des personnes isolées ?
|
||||
|
||||
```python
|
||||
def centralite(graphe):
|
||||
"""
|
||||
Trouve la personne la plus centrale du graphe
|
||||
(celle qui minimise la somme des distances aux autres).
|
||||
"""
|
||||
# À compléter...
|
||||
pass
|
||||
|
||||
def diametre(graphe):
|
||||
"""
|
||||
Calcule le diamètre du graphe
|
||||
(la plus grande distance entre deux sommets connectés).
|
||||
"""
|
||||
# À compléter...
|
||||
pass
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Partie 6 : Réflexion
|
||||
|
||||
### Questions de synthèse
|
||||
|
||||
1. **Six degrés de séparation** : Pourquoi pensez-vous que le nombre 6 revient souvent dans les réseaux sociaux réels ?
|
||||
|
||||
2. **Croissance des connexions** : Si chaque personne connaît en moyenne 100 personnes, combien de personnes peut-on atteindre en 2, 3, puis 6 étapes ? (Ordre de grandeur)
|
||||
|
||||
3. **Limites du modèle** : Notre graphe est non pondéré. Comment pourrait-on le modifier pour tenir compte de la "force" des liens (amis proches vs simples connaissances) ?
|
||||
|
||||
4. **Application réelle** : Citez une application concrète de ces algorithmes dans un réseau social moderne (LinkedIn, Facebook, etc.).
|
||||
|
||||
### Débat : La centralité du pouvoir
|
||||
|
||||
Dans un réseau social, les personnes très centrales ont un "pouvoir" particulier : elles peuvent diffuser rapidement une information à tout le réseau.
|
||||
|
||||
- Est-ce un avantage ou un danger pour la société ?
|
||||
- Comment les plateformes comme TikTok ou Instagram utilisent-elles cette notion de centralité ?
|
||||
|
||||
---
|
||||
|
||||
## Bonus : Oracle de Bacon en ligne
|
||||
|
||||
Le site [The Oracle of Bacon](https://oracleofbacon.org/) permet de calculer le nombre de Bacon de n'importe quel acteur dans une base de données de millions de films.
|
||||
|
||||
Testez avec vos acteurs préférés !
|
||||
|
||||
**Question bonus** : L'acteur moyen a un nombre de Bacon d'environ 2.9. Qu'est-ce que cela nous dit sur la structure du réseau des acteurs d'Hollywood ?
|
||||
|
||||
---
|
||||
|
||||
## Résumé des notions
|
||||
|
||||
| Concept | Application dans ce TP |
|
||||
|---------|------------------------|
|
||||
| Graphe non orienté | Réseau d'acteurs |
|
||||
| Sommet | Un acteur |
|
||||
| Arête | Deux acteurs ont joué ensemble |
|
||||
| BFS | Calcul du plus court chemin |
|
||||
| Distance | Nombre de Bacon |
|
||||
| Centralité | L'acteur le plus "connecté" |
|
||||
| Diamètre | La plus grande distance dans le graphe |
|
||||
|
||||
---
|
||||
|
||||
## Annexe : Solution de l'exercice 1
|
||||
|
||||
<details>
|
||||
<summary>Cliquez pour afficher</summary>
|
||||
|
||||
```python
|
||||
from itertools import combinations
|
||||
|
||||
def construire_graphe_acteurs(films):
|
||||
graphe = {}
|
||||
|
||||
for film, acteurs in films.items():
|
||||
# Créer les sommets si nécessaire
|
||||
for acteur in acteurs:
|
||||
if acteur not in graphe:
|
||||
graphe[acteur] = set()
|
||||
|
||||
# Créer les arêtes (toutes les paires d'acteurs)
|
||||
for a1, a2 in combinations(acteurs, 2):
|
||||
graphe[a1].add(a2)
|
||||
graphe[a2].add(a1)
|
||||
|
||||
# Convertir les sets en listes
|
||||
return {k: list(v) for k, v in graphe.items()}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
Auteur : Florian Mathieu
|
||||
|
||||
Licence CC BY NC
|
||||
|
||||
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|
||||
Reference in New Issue
Block a user