按一定条件生成随机图 [英] Generating Random Graphs According to Some Conditions

查看:16
本文介绍了按一定条件生成随机图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

考虑以下几点:1、2、3、4、5、6、7、8、9、10

我可以用这些数字制作一个有向随机图:

library(igraph)

from = sample(1:10, 10, replace=FALSE)
to = sample(1:10, 10, replace=FALSE)

graph_data = data.frame(from,to)

graph_data$id = as.factor(1:10)


graph <- graph.data.frame(graph_data, directed=T)

graph = simplify(graph)

V(graph)$color <- ifelse(graph_data$id == 1, "red", "orange")
    
plot(graph, layout=layout.circle, edge.arrow.size = 0.2)

我想对上面的图表进行更改(即条件),以便:

  • 没有隔离的节点(例如,节点#6是隔离的)
  • 每个节点只能有";传入边和";传出边(即,如果您位于此图中的某个节点上,如果您一直沿着箭头前进,则最终将访问其他&q;节点&q;一次,并最终返回到您开始的&q;节点)
  • 最后一个节点(即最后一行的";to";列中的";节点)始终连接到";第一个节点(即第一行的";From";列中的";节点)

在这种情况下,这意味着:

  from to
1   9    4
2   8    2
3   2    1
4   3    7
5   6    6
6   1    5
7  10    3
8   5    9
9   4    8
10  7   10

需要添加附加行,以便";节点10";必须连接到";节点9";。

我可以手动完成此操作(例如graph_data[nrow(graph_data) + 1,] = c("10","9", "11", "orange)),但有人能告诉我如何将所有这些条件自动添加到正在生成的随机图中吗?

谢谢!

推荐答案

这应该可以解决您的问题

library(tidyverse)
library(igraph)


set.seed(123)
n=15
data = tibble(d = paste(1:n))

relations = tibble(
  from = sample(data$d),
  to = lead(from, default=from[1]),
)

graph = graph_from_data_frame(relations, directed=T, vertices = data) 

V(graph)$color <- ifelse(data$d == "1", "red", "orange")

plot(graph, layout=layout.circle, edge.arrow.size = 0.2)

更新%1

library(tidyverse)
library(igraph)


set.seed(123)
n=15
data = tibble(d = paste(1:n))

relations = tibble(
  from = sample(data$d),
  to = lead(from, default=from[1]),
)

graph = graph_from_data_frame(relations, directed=T, vertices = data) 

V(graph)$color <- ifelse(data$d == relations$from[1], "red", "orange")

plot(graph, layout=layout.circle, edge.arrow.size = 0.2)

给您

这篇关于按一定条件生成随机图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