Matlab 使用附加顶点更新测地距离矩阵

Matlab 使用附加顶点更新测地距离矩阵,matlab,graph,distance,shortest-path,Matlab,Graph,Distance,Shortest Path,我有一个为局部无向图计算的测地偏差矩阵,我想用一些添加的顶点来更新这个矩阵。有没有办法在不进行每个点的全部计算的情况下包含顶点 更详细地说,我确实为添加的顶点估计邻接加权矩阵,并重新执行最短路径算法,例如Dijkstra和Floyd Warshall算法。如果有什么错误或遗漏,请纠正我 感谢您提供的任何线索和建议…您无需再次计算所有路径,只需使用新顶点更新距离矩阵即可 设n为新顶点。首先,需要计算穿过每个中间顶点k的每个顶点1..(n-1)和n之间的距离(在matlab ish伪代码中): 如您

我有一个为局部无向图计算的测地偏差矩阵,我想用一些添加的顶点来更新这个矩阵。有没有办法在不进行每个点的全部计算的情况下包含顶点

更详细地说,我确实为添加的顶点估计邻接加权矩阵,并重新执行最短路径算法,例如Dijkstra和Floyd Warshall算法。如果有什么错误或遗漏,请纠正我


感谢您提供的任何线索和建议…

您无需再次计算所有路径,只需使用新顶点更新距离矩阵即可

n
为新顶点。首先,需要计算穿过每个中间顶点
k
的每个顶点
1..(n-1)
n
之间的距离(在matlab ish伪代码中):


如您所见,我们每次都从原始Floyd Warshall算法中删除一个循环,因此我们的时间复杂度是
O(|V^2 |)
,而不是
O(|V^3 |)
,用于重新执行整个算法。

这是@biker提到的我的代码

//%% function to update geodesic distance matrix with new adjancy matrix  
function Dgwaug = updateGeoDis(W,Dgw)  
//% W: weighted adjancy matrix  
//% Dgw : current geodesics-distance matrix  

nmX = length(Dgw); //% number of vertices in the current graph  
nmXaug = length(W); //% number of vertices in the augmented graph  
nmXnew = nmXaug - nmX; //% number of new vertices to be included

//% initialize the distance matrix for augmented graph
Dgwaug = W;  
Dgwaug(1:nmX,1:nmX) = Dgw;  

//% compute the distances between each vertex 1..nmX and each added vertex 1..nXnew (j) going through each intermediate vertex (i)
for j=1:nmXnew
   for i=1:nmX  
      Dgwaug(1:nmX,nmX+j) = min(Dgwaug(1:nmX,nmX+j),Dgwaug(1:nmX,i) + repmat(Dgwaug(i,nmX+j),[nmX 1]));
      Dgwaug(nmX+j,:) = transpose(Dgwaug(:,nmX+j));
   end  
end  

//% compute the distances between each vertex 1..nmX and each vertex 1..nmX going through the each intermediate added vertex k
for k=1:nmXnew  
   Dgwaug(1:nmX,1:nmX) = min(Dgwaug(1:nmX,1:nmX),repmat(Dgwaug(1:nmX,nmX+k),[1 nmX])+ repmat(Dgwaug(nmX+k,1:nmX),[nmX 1]));      
end
这是我使用全部数据为Floyd Warshal编写的代码

//%% function to update geodesic distance matrix with new adjancy matrix  
function Dgw = compGeoDis(W)  
//% W: weighted adjancy matrix  

nmX = length(W); //% number of vertices in the graph  

//% initialize the distance matrix for augmented graph  
Dgwaug = W;  

//% compute the distances between each vertex 1..nmX and each vertex 1..nmX going through the each intermediate vertex k
for k=1:nmX 
   Dgw = min(Dgw,repmat(Dgw(:,k),[1 nmX])+ repmat(Dgw(k,:),[nmX 1]));      
end

为什么需要重新计算所有顶点之间的距离?难道你不能为新的顶点找到它们,并通过在其末尾添加新行和列来相应地增加距离矩阵吗?谢谢你的详细回复。这很有帮助。我做了和你提到的一样的事情,用新的顶点更新增强图,但是当使用Floyd Warshall的完整数据时,不能得到相同的结果。我发布了更新和创建测地距离矩阵的代码。
//%% function to update geodesic distance matrix with new adjancy matrix  
function Dgwaug = updateGeoDis(W,Dgw)  
//% W: weighted adjancy matrix  
//% Dgw : current geodesics-distance matrix  

nmX = length(Dgw); //% number of vertices in the current graph  
nmXaug = length(W); //% number of vertices in the augmented graph  
nmXnew = nmXaug - nmX; //% number of new vertices to be included

//% initialize the distance matrix for augmented graph
Dgwaug = W;  
Dgwaug(1:nmX,1:nmX) = Dgw;  

//% compute the distances between each vertex 1..nmX and each added vertex 1..nXnew (j) going through each intermediate vertex (i)
for j=1:nmXnew
   for i=1:nmX  
      Dgwaug(1:nmX,nmX+j) = min(Dgwaug(1:nmX,nmX+j),Dgwaug(1:nmX,i) + repmat(Dgwaug(i,nmX+j),[nmX 1]));
      Dgwaug(nmX+j,:) = transpose(Dgwaug(:,nmX+j));
   end  
end  

//% compute the distances between each vertex 1..nmX and each vertex 1..nmX going through the each intermediate added vertex k
for k=1:nmXnew  
   Dgwaug(1:nmX,1:nmX) = min(Dgwaug(1:nmX,1:nmX),repmat(Dgwaug(1:nmX,nmX+k),[1 nmX])+ repmat(Dgwaug(nmX+k,1:nmX),[nmX 1]));      
end
//%% function to update geodesic distance matrix with new adjancy matrix  
function Dgw = compGeoDis(W)  
//% W: weighted adjancy matrix  

nmX = length(W); //% number of vertices in the graph  

//% initialize the distance matrix for augmented graph  
Dgwaug = W;  

//% compute the distances between each vertex 1..nmX and each vertex 1..nmX going through the each intermediate vertex k
for k=1:nmX 
   Dgw = min(Dgw,repmat(Dgw(:,k),[1 nmX])+ repmat(Dgw(k,:),[nmX 1]));      
end