【路径规划】A*和改进A*的路径规划【Matlab 163期】

一、简介

A* 算法是启发式搜索算法,是根据Dijkstra算法改进而来。

问题引入
如下图所示,S为起始(start)节点,G为目标(goal)节点。

节点之间连线是两点的路径长度,如A到E的路径长度c(A,E) = 9。
节点旁的h值时当前节点到达目标节点(G)的预估值,如h(A)=15, 表示从当前点A到达目标点G的估计路径长度为15,此处h(x)即为启发函数,启发函数的设计有很多方法,具体可参考链接,此处不再扩展。
从起点S到达当前节点x的路径长度表示为g(x) 。
从起点S到达目标G并经过点x的估计距离长度表示为f(x) = g(x) + h(x),该公式是A算法的核心公式。
A
算法通过不断的选择估计距离f最小的节点,逐渐构建最短路径。
在这里插入图片描述
逻辑流程
创建两个集合OPEN集,CLOSED集,算法核心是从OPEN集中选择最优(f值小最优,或f相同时,h小的更优)的节点到CLOSED集中,然后将其后继节点放入OPEN集中,然后重复操作选取最优节点,直到到达目标,或者OPEN为空为止。最后再CLOSED集中根据目标G所包含的前序节点逆序查找最后到达起点S,这个链路的逆序即最优路径,具体流程如下图。
在这里插入图片描述
搜索过程
以下是前面网络的搜索过程展开图。

组合块中:

灰色为前序节点
蓝色当前节点x
g:起点S到当前节点x的路径距离。
h:当前节点x到终点G的估计距离
f:起点S途径x到达终点G的估计距离,即 f = g + h
绿色框为当前OPEN集合中的最优节点
红色框表示当前OPEN集合中需要被删除的节点
在OPEN、CLOSED中每一行表示一次完整迭代完成时两集合中的节点集合。

最后的最优路径是:S->B->F->k->G

注:当两个节点f相同时,h小的更优

在这里插入图片描述

二、源代码

%**************************************************************************
 
 
 
disp('  Generating Grid ... ');
co=or;
crn=s;
 
noOfNodes  = nooc*noor;
nodmat=ones(nooc,noor,3);
nodmat(1:noOfNodes)=1:noOfNodes;
nodmat(:,:,2)=(find(nodmat(:,2,2)==1))*ones(1,noor);
nodmat(:,:,3)=ones(nooc,1)*(find(nodmat(2,:,3)==1));
nodmat(:,:,1)=flipdim((nodmat(:,:,1)),2);
nodmat(:,:,2)=flipdim((nodmat(:,:,2)),2);
nodmat(:,:,3)=flipdim((nodmat(:,:,3)),2);
noddata=reshape(nodmat,noOfNodes,3);
 
 
%rand('state', 0);
 
if plot_flag==1
    scrsz = get(0,'ScreenSize');
    h=figure(gcf);
    set(h,'Position',[scrsz(3)/8 scrsz(4)/8 scrsz(3)-2*scrsz(3)/8 ...
        scrsz(4)-2*scrsz(4)/8]);
    clf;
    hold on;
end
 
 
Astar_coor=noddata(:,2:3)*GTS;
 
 
netXloc = Astar_coor(:,1)';
netYloc = Astar_coor(:,2)';
axis([min(netXloc)-20  max(netXloc)+30  min(netYloc)-20  max(netYloc)+30])
Astar_connect = zeros(noOfNodes, noOfNodes);
Astar_coord = zeros(noOfNodes, 2);
for i = 1:noOfNodes
    
    Astar_coord(i,1) = netXloc(i);
    Astar_coord(i,2) = netYloc(i);
    
    for j = 1:noOfNodes
        distance = sqrt((netXloc(i) - netXloc(j))^2 + (netYloc(i) - netYloc(j))^2);
        ll=isempty(find(o==i, 1));
        lm=isempty(find(o==j, 1));
        if (distance <= R && ll==1 && lm==1)
            matrix(i, j) = distance;   % if set to '1', Dijkstra computes Spath in terms of hops; if set to 'distance', it is the real shortest path
            if i~=j % must be satisfied
                Astar_connect(i, j) = 1;
            else
                Astar_connect(i, j) = 0;
            end
            if plot_flag==1
                line([netXloc(i) netXloc(j)], [netYloc(i) netYloc(j)], 'color',[.65 .65 .65],'LineStyle', ':');
            end
        else
            matrix(i, j) = inf;
            Astar_connect(i, j) = 0;
        end;
    end;
