【问题标题】:Shortest path function returns a wrong path in R igraph最短路径函数在 R igraph 中返回错误路径
【发布时间】:2019-08-20 21:37:42
【问题描述】:

我使用get.shortest.paths 方法来找到两个顶点之间的最短路径。然而,奇怪的事情正在发生。在收到评论后,我正在更改整个问题正文。我用g <- sample_smallworld(1, 20, 5, 0.1) 制作了我的图表,这里是邻接列表。

*Vertices 20
*Edges
1 2 0
2 3 0
3 4 0
4 5 0
5 6 0
6 7 0
7 8 0
8 9 0
9 10 0
10 11 0
11 12 0
12 13 0
13 14 0
14 15 0
6 15 0
16 17 0
17 18 0
18 19 0
19 20 0
1 20 0
1 11 0
1 19 0
1 4 0
1 18 0
1 5 0
1 17 0
6 17 0
15 16 0
2 20 0
2 4 0
2 19 0
2 5 0
2 18 0
2 9 0
2 17 0
2 13 0
3 5 0
3 20 0
3 6 0
3 19 0
3 7 0
3 18 0
3 8 0
4 6 0
4 7 0
4 20 0
4 8 0
5 19 0
4 9 0
5 7 0
5 8 0
5 9 0
5 20 0
5 10 0
6 8 0
6 9 0
6 10 0
6 11 0
7 9 0
7 10 0
7 11 0
7 12 0
1 10 0
8 11 0
1 12 0
8 13 0
9 11 0
9 12 0
9 13 0
7 14 0
12 19 0
10 13 0
10 14 0
10 15 0
11 13 0
11 14 0
11 15 0
4 16 0
12 14 0
9 15 0
12 16 0
12 17 0
13 15 0
13 16 0
13 17 0
13 18 0
14 16 0
14 17 0
14 18 0
14 19 0
15 17 0
15 18 0
15 19 0
1 15 0
16 18 0
16 19 0
9 20 0
17 19 0
17 20 0
10 18 0

报告的 7 和 2 之间的最短路径是:

> get.shortest.paths(g,7,2)
$vpath
$vpath[[1]]
+ 4/20 vertices, from c915453:
[1]  7 14 19  2

这里是节点 7 和节点 2 的相邻节点:

> unlist(neighborhood(g, 1, 7, mode="out")) 
 [1]  7  3  4  5  6  8  9 10 11 12 14
> unlist(neighborhood(g, 1, 2, mode="out")) 
 [1]  2  1  3  4  5  9 13 17 18 19 20

如您所见,我可以从 7 到 3 和从 3 到 2。看起来有一条更短的路径。我可能会错过什么?

【问题讨论】:

  • 不幸的是,您的示例不可重现。 sample_smallworld 有一个随机组件,并且您在运行它之前没有设置 random.seed,因此我们无法获得与您完全相同的图表。 也不能。您在无向图上使用mode="out" 计算邻居也有点奇怪。
  • @G5W 好的,我现在分享由sample_smallworld 生成的邻接列表。我仍然有同样的问题。
  • 在@G5W 已经提到的限制下:您可以尝试将边缘权重设置为 1 而不是 0,看看会发生什么。我的猜测是,边缘权重为零会干扰计算,并可能导致随机性。 (虽然,我可能完全错了)
  • @BenNutzer 这是我最初的想法。在这篇文章 (stackoverflow.com/questions/57577735/…) 的评论部分,我询问了如何摆脱权重,但 E(g)$weight <- NULLg <- delete_edge_attr(g, “weight”) 都不起作用。我收到不同的错误。
  • delete_edge_attr 为我工作。使用以下引号之一:"weight"'weight',而不是 “weight”。也可以用1 覆盖它(奇怪的是不能用NA)。

标签: r igraph shortest-path


【解决方案1】:

是的,问题是您的边权重为零。查看帮助页面?shortest_paths

权重
可能是一个给出边权重的数值向量。如果这是 NULL 且图有权重边属性,则该属性为 用过的。如果这是 NA 则不使用权重(即使图形有 权重属性)。

请注意weights=NULL 是默认值,因此将使用权重。因此,返回的路径的权重为零 - 与您想要获得的路径相同。 加权距离是相同的。如果您想找到跳数最少的路径,请关闭使用权重,如下所示:

get.shortest.paths(g,7,2, weights=NA)$vpath

【讨论】:

  • 是的,没错。出于某种原因,如果边缘权重为零,则该方法会做一些我无法弄清楚的事情。另一种解决方案可能是g <- delete_edge_attr(g, "weight"),然后使用get.shortest.paths
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多