Löschen wir die Eckpunkte, die die Bedingungen erfüllen, aus dem im Programm definierten Diagramm!
--Verwenden Sie networkx --Graphen werden im Programm definiert -Löschen Sie [Verse mit der Reihenfolge 0] oder [Verse mit der Reihenfolge 1 und den mit diesen Eckpunkten verbundenen Kanten].
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()
#[Spitzen des Grades 0]Oder[Ein Scheitelpunkt vom Grad 1 und die Seite, die mit diesem Scheitelpunkt verbunden ist]Löschen
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)
#Grafikausgabe
nx.draw_networkx(G)
plt.show()
Ich fand es gut und versuchte es.
Traceback (most recent call last):
File "kadai06d.py", line 10, in <module>
for v in G:
RuntimeError: dictionary changed size during iteration
Es ist nicht einfach. .. .. Ich habe online gesucht, um die Ursache zu finden.
Zuallererst ist die Bedeutung des Fehlers ** "Das iterierende Objekt kann nicht geändert werden" **.
Mit anderen Worten, bedeutet dies, dass Sie nicht löschen können, während Sie mit for v in G:
eine Schleife ausführen?
Wenn ich es nicht innerhalb von "für v in G" löschen könnte, dachte ich, ich würde die Eckpunkte auflisten, die die Bedingungen erfüllen, und sie dann alle auf einmal außerhalb von "für v in G" löschen.
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() #Anzahl der Eckpunkte vor dem Löschen
edge_be=G.number_of_edges() #Anzahl der Seiten vor dem Löschen
#[Spitzen des Grades 0]Oder[Ein Scheitelpunkt vom Grad 1 und die Seite, die mit diesem Scheitelpunkt verbunden ist]Löschen
G_rem=[]
#Listen Sie die Eckpunkte auf, die die Bedingungen erfüllen
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)
#Löschen Sie die Eckpunkte, die die Bedingungen erfüllen
G.remove_nodes_from(G_rem)
node_af=G.number_of_nodes() #Anzahl der Eckpunkte nach dem Löschen
edge_af=G.number_of_edges() #Anzahl der Seiten nach dem Löschen
#Grafikausgabe
nx.draw_networkx(G)
plt.show()
Ich habe versucht, es damit zu betreiben.
\\ Es gibt noch Eckpunkte vom Grad 1 ///
Wenn man einmal "für v in G:" betrachtet, scheint es, dass "v" immer größer wird, und selbst wenn die Reihenfolge 1 wird, geht es durch. Mit anderen Worten, Sie müssen immer wieder zurückblicken, nicht einmal und am Ende!
Ich entschied mich für eine Doppelschleife, um für v in G:
viele Male zu wiederholen.
Versuchen Sie, für die Anzahl der Scheitelpunkte mehrmals "für" zu drehen.
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() #Anzahl der Eckpunkte vor dem Löschen
edge_be=G.number_of_edges() #Anzahl der Seiten vor dem Löschen
#[Spitzen des Grades 0]Oder[Ein Scheitelpunkt vom Grad 1 und die Seite, die mit diesem Scheitelpunkt verbunden ist]Löschen
G_rem=[]
#Listen Sie die Eckpunkte auf, die die Bedingungen erfüllen
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)
#Löschen Sie die Eckpunkte, die die Bedingungen erfüllen
G.remove_nodes_from(G_rem)
node_af=G.number_of_nodes() #Anzahl der Eckpunkte nach dem Löschen
edge_af=G.number_of_edges() #Anzahl der Seiten nach dem Löschen
#Grafikausgabe
nx.draw_networkx(G)
plt.savefig("output.png ")
plt.show()
Der Peak 1. Ordnung ist weg!
Ich stellte fest, dass ich einen Scheitelpunkt nicht einfach löschen konnte, ohne verschiedene Schritte durchlaufen zu haben. Danke bis zum Ende.
Recommended Posts