Я думаю, что все это зависит от того, что 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.
EDIT: Основываясь на ваш комментарий
Так вы говорите, у вас есть структура вроде этого:
>>> 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)]
Возможно, это лучший способ сделать это. Если это не то, что вы ищете, пожалуйста, отредактируйте исходный вопрос с более подробной информацией и некоторым фактическим кодом.
Каковы значения 'i' и' k' перед входом в цикл? – Mahesh