You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
3.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 quon 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 lalgorithme glouton de lexercice 1 colorie-t-il larbre de la
# figure ci-dessus (avec lordre donn ́e par les num ́eros) ? Et lalgorithme de Welsh-Powell
# (en suivant lordre 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 lalgorithme 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