如何使用R找到有向图中两个顶点之间的时间

时间:2014-03-26 20:10:06

标签: r graph igraph

我正试图解决一个关于电话模拟的非常直接的问题。我可以只引入所有数据并编写一个非常冗长和混乱的代码,但我正在尝试使用图形来解决它,也许是R上的“igraph”包(或类似的东西),但我以前从未使用它。

为了简单起见,我想打电话从纽约到莫斯科并到达莫斯科,信号可以通过不同概率的3个城市:

  • 电话将以0.2概率
  • 通过伦敦
  • 巴黎概率为0.3
  • 柏林0.5概率

信号在城市之间传播的时间遵循正态分布。为简单起见,请说所有时间都遵循标准的正态分布。因此,例如,该标志使用0.2分钟从伦敦前往莫斯科。

所以,我有这样的想法:

http://i.imgur.com/X4WnyxO.jpg

边缘上的数字是信号将遵循该路径的概率。

现在,我必须多次模拟信号的行程,并说出从纽约到莫斯科所需的平均时间。

我的问题是如何编程这个问题,因为我不知道如何在边缘上获得两个权重,而且我不知道如何遍历顶点。

你能给我的任何建议都会非常有帮助。

1 个答案:

答案 0 :(得分:0)

一种方法是使用蒙特卡罗模拟。下面的示例只是为了让您入门。

假设您有三个城市,L,P和B.呼叫路由分别为(0.2,0.3,0.5)。呼叫通过给定城市所花费的时间通常是均值分布,取决于城市,标准差= 1(例如,毫秒)。在这个例子中,我将L,P,B的平均时间分别定义为(30 ms,20 ms,10 ms)。这就是关于定义穿越城市所需时间的评论意味着什么。

然后,我们使用下面的代码执行模拟。

Monte.Carlo <- function(df) {
  set.seed(1)
  path   <- sample(df$cities, 1000, p=c(0.2,0.3,0.5), replace=T)
  mu     <- df[match(path,df$cities),]$t.mean
  time   <- sapply(mu,function(mu)rnorm(1,mu))
}
par(mfrow=c(3,1))
cities <- c("L","P","B")
t.mean <- c(30,20,10)
df     <- data.frame(cities,t.mean)
hist(Monte.Carlo(df), breaks=50, xlim=c(5,35),main="(L,P,B)=(30,20,10)")
t.mean <- c(25,20,15)
df     <- data.frame(cities,t.mean)
hist(Monte.Carlo(df), breaks=50, xlim=c(5,35), main="(L,P,B)=(25,20,15)")
t.mean <- c(22,20,18)
df     <- data.frame(cities,t.mean)
hist(Monte.Carlo(df), breaks=50, xlim=c(5,35), main="(L,P,B)=(22,20,18)")

模拟过程如下:

  1. 定义一个path向量,指示对于1000个呼叫中的每个呼叫,呼叫路由到哪个城市。这是“L”,“P”或“B”的随机向量,其中概率在问题陈述中给出。
  2. 使用df中的定义将城市“名称”映射为时间。
  3. 对于path中的每次调用,将路由时间计算为具有适当均值的正态分布中的单个随机样本。
  4. 然后,我们使用不同的平均路由时间定义运行模拟三次。请注意,在第一种情况下,大多数调用大约需要10毫秒。这是因为,根据我们的定义,通过B(erlin)的路由平均需要10ms,平均有50%的呼叫通过柏林。