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
執行介面: