2012-04-07 6 views
1

Я пытался написать код в Python с использованием igraph и когда я пытался добавить края, используя время цикла пришла данная ошибкаНевозможно добавить ребра, Invalid вершина ID в IGraph

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

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

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

+0

Каковы значения 'i' и' k' перед входом в цикл? – Mahesh

ответ

4

Я думаю, что все это зависит от того, что 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)] 

Возможно, это лучший способ сделать это. Если это не то, что вы ищете, пожалуйста, отредактируйте исходный вопрос с более подробной информацией и некоторым фактическим кодом.

+0

Фактически im делает g.add_vertices (vertice [i]), который не дает мне правильный результат, как когда значение vertice [i] = 2, то оно добавляет 2 вершины, но я хочу добавить вершину имени 2 Пожалуйста, помогите с этим! – Fyre

+0

@Fyre, я не уверен, что мое редактирование отвечает на ваш вопрос. Возможно, вы могли бы предоставить более подробную информацию в своем исходном вопросе, если это не так. – confab

+0

Спасибо за ваш ответ. Но что я на самом деле говорю, что можно добавить вершину с именем 21? В этом случае, когда вы добавили 21, оно добавило 21 к предыдущему числу вершин, но то, что я хочу сделать, составляет 21 как вершину и общее количество вершин, как только 2. – Fyre