找到最短路径的更快捷方法是什么?

时间:2018-06-15 03:11:02

标签: matlab graph dijkstra shortest-path undirected-graph

当标有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_Nodesm乘3矩阵,其中每行代表源节点的位置,并且Rest_Nodesn乘3矩阵,其中每一行代表公共节点的位置(既未选择为目标节点也未选择为源节点)。也就是说,我考虑使用1+m+n个节点的完整图表。

我的函数getPATH的输出是m个单元格。第i个单元表示从S_NodesD_Node的第i个节点的路径。请注意,我已将D_Node标记为&#39; 1&#39;,Rest_Nodes标记为['2', '3', ..., 'n+1'],将S_Nodes标记为['n+2', 'n+3', ..., 'n+m+1']

实际上,我的代码运行良好,但速度很慢。 我的外循环算法经常运行这个getPATH函数。 因此,我的整个算法需要很长时间才能完成。 因此,我正在尝试减少此getPATH算法的执行时间,并且我决定使用现有函数(例如graphgraphallshortestpathsshortestpathtree等。因为MATLAB给出的现有函数几乎总是比我自己的代码快(遗憾的是)。

是否有任何广泛使用的实现来找到最短路径? 如果是这样,请让我知道该功能的名称。 如果没有,请帮我加快功能。

另外,我想知道一种从位置矩阵映射到graph类型的变量的好方法

0 个答案:

没有答案