|
|
import networkx as nx #pour la gestion des graphes
|
|
|
import matplotlib.pyplot as plt #pour l’affichage
|
|
|
#(on les renomme pour raccourcir le code)
|
|
|
|
|
|
# Exo 1
|
|
|
|
|
|
G1 = nx.Graph() #cr ́ee un graphe non-orient ́e vide
|
|
|
G1.add_edge(0,1) #ajoute une arˆete entre les sommets 0 et 1
|
|
|
G1.add_edges_from([(3,0),(3,4)]) #ajoute les arˆetes d’une liste donn ́ee
|
|
|
nx.add_path(G1,[1,2,3]) #ajoute les arˆetes du chemin 1-2-3
|
|
|
|
|
|
G1.add_node(6) #ajoute un sommet
|
|
|
G1.add_node("toto")
|
|
|
G1.add_edge("toto",6)
|
|
|
|
|
|
|
|
|
G1.remove_node(6) #Supprimez un sommet s de votre choix, puis r ́e-affichez le graphe.
|
|
|
print(G1.nodes)
|
|
|
print(G1.edges)
|
|
|
|
|
|
nx.draw(G1, with_labels=True, pos=nx.circular_layout(G1), node_color='r', edge_color='b')
|
|
|
# ou
|
|
|
# dico_positions = {0:(0,0),1:(1,0),2:(0,1),3:(1,1),4:(0,-1),6:(-1,-1),"toto":(0,-1)}
|
|
|
# nx.draw(G1, with_labels=True, pos=dico_positions)
|
|
|
|
|
|
# nx.draw(G1,with_labels=True) #on pr ́epare le dessin du graphe
|
|
|
|
|
|
plt.show() #on affiche le dessin
|
|
|
|
|
|
# Exo 2
|
|
|
|
|
|
H = nx.Graph() #cr ́ee un graphe non-orient ́e vide
|
|
|
|
|
|
H.add_edges_from([(1,2),(2,3),(3,4),(4,5),(5,2),(4,6),(1,5)]) #ajoute les arˆetes d’une liste donn ́ee
|
|
|
# nx.add_path(G1,[1,2,3,4,5,2]) #ajoute les arˆetes du chemin 1-2-3
|
|
|
|
|
|
nx.draw(H, with_labels=True, pos=nx.circular_layout(H), node_color='r', edge_color='b')
|
|
|
|
|
|
plt.show() #on affiche le dessin
|
|
|
|
|
|
# 2. Ecrire le code qui permet d’afficher les salles directement connect ́ees `a la salle 5, en utilisant la m ́ethode H.edges qui renvoie la liste des arˆetes de H. (Attention : une arˆete entre i et j peut ˆetre stock ́ee sous forme (i,j) ou (j,i).
|
|
|
|
|
|
def getArete(G, node):
|
|
|
aretes = G.edges
|
|
|
aretes = [arete for arete in aretes if node in arete]
|
|
|
return aretes
|
|
|
|
|
|
print(getArete(H, 5))
|
|
|
|
|
|
H.add_edge(3, 5)
|
|
|
|
|
|
print(getArete(H, 5))
|
|
|
|
|
|
# Exo 3
|
|
|
|
|
|
def nombre_sommets(G):
|
|
|
return len(G.nodes)
|
|
|
|
|
|
def nombre_aretes(G):
|
|
|
return len(G.edges)
|
|
|
|
|
|
def existe_arete(G, i, j): # renvoie si le couple i,j existe dans les aretes du graphe G
|
|
|
return (i, j) in G.edges or (j, i) in G.edges
|
|
|
|
|
|
def voisins(G,s): #renvoie la liste des voisins du sommet s grace à la methode existe_arete
|
|
|
return [i for i in G.nodes if existe_arete(G, s, i)]
|
|
|
|
|
|
def degre(G,s): # renvoie le degre (nombre de voisins) du sommet s
|
|
|
return len(voisins(G, s))
|
|
|
|
|
|
def degre_max(G): # renvoie le degre max du graphe G (celui qui à le plus de voisins)
|
|
|
return max([degre(G, s) for s in G.nodes])
|
|
|
|
|
|
def sommets_de_degre_max(G): # renvoie la liste des sommets de degre max du graphe G
|
|
|
return [s for s in G.nodes if degre(G, s) == degre_max(G)]
|
|
|
|
|
|
|
|
|
print(nombre_sommets(H))
|
|
|
print(nombre_aretes(H))
|
|
|
print(existe_arete(H, 1, 2))
|
|
|
print(voisins(H, 1))
|
|
|
print(degre(H, 1))
|
|
|
print(degre_max(H))
|
|
|
print(sommets_de_degre_max(H))
|
|
|
|
|
|
|
|
|
# Exo 4
|
|
|
|
|
|
GO = nx.DiGraph() #on cr ́ee un graphe orient ́e
|
|
|
GO.add_edge(0,1)
|
|
|
GO.add_edge(1,0)
|
|
|
GO.add_edge(1,2)
|
|
|
GO.add_edge(3,2)
|
|
|
GO.add_edge(3,1)
|
|
|
nx.draw(GO,with_labels=True) #on pr ́epare le dessin du graphe
|
|
|
plt.show() #on affiche le dessin
|
|
|
|
|
|
|
|
|
def existe_arc(G, i, j): # renvoie si le couple i,j existe dans les aretes du graphe G
|
|
|
return (i, j) in G.edges
|
|
|
|
|
|
def voisins_entrants(G,s): #renvoie la liste des voisins du sommet s grace à la methode existe_arete
|
|
|
return [i for i in G.nodes if existe_arc(G, i, s)]
|
|
|
|
|
|
def degre_entrant(G,s): # renvoie le degre (nombre de voisins) du sommet s
|
|
|
return len(voisins_entrants(G, s))
|
|
|
|
|
|
def est_source(G,s): #renvoie si le sommet s est une source
|
|
|
return degre_entrant(G, s) == 0
|
|
|
|
|
|
|
|
|
print(existe_arc(GO, 1, 2))
|
|
|
print(voisins_entrants(GO, 1))
|
|
|
print(degre_entrant(GO, 1))
|
|
|
print(est_source(GO, 1))
|
|
|
|
|
|
|
|
|
# Exo 6
|
|
|
|
|
|
F2 = nx.Graph() #cr ́ee un graphe non-orient ́e vide
|
|
|
F2.add_node("0-0")
|
|
|
F2.add_node("0-1")
|
|
|
F2.add_node("0-2")
|
|
|
F2.add_node("0-3")
|
|
|
F2.add_node("0-4")
|
|
|
F2.add_node("0-5")
|
|
|
F2.add_node("1-0")
|
|
|
F2.add_node("1-1")
|
|
|
F2.add_node("1-2")
|
|
|
F2.add_node("1-3")
|
|
|
F2.add_node("1-4")
|
|
|
F2.add_node("1-5")
|
|
|
F2.add_node("2-0")
|
|
|
F2.add_node("2-1")
|
|
|
F2.add_node("2-2")
|
|
|
F2.add_node("2-3")
|
|
|
F2.add_node("2-4")
|
|
|
F2.add_node("2-5")
|
|
|
F2.add_node("3-0")
|
|
|
F2.add_node("3-1")
|
|
|
F2.add_node("3-2")
|
|
|
F2.add_node("3-3")
|
|
|
F2.add_node("3-4")
|
|
|
F2.add_node("3-5")
|
|
|
F2.add_node("4-0")
|
|
|
F2.add_node("4-1")
|
|
|
F2.add_node("4-2")
|
|
|
F2.add_node("4-3")
|
|
|
F2.add_node("4-4")
|
|
|
F2.add_node("4-5")
|
|
|
|
|
|
nx.add_path(F2,["1-0", "0-0", "0-1", "1-1", "1-2", "0-2", "0-3", "0-4"]) #ajoute les arˆetes du chemin
|
|
|
nx.add_path(F2,["1-2", "1-3", "1-4"])
|
|
|
nx.add_path(F2,["1-3", "2-3", "2-2", "2-1", "3-1", "3-0", "2-0"])
|
|
|
nx.add_path(F2,["2-2", "3-2", "3-3"])
|
|
|
nx.add_path(F2,["3-2", "4-2", "4-1", "4-0"])
|
|
|
nx.add_path(F2,["4-2", "4-3", "4-4", "3-4", "2-4", "2-5", "1-5", "0-5"])
|
|
|
nx.add_path(F2,["2-5", "3-5", "4-5"])
|
|
|
|
|
|
# nx.add_path(F2,["1-0", "1-2", "0-4"])
|
|
|
# nx.add_path(F2,["1-2", "1-3", "1-4"])
|
|
|
# nx.add_path(F2,["1-3", "2-2", "2-0"])
|
|
|
# nx.add_path(F2,["2-2", "3-2", "3-3"])
|
|
|
# nx.add_path(F2,["3-2", "4-2", "4-0"])
|
|
|
# nx.add_path(F2,["4-2", "2-5", "0-5"])
|
|
|
# nx.add_path(F2,["2-5", "4-5"])
|
|
|
# F2.add_edges_from([(3,0),(3,4)]) #ajoute les arˆetes d’une liste donn ́ee
|
|
|
|
|
|
# dico_positions = {0:(0,0),1:(1,0),2:(0,1),3:(1,1),4:(0,-1),6:(-1,-1),"toto":(0,-1)}
|
|
|
|
|
|
nx.draw(F2, with_labels=True)
|
|
|
|
|
|
plt.show() #on affiche le dessin
|
|
|
|
|
|
# c'est un arbre donc un seu chemin possible
|
|
|
|
|
|
# Coder une fonction chemin(s) qui trouve un chemin depuis l’entr ́ee "4-0" vers un sommet s donn ́e (on peut r ́ep ́eter des cases). On affichera les cases parcourues lors de l’exploration. Lors de l’exploration du labyrinthe, on pourra se souvenir des sommets d ́ej`a parcourus. Un it ́erateur sur les voisins d’un sommet s est donn ́e par G.neighbors(s) (on obtient la liste des voisins avec list(G.neighbors(s))).
|
|
|
|
|
|
def chemin(arrivee):
|
|
|
L = []
|
|
|
L.append(arrivee)
|
|
|
while arrivee != (4,0):
|
|
|
for i in voisins(F2,arrivee):
|
|
|
if(existe_arete(F2,arrivee,i)):
|
|
|
arrivee = i
|
|
|
L.append(arrivee)
|
|
|
L.reverse()
|
|
|
return L
|
|
|
|
|
|
print(chemin((4,1))) |