首页 > 编程语言 >使用栅格地图复现Floyd算法

使用栅格地图复现Floyd算法

时间:2023-01-24 20:13:48浏览次数:43  
标签:map rows end field cols 栅格 算法 Floyd 复现

Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于Dijkstra算法,也要高于SPFA算法。

优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
缺点:时间复杂度比较高O(n^3),不适合计算大量数据。

算法思想:

Floyd算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法。算法的单个执行将找到所有顶点对之间的最短路径的长度(加权)。

其状态转移方程如下: map[i,j] = min{map[i,k]+map[k,j],map[i,j]};
map[i,j] 表示i到j的最短距离,k是i到j的中介点,map[n,n] 初值应该为0,或者按照题目意思来做。
当然,如果这条路没有通的话就直接将 map[i,j] 设置为inf

源代码:

init.m:初始化栅格地图

function [field,cmap] = init(rows, cols)
cmap = [1 1 1; ...       % 1-白色-空地
    0 0 0; ...           % 2-黑色-静态障碍
    1 0 0; ...           % 3-红色-动态障碍
    1 1 0;...            % 4-黄色-起始点 
    1 0 1;...            % 5-品红-目标点
    0 1 0; ...           % 6-绿色-到目标点的规划路径   
    0 1 1];              % 7-青色-动态规划的路径

% 构建颜色MAP图
colormap(cmap);

% 定义栅格地图全域,并初始化空白区域
field = ones(rows, cols);

% 障碍物区域
obsRate = 0.3;
obsNum = floor(rows*cols*obsRate);
obsIndex = randi([1,rows*cols],obsNum,1);
field(obsIndex) = 2;

getNeighborNodes.m: 获得给定点的8个邻接点以及距离矩阵

function neighborNodes = getNeighborNodes(rows, cols, lineIndex, field)
[row, col] = ind2sub([rows,cols], lineIndex);
neighborNodes = inf(8,2);


%% 查找当前父节点临近的周围8个子节点
neighborIndex = 1;
for i = -1 : 1
    for j = -1 : 1
        nx = row + i;
        ny = col + j;
        if (i == 0 && j == 0) || nx <= 0 || nx > rows || ny <= 0 || ny > cols
            continue
        end
        child_node_line = sub2ind([rows,cols], nx, ny);
        neighborNodes(neighborIndex,1) = child_node_line;
        if field(nx, ny) ~= 2
            cost = norm([nx, ny] - [row, col]);
            neighborNodes(neighborIndex,2) = cost;
        end
        neighborIndex = neighborIndex + 1;
    end
end


Floyd.m:得到任何两点间的最短路径并存储,将起点到终点的最短路径绘制出来

% 基于栅格地图的机器人路径规划算法
% 第3节:Floyd算法
clc
clear
close all

%% 栅格界面、场景定义
% 行数和列数
rows = 10;
cols = 20;
[field,cmap] = init(rows, cols);

% 起点、终点、障碍物区域
startPos = 3;
goalPos = rows*cols-2;
field(startPos) = 4;
field(goalPos) = 5;

%% 算法初始化
n = rows*cols;      % 栅格节点总个数
map = inf(n,n);     % 所有节点间的距离map, 邻接矩阵
path = cell(n, n);  % 存放对应的路径

% 初始化邻接矩阵和路径矩阵
for startNode = 1:n
    if field(startNode) ~= 2  % 如果不是障碍物
        neighborNodes = getNeighborNodes(rows, cols, startNode, field);
        for i = 1:8
            if ~(isinf(neighborNodes(i,1)) || isinf(neighborNodes(i,2)))
                neighborNode = neighborNodes(i,1);
                map(startNode, neighborNode) = neighborNodes(i,2);
                path{startNode, neighborNode} = [startNode, neighborNode];
            end
        end
    end
end
           
%% 进入三层主循环
for k = 1 : n   % 中介点
    for i =  1 : n
        if i ~= k
            for j =  1 : n
                if j ~= i && j ~= k
                    if map(i,k) +  map(k,j) < map(i,j)
                        map(i,j) = map(i,k) +  map(k,j);
                        path{i,j} = [path{i,k}, path{k,j}(2:end)];
                    end
                end
            end
        end
    end
end


%% 画栅格界面
% 找出目标最优路径
path_target = path{startPos,goalPos};
field(path_target(2:end-1)) = 6;

% 画栅格图
image(1.5,1.5,field);
grid on;
set(gca,'gridline','-','gridcolor','k','linewidth',2,'GridAlpha',0.5);
set(gca,'xtick',1:cols+1,'ytick',1:rows+1);
axis image;

运行结果:

起点到终点的最短路径:

>> path{3,198}

ans =

     3    14    25    35    45    55    66    76    86    96   106   116   126   137   147   157   167   178   189   198

>> 

标签:map,rows,end,field,cols,栅格,算法,Floyd,复现
From: https://www.cnblogs.com/junlin623/p/17066311.html

相关文章

  • slam学习前的餐点---ORB_SLAM2 的复现
    ORBSLAM的复现软件基础:Linux系统:乌班图22.04ROS:ROS2humble版本ORB_SLAM:GitHub源码参考资料:https://blog.csdn.net/qq_45999722/article/details/127826553......
  • 使用栅格地图复现迪杰斯特拉算法
    Dijkstra算法可以计算出在有权图中从某个起点出发到其他任何一点的最短路径长度算法思想:迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最......
  • 使用Matlab构建二维栅格地图
    常使用的地图一般有以下几种:尺度地图:具有真实的物理尺寸,如栅格地图、特征地图、点云地图、常用于地图构建、定位、SLAM、小规模路径规划拓扑地图:不具备真实的物理尺寸,......
  • 地理信息技术GIS学习(6):栅格数据空间分析、实例:学校选址/修路最佳路径
    设置分析环境:arcGIS菜单中【地理处理】-【环境】  两个工作空间可以修改为chp8/ex1,方便之后保存文件都在这个路径。不用每次都去点了  处理范围也可以选一个。......
  • CVE-2022-26134 Confluence OGNL RCE 复现
    一、漏洞概述     AtlassianConfluence是一款各企业广泛使用的wiki系统。在AtlassianConfluenceServerandDataCenter上存在OGNL注入漏洞,远程攻击者在......
  • CVE-2022-46463复现文章
    本文来自博客YX'BLOGhttp://535yx.cnHarbor是为企业用户设计的容器镜像仓库开源项目,包括了权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面、自我注册......
  • 永恒之蓝(MS17-010)的复现
     漏洞介绍:MS17-010又称永恒之蓝漏洞,利用Windows系统的SMB漏洞可以获取系统最高权限。最有名的安全事件就是不法分子通过改造“永恒之蓝”制作了wannacry勒索病毒。攻击......
  • 永恒之黑漏洞复现
    准备一台安装了python的电脑(可以是虚拟机)随便一个受到影响的windows电脑(可以是虚拟机,因为会蓝屏)受影响的windows电脑,包括:Windows10Version1903for32-bitSy......
  • ms17-010漏洞复现
    一、ms17-010漏洞复现(1)启用msf (2)搜索msf中和ms17-010漏洞相关的脚本   (3)使用ms17-010的辅助模块脚本(即搜到的3号模块)   (4)配置辅助模块脚本相关内容......
  • 2022MoeCTF整理复现(NSS平台)
    一、[MoeCTF2022]小纸条1.jpg上的像是某种形式的猪圈密码,找一个对照表边猜边对照2.根据点和角的位置方向以及可能拼写成的单词,得到flagmoectf{ILOVEMYBIGBED}二、[M......