2014-12-23 12 views
1

Я пытаюсь нарисовать полный график, используя igraph какого-либо произвольного размера. Затем я хочу обрезать количество соседних ребер, которые могут иметь каждая вершина. Как я могу это сделать?установка верхней границы смежных ребер вершин в igraph

В качестве примера, если у меня есть полный граф из 20 вершин, каждая вершина изначально будет иметь 19 смежных ребер. Теперь я хотел бы обрезать эти ребра так, чтобы каждая вершина имела не более 10 ребер.

EDIT

Ниже приведен текущий код, который я написал для этого. Он имеет тенденцию образовывать несвязные вершины и небольшой кластер связных вершин.

library(igraph) 
node_number = 20 
g=erdos.renyi.game(node_number, 1) 

testfun = function(g, maxVert, node_number){ 
    neighbor_nodes = NULL; delete_edge = NULL; delete_these = NULL 
    total_nodes = 1:node_number 

    for (i in 1:node_number){ 
    neighbor_nodes <- unlist(neighborhood(g, order = 1, nodes = total_nodes[i])) 
    neighbor_nodes[1] <- NA 
    neighbor_nodes <- neighbor_nodes[!is.na(neighbor_nodes)] 
    neighbor_nodes <- sample(neighbor_nodes, maxVert) 

    delete_edge <- which(total_nodes%in%neighbor_nodes == FALSE) 
    delete_edge <- which(delete_edge%in%total_nodes[i] == FALSE) 

    for (j in 1:length(delete_edge)){ 
     if (isTRUE(edgeFinder(g, total_nodes[i], delete_edge[j]))){ 
     g = delete.edges(g, E(g, P=c(i, delete_edge[j]))) 
     } 
    } 
    } 
    return(g) 
} 

edgeFinder = function(g, v1,v2){ 
    if (g[v1,v2] == 1){ 
    return(TRUE) 
    } else { return(FALSE) } 
} 

g2 = testfun(g, 10, node_number) 
+0

Я думаю, вам нужно предоставить дополнительную информацию. Например, существуют ли приоритеты, связанные с ребрами? Это нормально, если вы уменьшите ребра до менее 10 для некоторых вершин? Вам нужно оптимальное решение? Или эвристика достаточно? Вы также должны придумать собственную первоначальную идею о том, как решить проблему. Это будет означать, что вы сделали некоторые исследования. В настоящее время ваш вопрос кажется слишком широким. – honk

+0

@honk нет приоритетов, связанных с ребрами. Было бы идеально, если бы каждая вершина имела максимальное количество смежных ребер, которые вы могли бы установить самостоятельно. Я придумал свое решение, но он не работает так, как я хочу, поскольку он исчерпывает края большинства вершин, а некоторые остаются с краями. Я отредактирую свое сообщение, чтобы поделиться своим текущим кодом. – user3141121

ответ

2

Я смог решить это, используя следующий подход.

library(igraph)  

SetEdge = rep(10, 20) 
g=degree.sequence.game(SetEdge, method='vl')  
degree(g) 
[1] 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 

Теперь я рисую график из 20 вершин с 10 смежными краями. Проще, чем мой первоначальный подход ...