Я думаю, что все это зависит от того, что g
имеет для вершин. Если вы начинаете с пустого g
, у вас будет только вершина 0
, поэтому, если вы попытаетесь вызвать add_edges
с двумя разными вершинами, это просто не сработает. Вы должны добавить еще несколько вершин. Конечно, все это зависит от того, как выглядит ваш график до цикла и что такое i
.
Вы можете отобразить краткую информацию о вашем графике с помощью print
. Например,
>>> import igraph
>>> graph = igraph.Graph()
>>> print graph
Undirected graph (|V| = 1, |E| = 0)
Если i
начинается с 0, то вы не добавите никаких вершин с помощью цикла в первый раз. Поэтому, когда вы пытаетесь добавить ребра, вы пытаетесь добавить несуществующие вершины.
>>> 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
Если это не проблема, попробуйте распечатать края и посмотреть, совпадают ли они с тем, что вы хотите.
>>> 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)]
Кроме того, может быть немного полезнее иметь полный TraceBack.
РЕДАКТИРОВАТЬ: на основе вашего комментария
Итак, вы говорите, что у вас есть такая структура:
>>> graph = igraph.Graph()
>>> print graph
Undirected graph (|V| = 1, |E| = 0)
И вы хотите добавить только вершину 2? Я не уверен, что вы можете сделать это с igraph. Кажется, что каждая вершина должна быть в порядке. Вы можете проверить, есть ли у вас вершина, а затем добавить их, если необходимо, помня, что эти графы основаны на 0. Что-то вроде этого.
>>> 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)]
Или, если вам не нравятся карты, вы можете зациклить их.
>>> 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)]
Хотя, вероятно, есть лучший способ сделать это. Если это не то, что вы ищете, отредактируйте исходный вопрос, указав более подробную информацию и некоторый фактический код.
person
confab
schedule
07.04.2012
i
иk
перед входом в цикл? - person Mahesh   schedule 07.04.2012