我有点坐标(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)
我需要在特定的节点对之间构建一个最短路径的表。大多数边缘都是不可能的。
我找到了覆盖图的所有顶点的最小生成树(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
感谢。
答案 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