2012-04-07 12 views
1

Ich habe versucht, den Code in Python zu schreiben IGRAPH verwenden und als ich versuchte, Kanten hinzufügen, um eine while-Schleife dieser Fehler kamkann nicht hinzugefügt Kanten, Invalid Vertex-ID in IGRAPH

while(i<k) 
    g.add_vertices(theInts[i]) 
    i=i+1 
    g.add_edges([(theInts[i-1],theInts[i])]) 

Ich dachte, dass Indizierung könnte sei ein Problem, also habe ich auch eine if-Anweisung hinzugefügt, aber das scheint nicht das Problem zu sein.

Bitte Hilfe !!!

+0

Was sind die Werte von "i" und "k" vor dem Eintritt in die Schleife? – Mahesh

Antwort

4

Ich denke, das hängt davon ab, was g für Vertices hat. Wenn Sie mit einem leeren g beginnen, haben Sie nur den Vertex 0, also wenn Sie versuchen, add_edges mit zwei verschiedenen Vertices aufzurufen, wird es einfach nicht funktionieren. Sie müssen einige weitere Eckpunkte hinzufügen. Natürlich hängt das alles davon ab, wie Ihr Graph vor der Schleife aussieht und was i ist.

Sie können einige kurze Informationen zu Ihrem Diagramm mit print anzeigen. Zum Beispiel

>>> import igraph 
>>> graph = igraph.Graph() 
>>> print graph 
Undirected graph (|V| = 1, |E| = 0) 

Wenn i beginnt bei 0, dann fügen Sie keine Ecken mit Schleife um das erste Mal. Wenn Sie also versuchen, Kanten hinzuzufügen, versuchen Sie, Scheitelpunkte hinzuzufügen, die nicht existieren.

>>> graph.add_vertices(0) 
<igraph.Graph object at 0xcea850> 
>>> print graph 
Undirected graph (|V| = 1, |E| = 0) 
>>> graph.add_edges([(0, 1)]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
igraph.core.InternalError: Error at type_indexededgelist.c:245: cannot add edges, Invalid vertex id 

Wenn das nicht das Problem ist, versuchen Sie, die Kanten zu drucken und zu sehen, ob sie mit dem übereinstimmen, was Sie wollen.

>>> graph.add_vertices(5) 
<igraph.Graph object at 0xcea850> 
>>> print graph 
Undirected graph (|V| = 6, |E| = 3) 
>>> graph.add_edges([(1, 1), (2, 3), (3, 5)]) 
<igraph.Graph object at 0xcea850> 
>>> graph.get_edgelist() 
[(1, 1), (2, 3), (3, 5)] 

Auch könnte es ein bisschen hilfreicher sein, die komplette TraceBack zu haben.

EDIT: Basierend auf Ihren Kommentar

Sie sind also sagen Sie eine Struktur wie dieses:

>>> graph = igraph.Graph() 
>>> print graph 
Undirected graph (|V| = 1, |E| = 0) 

Und Sie wollen 2 nur Vertex hinzufügen? Ich bin mir nicht sicher, dass du das mit dem igraph machen kannst. Es scheint, dass jeder Scheitelpunkt in Ordnung sein muss. Sie können überprüfen, ob Sie den Scheitelpunkt haben, und sie dann bei Bedarf hinzufügen. Denken Sie daran, dass diese Diagramme 0-basiert sind. Etwas wie das.

>>> vertices = 1, 2, 13, 4, 21, 5 
>>> map_graph = igraph.Graph() 
>>> print map_graph 
Undirected graph (|V| = 1, |E| = 0) 
>>> map_graph.add_vertices(max(vertices)) 
<igraph.Graph object at 0xceaa50> 
>>> print map_graph 
Undirected graph (|V| = 22, |E| = 0) 
>>> map(map_graph.add_edges, zip(vertices, vertices[1:])) 
[<igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>] 
>>> print map_graph 
Undirected graph (|V| = 22, |E| = 5) 
>>> map_graph.get_edgelist() 
[(1, 2), (2, 13), (4, 13), (4, 21), (5, 21)] 

Oder wenn Sie Karten nicht mögen, können Sie es loopen.

>>> vertices = 1, 2, 13, 4, 21, 5 
>>> loop_graph = igraph.Graph() 
>>> print loop_graph 
Undirected graph (|V| = 1, |E| = 0) 
>>> loop_graph.add_vertices(max(vertices)) 
<igraph.Graph object at 0xcea950> 
>>> print loop_graph 
Undirected graph (|V| = 22, |E| = 0) 
>>> for pair in zip(vertices, vertices[1:]): 
...  loop_graph.add_edges(pair) 
... 
<igraph.Graph object at 0xcea950> 
<igraph.Graph object at 0xcea950> 
<igraph.Graph object at 0xcea950> 
<igraph.Graph object at 0xcea950> 
<igraph.Graph object at 0xcea950> 
>>> print loop_graph 
Undirected graph (|V| = 22, |E| = 5) 
>>> loop_graph.get_edgelist() 
[(1, 2), (2, 13), (4, 13), (4, 21), (5, 21)] 

Es gibt wahrscheinlich einen besseren Weg, dies zu tun. Wenn dies nicht das ist, was Sie suchen, bearbeiten Sie bitte Ihre ursprüngliche Frage mit mehr Details und einigen tatsächlichen Code.

+0

tatsächlich im tun g.add_vertices (vertice [i]), die mir nicht das richtige Ergebnis als wenn der Wert von vertice [i] = 2 dann gibt es 2 Ecken, aber was ich will, ist ein Scheitelpunkt von Name 2 hinzufügen Bitte helfen Sie hier! – Fyre

+0

@Fyre, ich bin mir nicht sicher, ob meine Bearbeitung Ihre Frage beantwortet. Vielleicht könnten Sie in Ihrer ursprünglichen Frage mehr Details angeben, wenn dies nicht der Fall ist. – confab

+0

Danke confab für Ihre Antwort. Aber was sage ich eigentlich, dass es möglich ist, eine Ecke namens 21 hinzuzufügen? In diesem Fall, wenn Sie 21 hinzugefügt haben, addierte es 21 zur vorherigen Anzahl von Scheitelpunkten, aber was ich tun möchte, ist 21 als Scheitelpunkt und die Gesamtzahl der Scheitelpunkte als nur 2. – Fyre

Verwandte Themen