end
for i = 1:noOfNodes
    if plot_nodenum
        text(netXloc(i)+20, netYloc(i), num2str(i));
    end
    if plot_flag==1
        
        if i==s
            plot(netXloc(i), netYloc(i),'square','MarkerSize',12,'MarkerFaceColor','g');
            hold on;
            
        end
        if i==d
            plot(netXloc(i), netYloc(i),'square','MarkerSize',12,'MarkerFaceColor','r');
        end
        
        if isempty(find(o==i))
            plot(netXloc(i), netYloc(i),'.');
        end
        
        
    end
end;
 
 
% activeNodes = [];
% for i = 1:noOfNodes,
%     % initialize the farthest node to be itself;
%     farthestPreviousHop(i) = i;     % used to compute the RTS/CTS range;
%     farthestNextHop(i) = i;
% end;
 
Astar_coord=Astar_coord';
%Astar_connect;
%%
disp('Generating Paths ... ')
%[path, totalCost, farthestPreviousHop, farthestNextHop] = dijkstra(noOfNodes, matrix, s, d, farthestPreviousHop, farthestNextHop);
% combo = [noOfNodes s-1 d-1 R/2];
%[Astar_path, Astar_search] = Astar(Astar_coord', Astar_connect, combo); % notice, we must put Astar_coord' rather than Astar_coord
%[Astar_paths,cost_astar,astar_time] = Astarm(Astar_coord, Astar_connect, s , d);
%[Astar_path,Astar_search]=Astar(Astar_coord, Astar_connect, combo);
[Astar_path,cost_astar,astar_time,Astar_dist] =komegaA(Astar_coord, Astar_connect, s, d, 1, inf, 0);
[komega_path,cost_komega,ko_time,komega_dist]=komegaA(Astar_coord, Astar_connect, s, d, k , b, n);
%%
if disp_summary==1
    Astar_path, komega_path,cost_astar,cost_komega,astar_time,ko_time, Astar_dist, komega_dist
end
if ~isempty(Astar_path)
    for i = 1:(length(Astar_path)-1)
        if plot_flag==1
            astr=line([netXloc(Astar_path(i)) netXloc(Astar_path(i+1))], [netYloc(Astar_path(i)) netYloc(Astar_path(i+1))], 'Color','r','LineWidth', 2, 'LineStyle', '-.');
            if plot_nodenum==1
                text(netXloc(i), netYloc(i), num2str(i));
            end
        end
    end;
end;
if ~isempty(komega_path)
    for i = 1:(length(komega_path)-1)
        if plot_flag==1
            kom=line([netXloc(komega_path(i)) netXloc(komega_path(i+1))], [netYloc(komega_path(i)) netYloc(komega_path(i+1))], 'Color','g','LineWidth', 2, 'LineStyle', '-');
            if plot_nodenum==1
                text(netXloc(i), netYloc(i), num2str(i));
            end
        end
    end;
end;
rest=title('Comparison Between A-Star and K-Omega');
set(rest,'Interpreter','latex');
dkstr=strcat('K-Omega(k=',num2str(k),' b=',num2str(b),' n=',num2str(n),')');
kleg=legend([astr kom],'A-Star',dkstr);hold on;
set(kleg,'Interpreter','latex');
if plot_flag == 1
    hold off;
end
% Execute if K-Omega has not yet executed harware
if (n==0)
    [done]=execnxt(komega_path);
end
% If Analysis mode requested, perform analysis
if AnalysisMode==1
    AnalyzeKO;
end

三、运行结果

在这里插入图片描述

四、备注

完整代码或者代写添加QQ912100926。
往期回顾>>>>>>
【路径规划】粒子群优化算法之三维无人机路径规划【Matlab 012期】
【路径规划】遗传算法之多物流中心的开放式车辆路径规划【Matlab 013期】
【路径规划】粒子群算法之机器人栅格路径规划【Matlab 014期】
【路径规划】蚁群算法之求解最短路径【Matlab 015期】
【路径规划】免疫算法之物流中心选址【Matlab 016期】
【路径规划】人工蜂群之无人机三维路径规划【Matlab 017期】
【路径规划】遗传算法之基于栅格地图机器人路径规划【Matlab 018期】
【路径规划】蚁群算法之多无人机攻击调度【Matlab 019期】
【路径规划】遗传算法之基于栅格地图的机器人最优路径规划【Matlab 020期】
【路径规划】遗传算法之考虑分配次序的多无人机协同目标分配建模【Matlab 021期】
【路径规划】蚁群算法之多中心vrp问题【Matlab 022期】
【路径规划】蚁群算法之求解带时间窗的多中心VRP【Matlab 023期】
【路径规划】遗传算法之多中心VRP求解【Matlab 024期】
【路径规划】模拟退火之求解VRP问题【Matlab 025期】
【路径规划】A星之栅格路径规划【Matlab 026期】
【路径规划】基于一种带交叉因子的双向寻优粒子群栅格地图路径规划【Matlab 027期】
【路径规划】【TSP】蚁群算法之求解TSP问题含GUI【Matlab 028期】
【路径规划】蚁群算法之栅格地图路径规划【Matlab 029期】
【路径规划】遗传算法之旅行商 TSP 【Matlab 030期】
【路径规划】模拟退火算法之旅行商 TSP 问题【Matlab 031期】
【路径规划】蚁群算法之智能车路径规划【Matlab 032期】
【路径规划】华为杯:基于matlab 无人机优化运用于抢险救灾【Matlab 033期】
【路径规划】matlab之最小费用最大流算问题【Matlab 034期】
【路径规划】A*算法之解决三维路径规划问题【Matlab 035期】
【路径规划】人工蜂群算法之路径规划【Matlab036期】
【路径规划】人工蜂群算法之路径规划【Matlab 037期】
【路径规划】蚁群算法之求解多旅行商MTSP问题【Matlab 038期】
【路径规划】蚁群算法之无人机路径规划【Matlab 039期】

【路径规划】遗传算法之求解多VRP问题【Matlab 040期】
【VRP】遗传算法之带时间窗的车辆路径问题【Matlab 041期】
【路径规划】蚁群算法之三维路径规划【Matlab 042期】
【路径规划】粒子群优化蚁群之求解最短路径【Matlab 043期】
【TSP问题】差分进化之求解TSP问题【Matlab 044期】
【路径规划】RRT之三维路径规划【Matlab 144期】
【路径规划】人工势场算法之无人机编队路径规划【 Matlab 145期】
【VRP问题】节约算法之求解TWVRP问题【Matlab 146期】
【VRP问题】节约算法之求解CVRP问题【Matalb 147期】
【VRP问题】禁忌搜索算法之求解VRP问题【Matalb 148期】
【VRP问题】模拟退火算法之求解CVRP问题【Matlab 149期】
【VRP问题】模拟退火求解带时间窗之TWVRP问题【Matlab 150期】
【VRP问题】人工鱼群算法之求解带时间窗VRP问题【Matlab 151期】
【VRP问题】遗传算法之求解带容量VRP问题【Matlab 152期】
【路径规划】狼群算法算法之三维路径规划【Matlab 153期】
【路径规划】人工势场算法之无人机三维路径规划【Matlab 154期】
【路径规划】改进差分算法之三维多无人机协同航迹规划【Matlab 155期】
【路径规划】人工蜂群算法之多无人机三维路径规划【Matlab 156期】
【路径规划】麻雀搜索算法之无人机三维路径规划【Matlab 157期】
【路径规划】蚁群算法之三维路径规划【Matlab 158期】
【路径规划】免疫算法之最短路径规划【Matlab 159期】
【旅行商问题】免疫算法之求解旅行商问题【Matlab 160期】
【路径规划】遗传算法的公交排班系统分析【Matlab 161期】
【TSP】粒子群算法Hopfield之TSP求解【Matlab 162期】

猜你喜欢

转载自blog.csdn.net/m0_54742769/article/details/113725569