广度优先搜索(BFS)及其matlab代码


前言

  广度优先搜索常被拿来与深度优先搜索进行比较,二者都是图形搜索算法但是寻找手段不同,接下来让我们一起进行学习吧~


一、广度优先搜索是什么?

  广度优先搜索,全称为 B r e a d t h f i r s t S e a r c h Breadth first Search BreadthfirstSearch,简称为 B F S BFS BFS,又称宽度优先搜索。它是从初始结点开始,应用产生式规则和控制策略生成第一层结点,同时检查目标结点是否在这些生成的结点中。若没有,再用产生式规则将所有第一层结点逐一拓展,得到第二层结点,并逐一检査第二层结点是否包含目标结点。若没有,再用产生式规则拓展第二层结点。如此依次拓展,检査下去,直至发现目标结点为止。如果拓展完所有结点,都没有发现目标结点,则问题无解。
  以上介绍参考自以下网址:

https://blog.csdn.net/ZhuRanCheng/article/details/115588272

二、广度优先搜索的基本思路即其matlab代码

1、广度优先搜索的基本思路

  广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:
  (1)把根节点放到队列的末尾;
  (2)每次从队列的头部取出一个元素,查看这个元素所有的下级元素,把它们放到队列末尾。并把这个元素记为它下一级元素的前驱;
  (3)找到所要找的元素时结束程序;
  (4)如果遍历整个树还没有找到,结束程序。
  以上基本思路参考自百度百科:

https://baike.baidu.com/item/%E5%AE%BD%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2/5224802?fromtitle=%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2&fromid=2148012&fr=aladdin

2、matlab代码

  广度优先搜索:BFS.m

clear all;close all;clc
%初始化邻接压缩表
b=[1 2;1 3;1 4;2 4;
   2 5;3 6;4 6;4 7];

m=max(b(:));                %压缩表中最大值就是邻接矩阵的宽与高
A=compresstable2matrix(b);  %从邻接压缩表构造图的矩阵表示
netplot(A,1)                %形象表示

head=1;             %队列头
tail=1;             %队列尾,开始队列为空,tail==head
queue(head)=1;      %向头中加入图第一个节点
head=head+1;        %队列扩展

flag=1;             %标记某个节点是否访问过了
re=[];              %最终结果
while tail~=head    %判断队列是否为空
    i=queue(tail);  %取队尾节点
    for j=1:m
        if A(i,j)==1 && isempty(find(flag==j,1))    %如果节点相连并且没有访问过
            queue(head)=j;                          %新节点入列
            head=head+1;                            %扩展队列
            flag=[flag j];                          %对新节点进行标记
            re=[re;i j];                            %将边存入结果
        end
    end
    tail=tail+1;            
end

A=compresstable2matrix(re);
figure;
netplot(A,1)

  构造图的矩阵表示:compresstable2matrix.m

function A=compresstable2matrix(b)
    [n ~]=size(b);
    m=max(b(:));
    A=zeros(m,m);

    for i=1:n
        A(b(i,1),b(i,2))=1;
        A(b(i,2),b(i,1))=1;
    end
end

  画图函数:netplot.m(矩阵生成无向网络图)

