Невозможно добавить ребра, неверный идентификатор вершины в IGraph

Я пытался написать код на python, используя igraph, и когда я попытался добавить ребра, используя цикл while, возникла эта ошибка.

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

Я думал, что индексация может быть проблемой, поэтому я также включил оператор if, но это не проблема.

Пожалуйста помоги!!!


person Fyre    schedule 07.04.2012    source источник
comment
Каковы значения i и k перед входом в цикл?   -  person Mahesh    schedule 07.04.2012


Ответы (1)


Я думаю, что все это зависит от того, что 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
comment
на самом деле я делаю g.add_vertices(vertice[i]), что не дает мне правильного результата, так как когда значение vertice[i]=2, тогда оно добавляет 2 вершины, но я хочу добавить вершину с именем 2. Пожалуйста, помогите с этим! - person Fyre; 07.04.2012
comment
@Fyre, я не уверен, что мое редактирование отвечает на ваш вопрос. Возможно, вы могли бы предоставить более подробную информацию в своем первоначальном вопросе, если это не так. - person confab; 08.04.2012
comment
Спасибо конфе за ответ. Но что я на самом деле говорю, можно ли добавить вершину с именем 21? В этом случае, когда вы добавили 21, он добавил 21 к предыдущему количеству вершин, но я хочу сделать 21 вершиной, а общее количество вершин - всего 2. - person Fyre; 08.04.2012
comment
igraph идентифицирует вершины по номерам от нуля до N-1, где N — количество вершин. Имена могут быть присоединены к вершинам как атрибуты вершин после их добавления; например, вы можете сказать graph.vs[2]["name"] = "spam", чтобы присвоить имя "spam" вершине с id=2. Или вы можете сказать: graph.add_vertices(1); graph.vs[0]["name"] = "21", чтобы добавить одну вершину в пустой граф, а затем назвать ее 21, но позже вам придется ссылаться на нее по ее идентификатору, а не по имени (если только вы не поддерживаете словарь, отображающий имена вершин). вернуться к идентификаторам). - person Tamás; 08.04.2012
comment
Есть ли способ узнать, какое ребро содержит какую вершину, например, я пытаюсь обнаружить циклы в своем графе, и я хочу увидеть, содержит ли это конкретное ребро 2 заданные вершины, чтобы я мог раскрасить их и показать по-другому. Спасибо - person Fyre; 09.04.2012