Supprimons les sommets qui remplissent les conditions du graphe défini dans le programme!
--Utiliser networkx
import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10])
G.add_edges_from([(1,2),(2,4),(3,2),(4,5),(6,10),(7,6),(8,6),(9,8),(10,8),(1,9),(8,1)])
#n=G.number_of_nodes()
#[Hauts du degré 0]Ou[Un sommet de degré 1 et le côté se connectant à ce sommet]Supprimer
for v in G:
#print(G.degree(v))
#print("v=",v)
G_deg=G.degree(v)
if G_deg==0 or G_deg==1:
G.remove_node(v)
#print("G_deg=",G_deg)
#Sortie graphique
nx.draw_networkx(G)
plt.show()
J'ai pensé que c'était bon et l'ai essayé.
Traceback (most recent call last):
File "kadai06d.py", line 10, in <module>
for v in G:
RuntimeError: dictionary changed size during iteration
Ce n'est pas simple. .. .. J'ai cherché en ligne pour trouver la cause.
Tout d'abord, la signification de l'erreur est ** "L'objet en cours d'itération ne peut pas être modifié" **.
En d'autres termes, cela signifie-t-il que vous ne pouvez pas supprimer en boucle avec for v in G:
?
Si je ne pouvais pas le supprimer à l'intérieur de for v in G
, je pensais que je listerais les sommets qui remplissent les conditions, puis les supprimerais tous à la fois à l'extérieur for v in G
.
import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10])
G.add_edges_from([(1,2),(2,4),(3,2),(4,5),(6,10),(7,6),(8,6),(9,8),(10,8),(1,9),(8,1)])
node_be=G.number_of_nodes() #Nombre de sommets avant suppression
edge_be=G.number_of_edges() #Nombre de côtés avant suppression
#[Hauts du degré 0]Ou[Un sommet de degré 1 et le côté se connectant à ce sommet]Supprimer
G_rem=[]
#Lister les sommets qui remplissent les conditions
for v in G:
G_deg=G.degree(v)
#print("G_deg[",v,"]=",G_deg)
if G_deg<=1:
#print("v=",v)
G_rem.append(v)
#Supprimer les sommets qui remplissent les conditions
G.remove_nodes_from(G_rem)
node_af=G.number_of_nodes() #Nombre de sommets après suppression
edge_af=G.number_of_edges() #Nombre de faces après suppression
#Sortie graphique
nx.draw_networkx(G)
plt.show()
J'ai essayé de l'exécuter avec ça.
\\ Il y a encore des sommets de degré 1 ///
Juste en regardant for v in G:
une fois, il semble que v
devient de plus en plus grand et même si l'ordre devient 1, il passe. En d'autres termes, vous devez regarder en arrière encore et encore, pas une fois et à la fin!
J'ai décidé de faire une double boucle pour répéter for v in G:
plusieurs fois.
Essayez de tourner for
plusieurs fois pour le nombre de sommets.
import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10])
G.add_edges_from([(1,2),(2,4),(3,2),(4,5),(6,10),(7,6),(8,6),(9,8),(10,8),(1,9),(8,1)])
node_be=G.number_of_nodes() #Nombre de sommets avant suppression
edge_be=G.number_of_edges() #Nombre de côtés avant suppression
#[Hauts du degré 0]Ou[Un sommet de degré 1 et le côté se connectant à ce sommet]Supprimer
G_rem=[]
#Lister les sommets qui remplissent les conditions
for i in range(node_be):
for v in G:
G_deg=G.degree(v)
#print("G_deg[",v,"]=",G_deg)
if G_deg<=1:
#print("v=",v)
G_rem.append(v)
#Supprimer les sommets qui remplissent les conditions
G.remove_nodes_from(G_rem)
node_af=G.number_of_nodes() #Nombre de sommets après suppression
edge_af=G.number_of_edges() #Nombre de faces après suppression
#Sortie graphique
nx.draw_networkx(G)
plt.savefig("output.png ")
plt.show()
Le pic du 1er ordre est parti!
J'ai trouvé que je ne pouvais pas facilement supprimer un sommet sans passer par différentes étapes. Merci jusqu'à la fin.
Recommended Posts