{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
Nous allons utiliser la classe Graphe avec un dictionnaire de liste d'adjacence codée lors du TP précédent en ajoutant une méthode colorer et un affichage qui tient compte des couleurs
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Import de networkx pour l'affichage des graphes.\n", "import networkx\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class Graphe:\n", " def __init__(self):\n", " self.dico_adj = {}\n", " self.couleurs = {} # dictionnaire qui associe un sommet à sa couleur \n", " \n", " def ajouter_sommet(self,s):\n", " if s not in self.dico_adj :\n", " self.dico_adj[s] = [] # on choisira ici une liste et non un ensemble \n", " \n", " def ajouter_arete(self, s1, s2):\n", " if s1 not in self.dico_adj:\n", " self.ajouter_sommet(s1)\n", " if s2 not in self.dico_adj:\n", " self.ajouter_sommet(s2)\n", " if s2 not in self.dico_adj[s1]:\n", " self.dico_adj[s1].append(s2)\n", " if s1 not in self.dico_adj[s2]:\n", " self.dico_adj[s2].append(s1)\n", " \n", " def est_arete(self,s1,s2):\n", " return s2 in self.dico_adj[s1]\n", " \n", " def sommets(self):\n", " return list(self.dico_adj.keys())\n", " \n", " def voisins(self,s):\n", " return list(self.dico_adj[s])\n", " \n", " def colorer(self,s,couleur):\n", " \"\"\"méthode qui permet de colorer le sommet s avec la couleur couleur\"\"\"\n", " self.couleurs[s] = couleur\n", " \n", " \n", " def __str__(self): \n", " \"Affichage du graphe en utilisant le module networkx\"\n", " G = networkx.Graph()\n", " for s1 in self.sommets():\n", " for s2 in self.voisins(s1):\n", " G.add_edge(s1,s2)\n", " \n", " if self.couleurs:\n", " networkx.draw(G, with_labels=True,cmap=plt.get_cmap(\"tab10\"),node_size=500, nodelist=self.sommets(), node_color=list(self.couleurs.values()))\n", " else:\n", " networkx.draw(G, with_labels=True, node_size=500,node_color=\"lightblue\") \n", " \n", " return \"\"" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sommets du graphe: ['A', 'B', 'C', 'D']\n", "Voisins de A: ['B', 'D', 'C']\n", "Voisins de B: ['A', 'C', 'D']\n" ] } ], "source": [ "# Exemple Vérifiez le bon fonctionnement de la classe Graphe avec un exemple .\n", "\n", "gr = Graphe()\n", "\n", "gr.ajouter_arete(\"A\",\"B\")\n", "gr.ajouter_arete(\"B\",\"C\")\n", "gr.ajouter_arete(\"D\",\"B\")\n", "gr.ajouter_arete(\"A\",\"D\")\n", "gr.ajouter_arete(\"A\",\"C\")\n", "gr.ajouter_arete(\"C\",\"D\")\n", "\n", "\n", "print(\"Sommets du graphe:\",gr.sommets())\n", "print(\"Voisins de A:\",gr.voisins(\"A\"))\n", "print(\"Voisins de B:\",gr.voisins(\"B\"))\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "Une première approche pour colorer le graphe est de prendre ses sommets les uns après les autres afin de leur affecter une couleur, tout en veillant à ce que deux sommets adjacents n'aient jamais la même couleur : c'est l'algorithme de coloration séquentielle.
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " fonction coloration(G)
\n",
"
Il s'agit maintenant d'utiliser l'algorithme de coloration séquentielle avec un ordre judicieux, en vue d'obtenir une coloration valide la plus « acceptable » possible.
\n", "L'algorithme de Welsh et Powell consiste ainsi à colorer séquentiellement le graphe en visitant les sommets par ordre de degré décroissant. L'idée est que les sommets ayant beaucoup de voisins sont plus difficiles à colorer : il faut les colorier en premier.
\n", "\n", "On rappelle que le degré d'un sommet est le nombre d'arêtes issues de ce sommet, c'est-à-dire son nombre de voisins.
\n", "\n", " \n", "