1. 程式人生 > >Dijkstra演算法(D演算法)實現路徑搜尋matlab GUI 實現 路徑規劃

Dijkstra演算法(D演算法)實現路徑搜尋matlab GUI 實現 路徑規劃

Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,運籌學等等。注意該演算法要求圖中不存在負權邊。

問題描述:在無向圖 G=(V,E) 中,假設每條邊 E[i] 的長度為 w[i],找到由頂點 V0 到其餘各點的最短路徑。(單源最短路徑)

演算法步驟:

a.初始時,S只包含源點,即S={v},v的距離為0。U包含除v外的其他頂點,即:U={其餘頂點},若v與U中頂點u有邊,則<u,v>正常有權值,若u不是v的出邊鄰接點,則<u,v>權值為∞。

b.從U中選取一個距離v最小的頂點k,把k,加入S中(該選定的距離就是v到k的最短路徑長度)。

c.以k為新考慮的中間點,修改U中各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改後的距離值的頂點k的距離加上邊上的權。

d.重複步驟b和c直到所有頂點都包含在S中。

演算法程式碼實現:

parent = zeros(nrows,ncols);   % Main Loop  while true    % Draw current map    map(start_node) = 5;    map(dest_node) = 6;    image(1.5, 1.5, map);    grid on; %網格   axis image; %顯示座標   drawnow; %重新整理螢幕   % Find the node with the minimum distance 找到距離最短的節點   [min_dist, current] = min(distanceFromStart(:));   if ((current == dest_node) || isinf(min_dist)) %TF = isinf(A)  返回一個和A尺寸一樣的陣列, 如果A中某個元素是inf  (無窮), 則對應TF中元素是1, 否則TF中對應元素是0。         break;    end;    %搜尋中心的索引座標:current,   %搜尋中心與起始點的路程:min_dist   % 這兩個值後面會用。     map(current) = 3;    distanceFromStart(current) = Inf;    [i, j] = ind2sub(size(distanceFromStart), current); %索引號變為座標   neighbor = [i-1,j;                i+1,j;                i,j+1;                i,j-1];      outRangetest = (neighbor(:,1)<1) + (neighbor(:,1)>nrows)+(neighbor(:,2)<1) + (neighbor(:,2)>ncols);      locate = find(outRangetest>0);  %返回outRangetest中大於0的元素的相對應的線性索引值。     neighbor(locate,:)=[];      neighborIndex = sub2ind(size(map),neighbor(:,1),neighbor(:,2)); for i=1:length(neighborIndex)   if (map(neighborIndex(i))~=2) && (map(neighborIndex(i))~=3 && map(neighborIndex(i))~= 5)       map(neighborIndex(i)) = 4;     if (distanceFromStart(neighborIndex(i))>= min_dist + 1 )             distanceFromStart(neighborIndex(i)) = min_dist+1;          parent(neighborIndex(i)) = current;            % pause(0.02);     end    end   end   end % %%  if (isinf(distanceFromStart(dest_node)))       %route = [];      disp('路徑搜尋失敗');      set(handles.text5,'string','路徑搜尋失敗');  else       %提取路線座標      set(handles.text5,'string','路徑搜尋成功');

     route = [dest_node];        while (parent(route(1)) ~= 0)                 route(1);                parent(route(1))                route = [parent(route(1)), route] ;         end     % 動態顯示出路線               for k = 2:length(route) - 1             map(route(k)) = 7;                   pause(0.02);                   image(1.5, 1.5, map);                 grid on;                 axis image;           end       disp('路徑搜尋成功');  end

執行介面: