import networkx as nx import matplotlib.pyplot as plt H=nx.Graph() H.add_edges_from([(1,2),(1,5),(2,3),(2,5),(3,4),(4,5),(4,6),(5,0),(0,1), (0,6),(3,6),(3,5),(5,6)]) for s in H.nodes: H.nodes[s]["couleur"] = 0 def plus_petite_couleur_disponible(G,s): couleurs = [G.nodes[v]["couleur"] for v in G.neighbors(s)] for i in range(len(couleurs)+1): if i not in couleurs: return i print(plus_petite_couleur_disponible(H,1)) def coloration_gloutonne(G): for s in G.nodes: G.nodes[s]["couleur"] = plus_petite_couleur_disponible(G,s) return G print(coloration_gloutonne(H).nodes.data()) def afficher_graphe_colore(G): nx.draw(G,with_labels=True,node_color=[G.nodes[v]["couleur"] for v in G.nodes]) plt.show() afficher_graphe_colore(H) # En option, on pourrait aussi afficher des vraies couleurs, prises au hasard, avec une # fonction afficher graphe colore vraies couleurs(G,c) o`u G est le graphe d ́ej`a co- # lori ́e et c est le nombre de couleurs. Pour tirer une couleur au hasard, il faut tirer au # hasard trois flottants (entre 0 et 1 chacun) repr ́esentant la proportion de rouge, vert, et # bleu, avec la fonction random.random() (il faut faire au pr ́ealable un import random). # Il faudra ensuite associer `a chaque num ́ero de couleur (entre 1 et c) de la coloration, # une couleur diff ́erente. # Par exemple, supposons que la liste L contient les sommets colori ́es avec une certaine # couleur (par exemple la couleur 1) et qu’on veut associer la couleur 1 `a la vraie couleur # d ́efinie par r=0.2, v=0.7, b=1, le code suivant affichera les sommets de L (et uniquement # ceux-ci) avec cette couleur : # dico_pos = nx.spring_layout(G) # nx.draw(G,pos=dico_pos,with_labels=True) # nx.draw_networkx_nodes(G, dico_pos, nodelist=L, node_color=[[r,v,b]]) # plt.show() def afficher_graphe_colore_vraies_couleurs(G, c): import random for s in G.nodes: G.nodes[s]["couleur"] = plus_petite_couleur_disponible(G,s) dico_pos = nx.spring_layout(G) nx.draw(G,pos=dico_pos,with_labels=True) for i in range(c): r = random.random() v = random.random() b = random.random() nx.draw_networkx_nodes(G, dico_pos, nodelist=[s for s in G.nodes if G.nodes[s]["couleur"] == i], node_color=[[r,v,b]]) plt.show() afficher_graphe_colore_vraies_couleurs(H, 4) # Exercice 2. Algorithme de Welsh-Powell # 1. Avec combien de couleurs l’algorithme glouton de l’exercice 1 colorie-t-il l’arbre de la # figure ci-dessus (avec l’ordre donn ́e par les num ́eros) ? Et l’algorithme de Welsh-Powell # (en suivant l’ordre des degr ́es d ́ecroissants) ? Quel est le nombre optimal de couleurs ? # 4 # Pour welshpowell c'est 2 differents # 2. Coder une fonction prochain sommet WP(G) qui, ́etant donn ́e un graphe partiellement # color ́e, renvoie le prochain sommet color ́e par l’algorithme de Welsh-Powell (de degr ́e # maximum parmi les non-colori ́es). def prochain_sommet_WP(G): degre_max = 0 sommet_max = None for s in G.nodes: if G.nodes[s]["couleur"] == 0 and G.degree[s] > degre_max: degre_max = G.degree[s] sommet_max = s return sommet_max print(prochain_sommet_WP(H)) QwwwWWWWW