Объединение / удаление краев - PullRequest
0 голосов
/ 25 октября 2018

Я создаю круговой решеточный граф и рассматриваю соответствующий ему полный граф.Я называю ребра в полном графе, которые НЕ находятся в ребрах решетки графа "не решетки".Теперь я хочу выбрать количество ребер в решетке для удаления, а затем я хочу добавить несколько случайно выбранных ребер из нерешеточных ребер, чтобы создать НОВЫЙ граф.Вот небольшой пример, вы увидите, где он ломается (последняя строка).По сути, у меня проблемы с последовательностями краевых списков.Кроме того, если я могу сделать это без необходимости называть все узлы, которые были бы лучше - в конце концов, у меня будут большие графики!Вот мой текущий код:

n <- 5 #number of nodes
k <- 1 #number of neighbors for lattice connections

g <- make_lattice(length = n, dim = 1, nei = k, circular = TRUE) #lattice
V(g)$name <- letters[1:n]                 #name nodes
lat_e <- E(g)                             #lattice edges

g1 <- g                                   #make a copy
g1[V(g1), V(g1)] <- TRUE                  #add all possible edges
g1 <- simplify(g1)                        #remove loops
newe <- E(g1)   
non_lat_e <- difference(newe, olde)       #non lattice edges


n_switch <- 2                             #want to change 2 lattice edges to 
                                          non_lattice edges
e_rem <- sample(1:length(lat_e),n_switch)
e_add <- sample(1:length(non_lat_e), n_switch)

g <- delete_edges(g, lat_e[e_rem])       #delete lattice edges
g <- add.edges(g, non_lat_e[e_add])      #add non lattice edges. ERROR

1 Ответ

0 голосов
/ 27 октября 2018

Нельзя ссылаться на узлы из одного графа при добавлении ребер в новый граф.Вам нужно будет предоставить попарный вектор по имени, чтобы добавить новые ребра.Примерно так:

non_lattice_edges <- ends(g1, non_lat_e[e_add]) %>% 
  t() %>% 
  as.vector()

g <- add.edges(g, non_lattice_edges)

Если вы никогда не удаляете вектор, вам не нужно добавлять имена вершин, потому что индексы вершин останутся согласованными.Вот ваш код, но без названных вершин:

n <- 5 #number of nodes
k <- 1 #number of neighbors for lattice connections

g <- make_lattice(length = n, dim = 1, nei = k, circular = TRUE) #lattice

lat_e <- E(g)                             #lattice edges

g1 <- g                                   #make a copy
g1[V(g1), V(g1)] <- TRUE                  #add all possible edges
g1 <- simplify(g1)                        #remove loops
newe <- E(g1)   

non_lat_e <- difference(newe, lat_e)       #non lattice edges


n_switch <- 2                             
e_rem <- sample(1:length(lat_e),n_switch)
e_add <- sample(1:length(non_lat_e), n_switch)

g <- delete_edges(g, lat_e[e_rem])    #delete lattice edges


non_lattice_edges <- ends(g1, non_lat_e[e_add]) %>% 
  t() %>% 
  as.vector()

g <- add.edges(g, non_lattice_edges)
...