8.4 KiB
8.4 KiB
In [ ]:
# %pip install networkx matplotlib
import networkx as nx
import matplotlib.pyplot as plt
from collections import dequeIn [ ]:
# Vous pouvez modifier/étendre ce graphe
G = nx.Graph()
G.add_edges_from([
("Alice","Bob"),
("Bob","Claire"),
("Claire","Emma"),
("Alice","David"),
("David","Emma"),
("Emma","Fanny"),
("Bob","Gaston"),
])
# Visualisation simple
plt.figure()
nx.draw(G, with_labels=True)
plt.show()
print("Nœuds :", list(G.nodes()))
print("Arêtes:", list(G.edges()))
print("Composantes connexes:", nx.number_connected_components(G))In [ ]:
source, cible = "Alice", "Fanny"
chemin = nx.shortest_path(G, source=source, target=cible) # plus court chemin (non pondéré)
dist = nx.shortest_path_length(G, source=source, target=cible)
print(f"Plus court chemin de {source} à {cible} :", chemin)
print(f"Distance (nombre d'arêtes) :", dist)In [ ]:
def bfs_layers(graph, start):
"""Retourne l'ordre de visite et les couches de distance (dict: noeud -> distance)
BFS avec file d'attente (deque).
"""
visited = set([start])
dist = {start: 0}
order = []
q = deque([start])
while q:
u = q.popleft()
order.append(u)
for v in graph.neighbors(u):
if v not in visited:
visited.add(v)
dist[v] = dist[u] + 1
q.append(v)
return order, dist
order, dist = bfs_layers(G, "Alice")
print("Ordre BFS depuis Alice:", order)
print("Distances depuis Alice:", dist)In [ ]:
def dfs_order(graph, start, visited=None, order=None):
if visited is None: visited = set()
if order is None: order = []
visited.add(start)
order.append(start)
for v in graph.neighbors(start):
if v not in visited:
dfs_order(graph, v, visited, order)
return order
print("Ordre DFS depuis Alice:", dfs_order(G, "Alice"))In [ ]:
if nx.is_connected(G):
# Diamètre = plus longue distance entre deux nœuds
d = nx.diameter(G)
# Distance moyenne (longueur moyenne des plus courts chemins)
apl = nx.average_shortest_path_length(G)
print("Diamètre:", d)
print("Distance moyenne:", apl)
else:
print("Le graphe n'est pas connexe : diamètre et distance moyenne ne sont pas définis globalement.")In [ ]:
# Construisons un graphe en anneau + quelques liens longue portée pour réduire drastiquement les distances
H = nx.cycle_graph(12) # 12 individus en cercle (0..11)
H = nx.relabel_nodes(H, {i: f"P{i}" for i in range(12)})
H.add_edge("P0","P6") # raccourci longue portée
H.add_edge("P3","P9") # autre raccourci
plt.figure()
nx.draw(H, with_labels=True)
plt.show()
print("Connexe:", nx.is_connected(H))
print("Distance moyenne:", nx.average_shortest_path_length(H))