如果有人有主意请帮帮我。
听起来好像您已经知道如何实现一个算法,但是请查看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