%函数名netplot
%使用方法输入请help netplot
%无返回值%函数只能处理无向图
%作者:tiandsp
%最后修改:2012.12.26
function netplot(A,flag)
    %调用方法输入netplot(A,flag),无返回值
    %A为邻接矩阵或关联矩阵
    %flag=1时处理邻接矩阵
    %flag=2时处理关联矩阵
    %函数只能处理无向图
    if flag==1      %邻接矩阵表示无向图
        ND_netplot(A);
        return;
    end
    
    if flag==2      %关联矩阵表示无向图
        [m n]=size(A);      %关联矩阵变邻接矩阵
        W=zeros(m,m);
        for i=1:n
            a=find(A(:,i)~=0);
            W(a(1),a(2))=1;
            W(a(2),a(1))=1;
        end
        ND_netplot(W);
        return;
    end
           
    function ND_netplot(A)
        [n n]=size(A);
        w=floor(sqrt(n));       
        h=floor(n/w);        
        x=[];
        y=[];
        for i=1:h           %使产生的随机点有其范围,使显示分布的更广
            for j=1:w
                x=[x 10*rand(1)+(j-1)*10];
                y=[y 10*rand(1)+(i-1)*10];
            end
        end
        ed=n-h*w;
        for i=1:ed
           x=[x 10*rand(1)+(i-1)*10]; 
           y=[y 10*rand(1)+h*10];
        end
        plot(x,y,'r*');    
        
        title('网络拓扑图'); 
        for i=1:n
            for j=i:n
                if A(i,j)~=0
                    c=num2str(A(i,j));                      %将A中的权值转化为字符型              
                    text((x(i)+x(j))/2,(y(i)+y(j))/2,c,'Fontsize',10);  %显示边的权值
                    line([x(i) x(j)],[y(i) y(j)]);      %连线
                end
                text(x(i),y(i),num2str(i),'Fontsize',14,'color','r');   %显示点的序号            
                hold on;
            end
        end  
    end
    
end

  以上代码参考自以下网址:

BFS代码
https://www.cnblogs.com/tiandsp/archive/2013/07/05/3174262.html
矩阵生成无线网络图(好用!)
https://www.cnblogs.com/tiandsp/archive/2012/12/26/2834654.html


总结

  对于我个人而言,宽度优先搜索这个名字可以更好地帮助我理解此算法的特性:一层一层的由内而外寻找节点。大家可以根据自己的理解特点进行记忆。以上就是本文主要内容,希望大家可以有所收获~

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪婪最佳优先搜索(GBFS)是一种启发式搜索算法,它在搜索过程中优先考虑距离目标状态最近的节点。在 MATLAB 中实现 GBFS 的关键是定义好启发函数,即估计当前节点到目标状态的距离。下面是一个简单的 MATLAB 代码示例: ```matlab function [path, cost] = gbfs(start, goal, h) % start: 起始状态 % goal: 目标状态 % h: 启发函数,估计当前状态到目标状态的距离 % path: 找到的路径 % cost: 路径的代价 % 初始化 open = [start]; % 待扩展节点集合 closed = []; % 已扩展节点集合 g = containers.Map({start}, {0}); % 起始状态到当前状态的代价 f = containers.Map({start}, {h(start)}); % 启发函数值 while ~isempty(open) % 选择 f 值最小的节点进行扩展 [~, idx] = min(cell2mat(values(f))); curr = open(idx); open(idx) = []; % 如果当前节点是目标状态,则返回路径和代价 if isequal(curr, goal) path = [goal]; cost = g(goal); while ~isequal(path(1), start) for s = keys(g) if isequal(s{1}, path(2)) if g(s{1}) + h(s{1}) == cost path = [s{1}, path]; break; end end end end return; end % 将当前节点加入已扩展节点集合 closed = [closed, curr]; % 扩展当前节点的所有邻居 neighbors = get_neighbors(curr); for i = 1:length(neighbors) neighbor = neighbors{i}; if ~ismember(neighbor, closed) && ~ismember(neighbor, open) % 如果邻居不在待扩展节点集合和已扩展节点集合中,则加入待扩展节点集合 open = [open, neighbor]; g(neighbor) = g(curr) + 1; % 代价加 1 f(neighbor) = h(neighbor); % 启发函数值 end end end % 如果搜索失败,则返回空路径和代价 path = []; cost = Inf; end function neighbors = get_neighbors(state) % 获取当前状态的所有邻居 % 这里假设状态是一个字符串,每个字符表示一个位置的状态 neighbors = {}; n = length(state); for i = 1:n-1 if state(i) ~= state(i+1) neighbor = state; neighbor(i:i+1) = fliplr(neighbor(i:i+1)); % 交换相邻两个位置的状态 neighbors = [neighbors, neighbor]; end end end ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值