Matlab计算最短路径及路径的个数

    最近老板让计算最短路径及路径个数,找遍了所有工具箱,都没现成的。急死了,什么Dijkstra和Floyd都搞不定。最后,想了想,算了吧,自己编吧,反正自己用,又没有算法复杂度要求。于是自己就写了个小程序(本程序仅限无权无向连通图),算法复杂度不晓得(偷笑)。

   本人不是计算机出身,就不写算法步骤了,直接上图解。


   我们首先计算的是节点1到所有节点的最短路径,及个数。s存放节点1到所有节点的最短路径,p_num存放路径的个数。

   初始化:s=[0,0,0,0,0,0,0]      p_num=[1,0,0,0,0,0,0]

    第一轮迭代:找节点1的所有邻居节点2,3,4。则:s([2,3,4])=1

                            在看节点2的邻居1和5.则: p_num(2)= p_num(1)+ p_num(5)=1+0=1

                            同理:p_num(3)=p_num(4)=1

                            则本轮会得到:s=[0,1,1,1,0,0,0]      p_num=[1,1,1,1,0,0,0]

    第二轮迭代:找节点2,3,4的所有邻居节点(没有被找过的节点)5,6。则:s([5,6])=2

                            再看节点5的邻居2,3和7.则: p_num(5)= p_num(2)+ p_num(3)+ p_num(7)=1+1+0=2

                            同理:p_num(6)=1

                            则本轮会得到:s=[0,1,1,1,2,2,0]      p_num=[1,1,1,1,2,1,0]

    第三轮迭代:找节点5,6的所有邻居节点(没有被找过的节点)7。则:s([7])=3

                            在看节点7的邻居5和6.则: p_num(2)= p_num(5)+ p_num(6)=2+1=3

                            则本轮会得到:s=[0,1,1,1,2,2,3]      p_num=[1,1,1,1,2,1,3]

   找节点7的所有邻居节点(没有被找过的节点),没啦,迭代终止。哈哈节点到所有节点的最短路径及条数搞定,然后来个循环就把任意两个点的最短路径及个数搞定。

  哇嘎嘎,简单粗暴,下面有程序,能力有限。使用前记得要仔细拍错误哦哦




function [all_s,all_p_num]=all_node_shortest(w)
    %全联通无权无向图
    %输入邻接矩阵w
    %all_s为所有节点间的最短距离
    %all_p_num为最短路径的个数
    %树状搜索(纯属自己想的,没有优化,可以跑小网络)
    n=length(w);                    %节点的个数
    all_s=zeros(n,n);               %初始化
    all_p_num=zeros(n,n);       %初始化
    for i=1:n
        [s,p_num]=node_shortest(w,i);
        all_s(i,:)=s;
        all_p_num(i,:)=p_num;   
    end


end


function [s,p_num]=node_shortest(w,node)
    %全联通无权无向图
    %输入邻接矩阵w
    %初始节点 node
    %s为node到所有节点的最短距离
    %p_num为最短路径的个数
    %树状搜索(纯属自己想的)
    n=length(w);                    %节点的个数
    s=zeros(1,n);                   %初始化
    p_num=zeros(1,n);               %初始化
    p_num(node)=1;                %node到node本身距离为零,个数记为1           
    node_all=zeros(1,n);               
    node_all(node)=1;               %记录哪些节点被搜索到,搜索到的节点记为1,否则为0
    lj=node;                        %lj为当前步到达的节点(到lj的距离都为k)
    k=1;
    while sum(node_all)<n           %搜索至所有节点停止迭代
        lj=find(sum(w(lj,:),1)>0&node_all==0);      %上一时刻的所有节点的邻居且没有被找到过的节点是这一次的邻居
        s(lj)=k;                                    %记录时刻即路径长度               
        p_num(lj)=sum(w(:,lj).*repmat(p_num',[1,length(lj)]),1); %这一时刻的路径的条数为:这个节点上一时刻已经到达的邻居的所有路径和
        node_all(lj)=1;                                          %这些节点在这个时刻已经被找到
        k=k+1;                                                   %下一时刻
    end
end
  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以帮你实现Dijkstra算法的Matlab代码,并计算最短路径值。 Dijkstra算法是一种用于解决带权重有向图或者无向图的单源最短路径问题的贪心算法。下面是Dijkstra算法的Matlab实现代码,注释中包含了详细的解释: ```matlab function [dist, path] = dijkstra_algorithm(graph, source_node) % graph: 一个n*n的矩阵,表示有向图或无向图的邻接矩阵 % source_node: 源节点 % dist: 从源节点到其他所有节点的最短距离 % path: 从源节点到其他所有节点的最短路径 n = length(graph); % 获取图中节点的个数 dist = Inf(1, n); % 初始化所有节点到源节点的距离为无穷大 visited = false(1, n); % 初始化所有节点的访问状态为未访问 prev = zeros(1, n); % 记录最短路径中每个节点的前一个节点 dist(source_node) = 0; % 源节点到自己的距离为0 for i = 1:n min_dist = Inf; u = -1; % 找到当前未访问节点中距离源节点最近的节点 for j = 1:n if ~visited(j) && dist(j) < min_dist u = j; min_dist = dist(j); end end if u == -1 % 当前没有未访问的节点,退出循环 break end visited(u) = true; % 将最近的节点标记为已访问 % 更新与最近节点相邻的未访问节点的距离 for v = 1:n if ~visited(v) && graph(u, v) ~= Inf && dist(u) + graph(u, v) < dist(v) dist(v) = dist(u) + graph(u, v); prev(v) = u; end end end path = cell(1, n); % 初始化路径 for i = 1:n if i == source_node % 源节点到自己的路径为自己 path{i} = num2str(i); elseif prev(i) == 0 % 源节点到该节点没有路径 path{i} = 'No path exists'; else % 从源节点到该节点的路径 path{i} = num2str(i); j = i; while j ~= source_node j = prev(j); path{i} = [num2str(j) ' -> ' path{i}]; end path{i} = [num2str(source_node) ' -> ' path{i}]; end end ``` 现在我们可以使用上面的代码来计算最短路径。假设我们有以下的邻接矩阵: ```matlab graph = [0, 7, Inf, 5; 7, 0, 8, 9; Inf, 8, 0, Inf; 5, 9, Inf, 0]; ``` 源节点是1,我们可以调用dijkstra_algorithm函数来计算最短路径: ```matlab [source_dist, source_path] = dijkstra_algorithm(graph, 1); ``` 这将返回源节点到每个节点的最短距离和最短路径

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值