如何在最小生成树(R)中重新连接边?

时间:2016-01-30 12:53:48

标签: r graph-algorithm igraph minimum-spanning-tree

我有点坐标(file .csv)。我已经读取了数据并计算了所有点对之间的距离,然后根据邻接矩阵创建了空间化图。 它是无向的,正边缘权重的完整图。

library(igraph)

df0 <- read.csv(file="vpoints.csv", header=TRUE, sep=",")
n <- nrow(df0)
d <- matrix(0, n, n) 
## Find a distance between all nodes
for (i in 1:n) {
 for (j in 1:n) {
        d[i,j] = ((df0$cx[i] - df0$cx[j])^2 + 
             (df0$cy[i] - df0$cy[j])^2 )^(1/2) 
   }# forj 
} #for_i

g1 <- graph.adjacency(d, weighted=TRUE, mode="undirected")
V(g1)$name <- gsub("path","", df0$from)

## Find a minimum spanning tree
mst <- minimum.spanning.tree(g1)

mylayout<-as.matrix(cbind(df0$cx,df0$cy))
plot(mst, layout=mylayout, 
           vertex.label.cex=.5, 
           edge.label=round(E(g1)$weight,0),
           edge.label.cex=.5)

我需要在特定的节点对之间构建一个最短路径的表。大多数边缘都是不可能的。

minimum spanning tree

我找到了覆盖图的所有顶点的最小生成树(MST)。但是这棵树包括一些不可能的边缘,并且省略了一些可靠的边缘。

有人可以帮助我如何重新连接边缘?

在第一种情况下,我需要重新连接边缘的一端(从节点“4048”到节点“4016”)。在第二种情况下,我需要删除节点“4020”和节点“4024”之间的egde,并在节点“4018”和节点“4022”之间添加边缘。

更新: 1)我认为在我的本地任务中,我可以在创建图形模型之前将节点集拆分为两个独立的集合。然后我可以应用算法(Prim的算法作为默认算法),以便在第一组节点上找到MST。最后,我可以使用for循环将第二组中的节点连接到MST。我这样的方法我需要为节点分配一个新的二进制属性(例如,“0” - 第一组,“1” - 第二组)。第一组是中间节点集,第二组包括端点节点。终点节点与MST的连接标准是从终点节点到树中节点的欧几里德距离的最小值。

2)另一个想法是:分析从节点“А”移动到节点“В”的机会,并设置距离d [i,j] = 0,否则计算d [i,j]

## Find a distance between nodes
for (i in 1:n) {
 for (j in 1:n) {
 # if (impossible) then d[i,j]=0  else
        d[i,j] = ((df0$cx[i] - df0$cx[j])^2 + 
             (df0$cy[i] - df0$cy[j])^2 )^(1/2) 
  }# forj 
} #for_i

感谢。

1 个答案:

答案 0 :(得分:0)

我已经应用了第一和第二个想法的组合。为每个节点添加了二进制类别(0/1):0 - 中间节点,1 - 端点节点。然后距离d [i,j]被置于最大值。

max_distance <- max(w, h) # (w)width, (h)eight of image
for (i in 1:n) {
 for (j in 1:n) {
     # the edge between node (i) and (j) is impossible
     if (df0$category[i] == 1 & df0$category[j] == 1) {
             d[i,j]= max_distance
     }
     else {
               d[i,j] = ((df0$cx[i] - df0$cx[j])^2 + 
                       (df0$cy[i] - df0$cy[j])^2 )^(1/2) 
     }
  }# forj 
} #for_i