我正在创建一个圆形晶格图并考虑其相应的完整图。 我将完整图中不在晶格图中的边称为"非晶格"边。 现在,我想从晶格中选择要删除的若干条边,然后我想从非晶格边中添加一些随机选择的边以创建一个新图形。 这是一个小例子,你会看到它在哪里分解(最后一行(。 基本上,我在边缘列表是序列时遇到了麻烦。 此外,如果我可以做到这一点而不必命名所有更好的节点 - 最终,我将拥有大图! 这是我当前的代码:
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
向新图形添加边时,不能引用一个图形中的节点。您需要按名称提供成对向量才能添加新边。像这样的东西
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)