2015-11-29 4 views
0

Связанная проблема возникает из сети Grid в Германии. У меня есть сеть подстанций, которые связаны по линиям. Самый короткий путь от точки A до B был рассчитан с использованием функции graphshortestpath. Результатом является путь с использованием идентификаторов подстанции. Меня интересует идентификатор линии, поэтому я написал последовательный код, чтобы выяснить используемые Line_ID для каждого пути.matlab: проверьте, какие линии пути используются - graphshortestpath

Этот алгоритм использует два для циклов. Первый for-loop для доступа к пути из массива ячеек, второй for-loop смотрит на каждое соединение и ищет Line_ID из массива.

Вопрос: Есть ли лучший способ кодирования этого? Я ищу Line_ID, метод graphshortest возвращает только идентификаторы узлов.

Вот основной код:

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 

Примечание: первая и последняя enrty из path_i находятся следующие идентификаторы, чтобы они не смотрели на для поиска в 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 

Примечание: Я уже пытался сократить первую поисковую процедуру путем индексации списка ссылок. Этот шаг вернет короткий список, содержащий только релевантные записи ссылок. Таким образом, алгоритм сокращается из первой и наиболее трудоемкой функции поиска. Результат был не намного лучше, время вычисления все еще составляло приблизительно 7 часов для соединений 401 * 401, поэтому слишком долго для реализации.

ответ

0

Я бы посмотрел на Dijkstra's algorithm, чтобы получить более быструю реализацию. Это то, что по умолчанию использует graphshortestpath Matlab. Связанная страница wiki, вероятно, объясняет это лучше, чем я когда-либо мог и даже выложил ее в псевдокоде!