当标有100个节点' 1',' 2',...,' 100'时,我想制作一个提供最短路径的代码从一些节点到节点' 1。例如,如果S由{node '10', node '15', node '30', node '99'}
定义,那么我想从节点' 10'中获取一些路径。节点' 1',来自节点' 15'节点' 1',来自节点' 30'节点' 1'以及节点' 99'到节点' 1'。
在我的情况下,每个节点都有其n维位置值,节点“i”之间的边缘权重。和节点' j'由它们之间的欧几里德距离的平方来定义。例如,如果节点' i'和节点' j'分别有位置值(0,0,0,0)和(100,200,0,300),然后它们之间的边缘权重由sqrt(100^2+200^2+300^2)=374
定义。
实际上,我使用Dijkstra算法制作了自己的代码,如下所示:
function PATHs = getPATH(D_Node, Rest_Nodes, S_Nodes)
all_Nodes = [D_Node; Rest_Nodes; S_Nodes];
D_Node_index = 1;
numRN = size(Rest_Nodes,1);
numSN = size(S_Nodes,1);
for m = 1:numSN
predecessor = nan(1+numRN,1);
oldCost = Inf(1+numRN,1);
settled = zeros(1+numRN,1);
dists = sqrt(sum((repmat(S_Nodes(m,:),1+numRN,1)-all_Nodes(1:1+numRN,:)).^2, 2));
newCost = dists.^2;
predecessor(newCost < oldCost) = 1+numRN+m;
[minCost, target_idx] = min(newCost);
settled(target_idx) = true;
while ~settled(D_Node_index)
oldCost = newCost;
dists = sqrt(sum((repmat(all_Nodes(target_idx,:),1+numRN,1)-all_Nodes(1:1+numRN,:)).^2, 2));
tempCost = dists.^2;
tempCost = tempCost + minCost;
newCost = min(tempCost,newCost);
newCost(settled > 0) = NaN;
predecessor(newCost < oldCost) = target_idx;
[minCost, target_idx] = min(newCost);
settled(target_idx) = true;
end
temp_path = [D_Node_index];
pre = predecessor(D_Node_index);
while pre ~= 1+numRN+m
temp_path = [pre temp_path];
pre = predecessor(pre);
end
path{m} = [1+numRN+m temp_path];
end
PATHs = path;
有关更多详细信息,D_Node
是1乘3矩阵表示目标节点的位置,S_Nodes
是m
乘3矩阵,其中每行代表源节点的位置,并且Rest_Nodes
是n
乘3矩阵,其中每一行代表公共节点的位置(既未选择为目标节点也未选择为源节点)。也就是说,我考虑使用1+m+n
个节点的完整图表。
我的函数getPATH
的输出是m
个单元格。第i个单元表示从S_Nodes
到D_Node
的第i个节点的路径。请注意,我已将D_Node
标记为&#39; 1&#39;,Rest_Nodes
标记为['2', '3', ..., 'n+1']
,将S_Nodes
标记为['n+2', 'n+3', ..., 'n+m+1']
。
实际上,我的代码运行良好,但速度很慢。
我的外循环算法经常运行这个getPATH
函数。
因此,我的整个算法需要很长时间才能完成。
因此,我正在尝试减少此getPATH
算法的执行时间,并且我决定使用现有函数(例如graph
,graphallshortestpaths
,shortestpathtree
等。因为MATLAB给出的现有函数几乎总是比我自己的代码快(遗憾的是)。
是否有任何广泛使用的实现来找到最短路径? 如果是这样,请让我知道该功能的名称。 如果没有,请帮我加快功能。
另外,我想知道一种从位置矩阵映射到graph
类型的变量的好方法