Exploration interactive de la coloration, des cycles eulériens et hamiltoniens
La théorie des graphes nous offre des outils puissants pour modéliser et résoudre des problèmes complexes. Cet outil interactif explore trois problèmes fondamentaux :
Attribution de couleurs aux sommets d'un graphe de sorte que deux sommets adjacents n'aient jamais la même couleur. Un problème classique avec des applications pratiques comme l'allocation de ressources.
Recherche d'un cycle passant une et une seule fois par chaque arête du graphe. Ce problème, inspiré des ponts de Königsberg, est résolvable en temps polynomial.
Recherche d'un cycle passant une et une seule fois par chaque sommet du graphe. Un problème NP-complet, proche du célèbre problème du voyageur de commerce.
Ces trois problèmes illustrent parfaitement la diversité de la complexité en théorie des graphes :
À travers cet outil interactif, nous explorerons ces problèmes, leurs démonstrations mathématiques et leurs implications pratiques.
L'algorithme glouton pour la coloration de graphe est une approche simple mais efficace. Il parcourt les sommets dans un ordre donné et attribue à chaque sommet la plus petite couleur disponible qui n'est pas utilisée par ses voisins.
Fonction ColoreGlouton(G):
Pour chaque sommet v dans G:
couleurs_disponibles = {0, 1, 2, ...}
Pour chaque voisin u de v:
Si u est déjà coloré:
Retirer couleur[u] de couleurs_disponibles
couleur[v] = plus petite couleur de couleurs_disponibles
Retourner couleur
Fonction TrouveCycleEulerien(G, sommet_depart):
cycle = []
pile = [sommet_depart]
Tant que pile non vide:
sommet_courant = sommet au sommet de la pile
Si degré(sommet_courant) > 0:
Choisir une arête non visitée e = (sommet_courant, v)
Supprimer l'arête e
Empiler v sur la pile
Sinon:
Dépiler sommet_courant et l'ajouter au début de cycle
Retourner cycle
Fonction TrouveCycleHamiltonien(G, sommet_depart):
chemin = [sommet_depart]
visites = {sommet_depart}
Fonction backtrack(chemin, visites):
Si len(chemin) == nombre_sommets:
Si existe_arete(dernier_sommet, sommet_depart):
Retourner chemin + [sommet_depart]
Retourner null
Pour chaque voisin v de dernier_sommet:
Si v non dans visites:
Ajouter v au chemin et aux visités
resultat = backtrack(chemin, visites)
Si resultat non null:
Retourner resultat
Retirer v du chemin et des visités
Retourner null
Retourner backtrack(chemin, visites)
Imaginons un voyageur qui doit visiter plusieurs villes. Il veut :
G = (V, E) représente notre carte :
Pour un graphe de n sommets :
Avec un ordinateur effectuant 1 milliard d'opérations par seconde :
Diagramme illustrant les relations entre les classes de complexité P et NP
Pour prouver qu'un problème A est NP-complet :
Notation : B ≤ₚ A (B se réduit polynomialement à A)
Réduction du problème SAT vers le cycle hamiltonien :
Un cycle hamiltonien peut être vérifié en temps polynomial :
Construction du graphe G à partir d'une formule 3-SAT :
⟹ Si la formule est satisfiable, il existe un cycle hamiltonien
⟸ Si un cycle hamiltonien existe, la formule est satisfiable
Pour n villes :
La NP-complétude du problème du cycle hamiltonien n'est pas qu'une curiosité théorique. Elle explique pourquoi :
Cliquez sur "Colorier le graphe" pour voir les étapes d'exécution.
Aucune opération effectuée.
Voici l'implémentation optimisée de l'algorithme glouton en Python :
def greedy_coloring(graph):
"""
Implémentation optimisée de l'algorithme glouton pour la coloration de graphe.
Args:
graph: Un objet NetworkX Graph
Returns:
Un dictionnaire avec les nœuds comme clés et leurs couleurs comme valeurs
"""
# Initialisation du dictionnaire de couleurs
colors = {}
# Trier les nœuds par degré décroissant (heuristique)
nodes = sorted(graph.nodes(), key=lambda x: graph.degree(x), reverse=True)
for node in nodes:
# Ensemble des couleurs déjà utilisées par les voisins
neighbor_colors = {colors.get(neighbor) for neighbor in graph.neighbors(node)
if neighbor in colors}
# Trouver la première couleur disponible
color = 0
while color in neighbor_colors:
color += 1
# Assigner cette couleur au nœud
colors[node] = color
return colors
La coloration de graphe trouve de nombreuses applications pratiques :
Attribution d'horaires, de salles, ou de fréquences pour éviter les conflits.
Attribution de fréquences dans les réseaux sans fil, répartition des canaux WiFi.
Allocation de registres dans les compilateurs pour optimiser l'utilisation des ressources.