All pastes #375112 Raw Edit

Dijkstra@cost$path

public text v1 · immutable
#375112 ·published 2007-02-28 00:46 UTC
rendered paste body
function [r_path, r_cost] = dijkstra(pathS, pathE, transmat)

%   pathS : the index of start node, indexing from 1
%   pathE : the index of end node, indexing from 1
%   transmat: the transition matrix, or adjacent matrix
%   modify output arguments to give indidual cost and path


% Ensure the transition matrix is square

if ( size(transmat,1) ~= size(transmat,2) )
  error('transmat has different width and heights');
end


%  Start
%  noOfNode     : nodes in the graph
%  parent(i)    : record the parent of node i
%  distance(i)  : the shortest distance from i to pathS
%  queue        : for width-first traveling of the graph
noOfNode = size(transmat, 1);

for i = 1:noOfNode
  parent(i) = 0;
  distance(i) = Inf;
end

queue = [];


% Start from pathS
%
for i=1:noOfNode
  if transmat(pathS, i)~=Inf 
    distance(i) = transmat(pathS, i);
    parent(i)   = pathS;
    queue       = [queue i];
  end
end



% Width-first exploring the whole graph
%
while length(queue) ~= 0
  
  hopS  = queue(1);
  queue = queue(2:end);
  
  for hopE = 1:noOfNode
    if distance(hopE) > distance(hopS) + transmat(hopS,hopE)
      distance(hopE) = distance(hopS) + transmat(hopS,hopE);
      parent(hopE)   = hopS;
      queue          = [queue hopE];
    end
  end
  
end


% Back-trace the shortest-path
%
r_path = [pathE];    
i = parent(pathE);

while i~=pathS && i~=0
  r_path = [i r_path];
  i      = parent(i);
end

if i==pathS
  r_path = [i r_path];
else
  r_path = []
end
  

% Return cost
%
r_cost = distance(pathE);