当前位置: 首页 > 知识库问答 >
问题:

matlab中求解迷宫的广度优先搜索算法[副本]

桂丰
2023-03-14

如果有人有主意请帮帮我。

共有1个答案

鲁向明
2023-03-14

听起来好像您已经知道如何实现一个算法,但是请查看Djikstra的算法,以了解解决这个问题的简单方法。

至于MATLAB,我只是简单地使用了一系列矩阵来表示每个单元格的信息。使用Djikstra的算法,从单个开放节点开始,检查其邻居并计算每个节点的路径开销,然后转移到开销最低的邻居。诀窍是将您访问过的节点设置为关闭,将您检查过的邻居设置为打开,并将未检查的节点保留为未知。

下面是我的代码,它基于障碍物的图像运行,其中自由单元格为白色,障碍物单元格为黑色。因此,您可以打开一个简单的绘画程序,如MSPaint和绘制地图非常容易。然后只需相应地更改代码顶部的文件名。

% read map file
map_file = 'obstacle_map.png';
obstacleMap = imread(map_file);
obstacleMap = 1 - obstacleMap(:,:,1)';

% get map size
Ni = size(obstacleMap,1);
Nj = size(obstacleMap,2);

% set initial position node
i0 = 1;
j0 = 1;

% set target position node
iTrg = Ni;
jTrg = Nj;

% initialize open node map, and close obstacle nodes
open_map = zeros(Ni,Nj);
open_map = open_map - 2*double(obstacleMap);

% initialize best score map
f_score = 0*ones(Ni,Nj);

% initialize previous node maps
Iprev = zeros(Ni,Nj);
Jprev = zeros(Ni,Nj);

% start open map with initial position node open
open_map(i0,j0) = 1;
is_open = 1;

% skip this many frames during plotting
Ngtf = 100;

% keep searching while there are open nodes
count = 0;
while is_open > 0;

    % loop counter
    count = count + 1;

    % find open node with the lowest score
    F_score = f_score + (1e9)*(open_map ~= 1);      % take the scores and add some big number to nodes that aren't open
    [ic,jc] = find(F_score == min(min(F_score)));

    % we might have more than one with the lowest score, so just take the
    % first candidate
    ic = ic(1);
    jc = jc(1);    

    % exit if we reach the target node
    if (ic == iTrg) && (jc == jTrg);
        break;
    end

    % set the current node to be closed
    open_map(ic,jc) = -1;

    % for each neighbour of the current node
    for i = (ic-1):(ic+1);

        % don't try checking neighbours out of bounds
        if i < 1 || i > Ni;
            continue;
        end

        for j = (jc-1):(jc+1);

            % don't try checking neighbours out of bounds
            if j < 1 || j > Nj;
                continue;
            end

            % skip if the neighbour has already been visited (i.e., it is
            % closed)
            if open_map(i,j) < 0;
                continue;
            end

            % compute the new best score to the neighbour (the best
            % score to the current node plus the distance to the neighbour
            % node from the currend node)
            f_score_new = f_score(ic,jc) + sqrt((i - ic)^2 + (j - jc)^2);

            % if the new best score is less than the previous best score
            % for the neighbour node, or the neighbour node has never been
            % checked
            if open_map(i,j) ~= 1 || f_score_new < f_score(i,j);

                % set the previous node indices (keep track of the actual
                % path)
                Iprev(i,j) = ic;
                Jprev(i,j) = jc;

                % update the new score
                f_score(i,j) = f_score_new;

                % set the neighbour node to be open
                open_map(i,j) = 1;
            end

        end
    end

    % plotting
    curr_map = open_map;
    curr_map(ic,jc) = 2;
    if mod(count,Ngtf) == 0;
        clf;
        surf(curr_map,'edgealpha',0);
        axis equal
        view(2)
        getframe;
    end

    % check how many nodes are open
    is_open = sum(sum(open_map == 1));

end

% final plotting map
final_map = open_map;

% final node
iF = ic;
jF = jc;

% backtrack through the list of previous nodes to construct the final path
ipath = [];
jpath = [];
while 1;
    final_map(iF,jF) = 2;
    if iF == i0 && jF == j0;
        break;
    end
    iprev = Iprev(iF,jF);
    jprev = Jprev(iF,jF);
    ipath = [iprev ipath];
    jpath = [jprev jpath];
    iF = iprev;
    jF = jprev;     
end


clf;
surf(final_map,'edgealpha',0);
hold on;
plot3(jpath,ipath,100000*ones(size(ipath)),'k.-');
axis equal
view(2)
 类似资料:
  • 我正在尝试实现一个广度优先算法,它解决了一个迷宫。作为输入,我有一个n*m的二进制矩阵,其中“1”代表障碍物/墙,“0”代表路径/自由单元。 我确实知道该算法通常是如何工作的,但我正在努力学习如何在matlab中存储和处理信息。所以基本上我从我的启动单元开始,检查所有它的直接邻居是否有障碍物。如果它们是自由的,我将它们标记为一条潜在路径,然后我再次递归地对所有这些单元执行相同的操作。 但是我就是不

  • 主要内容:深度优先搜索(简称“深搜”或DFS),广度优先搜索,总结前边介绍了有关图的 4 种存储方式,本节介绍如何对存储的图中的顶点进行遍历。常用的遍历方式有两种: 深度优先搜索和 广度优先搜索。 深度优先搜索(简称“深搜”或DFS) 图 1 无向图 深度优先搜索的过程类似于树的先序遍历,首先从例子中体会深度优先搜索。例如图 1 是一个无向图,采用深度优先算法遍历这个图的过程为: 首先任意找一个未被遍历过的顶点,例如从 V1 开始,由于 V1 率先访问过了,所以

  • 我正在研究BFS算法,我有一个关于如何将相邻节点插入队列的问题。 例如,假设我们正在处理一个无向图,我们希望执行BFS来输出图的内容,那么我们如何知道在从队列中取出一个初始节点后,相邻节点以什么顺序插入到队列中呢?还有,有没有办法修改邻居节点插入队列的方式? 任何帮助都将不胜感激,谢谢。

  • 我正在尝试使用Apache Spark Graphx实现BFS(广度优先搜索)算法。 这是我目前的实现: 当我尝试在线更新顶点属性时,我收到空指针异常: 我很困惑,因为for循环为空。 有人能解释我为什么吗?更新图形中顶点属性的最佳方法是什么?

  • 我在一门课上学习序言。我有一个练习,我需要读取一个文件,从中生成一个迷宫,获得从源到目标的路径,然后将其写入一个文件。 我读了文件,对我拥有的每个单元格断言,对连接的每两个单元格断言。 ,,,都是整数坐标,所以我知道起点和终点。 我的工作原理是,如果当前节点连接到目标,完成并返回。否则,找到当前节点所连接的节点,并用新节点调用递归

  • 本文向大家介绍Javascript中的广度优先搜索遍历,包括了Javascript中的广度优先搜索遍历的使用技巧和注意事项,需要的朋友参考一下 BFS在访问子顶点之前先访问邻居顶点,并且在搜索过程中使用队列。以下是BFS的工作方式- 访问相邻的未访问顶点。将其标记为已访问。显示它。将其插入队列。 如果找不到相邻的顶点,请从队列中删除第一个顶点。 重复规则1和规则2,直到队列为空。 让我们看一下BF