matlab:检查路径的哪些行 - graphshortestpath

时间:2015-11-29 21:30:45

标签: matlab graph-theory cell-array

相关问题来自德国的电网。我有一个变电站网络,根据线路连接。使用graphshortestpath函数计算从A点到B点的最短路径。结果是使用了变电站ID的路径。我对Line ID感兴趣,所以我写了一个顺序代码来找出每个路径使用过的Line_ID。

此算法使用两个for循环。第一个for循环从单元格数组访问路径,第二个for循环查看每个连接并从数组中搜索Line_ID。

问题:有更好的编码方法吗?我正在寻找Line_ID,graphshortestpath只返回节点ID' s。

这是主要代码:

for i = i_entries
    path_i = LKzuLK_path{i_entries};
    if length(path_i) > 3 %If length <=3 no lines are used.
        id_vb = 2:length(path_i) - 2;
        for id = id_vb 
            node_start = path_i(id);
            node_end   = path_i(id+1);
            idx_line = find_line_idx(newlinks_vertices, node_start, ...
                node_end);
            Zuordnung_LKzuLK_pathLines(ind2sub(size_path,i),idx_line) = true;
        end      
    end 
end

注意:path_i的第一个和最后一个enrty是区域ID,因此不会查找它们以搜索Line_ID

function idx_line = find_line_idx(newlinks_vertices, v_id_1, v_id_2)
% newlinks_vertices includes the Line_ID, and then the two connecting substations
% Mirror v_id's in newlinks_vertices:
check_links = [newlinks_vertices; newlinks_vertices(:,1), newlinks_vertices(:,3), newlinks_vertices(:,2)];
tmp_dist1 = find(check_links(:,2) == v_id_1);
tmp_dist2 = find(check_links(tmp_dist1,3) == v_id_2,1);
tmp_dist3 = tmp_dist1(tmp_dist2);
idx_line = check_links(tmp_dist3,1);
end

注意:我已经尝试通过索引链接列表来缩短第一个查找搜索例程。此步骤将返回一个简短列表,其中仅显示所查看链接的相关条目。这样,算法减少了第一个也是最耗时的查找功能。结果并不好,401 * 401连接的计算时间仍然约为7小时,因此实施时间太长。

1 个答案:

答案 0 :(得分:0)

我会调查Dijkstra's algorithm以加快实施速度。这就是Matlab默认使用的graphshortestpath。链接的维基页面可能比我更好地解释它,甚至可以用伪代码来解决它!