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.

190 lines
5.7 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 #pour la gestion des graphes
import matplotlib.pyplot as plt #pour laffichage
#(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 dune 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 dune 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 dafficher 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 dune 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 lentr ́ee "4-0" vers un sommet s donn ́e (on peut r ́ep ́eter des cases). On affichera les cases parcourues lors de lexploration. Lors de lexploration du labyrinthe, on pourra se souvenir des sommets d ́ej`a parcourus. Un it ́erateur sur les voisins dun 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)))