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的出边邻接点,则权值为∞。

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

运行界面:

Dijkstra算法(D算法)实现路径搜索matlab GUI 实现 路径规划_第1张图片

 

D算法完美运行的源代码下载地址:https://download.csdn.net/download/wangmingyang13/10774935

D算法改进后的A*算法代码下载地址:https://download.csdn.net/download/wangmingyang13/10805361

你可能感兴趣的:(Dijkstra算法(D算法)实现路径搜索matlab GUI 实现 路径规划)