matlab中使用dijkstra算法

matlab中使用dijkstra算法求最短路径

最近在搞数学建模,这个dijkstra算法搞r了好几天才明白,所以小菜鸡来记录一下。

来讲一下大概思路:
dijkstr算法整体是贪心算法思想
以这个无向图为例,假设从点1开始:

第一步
创建一个邻接矩阵a[nxn],aij表示两个节点的距离,对角线以及没有边的都为无穷大inf
第二步
初始化一些变量
n表示结点的个数
u表示已经找到最短距离的结点下标,初始为1
p表示还未找到最短路径的结点下标数组,初始为[2,3,4,5,6]
d表示各点的当前最短距离,最终d里面存的是各点的最短距离,d(1)=0,其他的都为无穷大inf
v记录前一个到达该点的下标,初始都为0
第三步
p中的结点遍历,对于u(end)结点,(u(end)表示刚找到最短距离的那个结点,初始是1),比较d(u(end))u(end)到该点(p中正在进行遍历的那点)的距离之和 与 源点到这点的距离(d(该点)),如果前者小,则替换d(该点),并且替换v(该点)u(end)
第四步
p中找到最短的d(p),则该点已找到最短距离,(因为其他的d(p)都比它大,它不可能再通过其他中转结点到达这点的距离比这还小),更新up,回到第三步,直至所有u的长度等于n
第五步
打印各个节点的最短距离和路径,路径遍历v即可,距离存在d

代码实现:

clc,clear
a = inf*ones(6);
a(1,[2,3])=[1,2];
a(2,[3,4,5])=[2,7,5];
a(3,5)=1;
a(4,[5,6])=[3,2];
a(5,6)=6;
a=min(a,a');
n=length(a);
u=1;    % 开始出发的结点下标
p=1:n; % 还未找到最短路径的结点下标
d=inf*ones(1,n); d(1)=0; % 各点的当前最短距离
v=zeros(1,n);    % 记录前一个到达该点的下标
while length(u) ~= n
    p=setdiff(p,u(end));
    for i=p
        if (d(u(end)) + a(u(end),i) < d(i))
            d(i) = d(u(end)) + a(u(end),i);
            v(i) = u(end);
        end
    end
    [tem, i] = min(d(p)); % tem是d(p)中最小的,i是取最小值时p向量的下标
    u = [u, p(i(1))];
end

for i=setdiff(1:n,u(1))
    disp("点"+u(1)+"到点"+i+"最短距离为:"+d(i))
    disp("路径:")
    j=i;
    index=j;
    while v(j) ~= u(1)
        j=v(j);
        index=[j,index];
    end
    index=[u(1),index];
    disp(index)
end

运行结果:

头大,好像理解还不是很透啊啊啊
end~

### 回答1: Matlab可以用Dijkstra算法来解决最短路径问题。Dijkstra算法是一种贪心算法,每次选取当前最短距离的节点,并更新其相邻节点的距离。在Matlab,可以定义一个矩阵来表示节点间的距离,并通过编写函数来实现Dijkstra算法。然后,可以在Matlab的命令窗口使用该函数来计算最短路径。 ### 回答2: Dijkstra算法是一种经典的图论算法,主要用来求解有权重图两个节点之间的最短路径。在MATLAB,我们可以通过使用Graph和ShortestPath函数来实现Dijkstra算法的求解。 首先,我们需要创建一张有权重的图。在MATLAB,可以通过使用Graph函数来创建图。Graph函数有多种调用方式,其一种常见的方式是以边的方式表示图。例如,可以使用以下代码创建一个有4个节点和5条边的无向图: ``` G = graph([1 1 2 2 3],[2 3 3 4 4],[2 1 3 2 4]); ``` 上述代码,`graph([1 1 2 2 3],[2 3 3 4 4],[2 1 3 2 4])`表示对于节点[1,2,3,4]之间的连通关系,以及对于每条边的权重分别为2,1,3,2,4。 接下来,我们可以使用ShortestPath函数进行最短路径求解。ShortestPath函数有多种调用方式,其一种方式是使用Dijkstra算法来计算最短路径。例如,可以使用以下代码来计算节点1和节点4之间的最短路径: ``` path = shortestpath(G,1,4,'Method','Dijkstra') ``` 上述代码,`shortestpath(G,1,4,'Method','Dijkstra')`表示计算节点1和节点4之间的最短路径。在计算过程使用Dijkstra算法来寻找最短路径。更具体地,'Method'指定了使用Dijkstra算法来寻找最短路径。 通过以上操作,我们可以使用MATLABDijkstra算法快速求解有权重图的最短路径问题。除此之外,MATLAB还有其他图论算法可以供我们使用,例如Floyd算法、Prim算法和Kruskal算法等。 ### 回答3: Dijkstra算法是一种常用的最短路径算法,被广泛应用于图论、网络等领域。在Matlab,可以使用内置的函数“shortestpath”来实现Dijkstra算法的计算。本文将介绍如何使用MatlabDijkstra算法。 首先,我们需要定义一个图,该图包含各个节点及其相互连接的边。在Matlab,我们可以使用稀疏矩阵来表示这个图,其每个节点用一个整数表示,每条边用一个二元组表示。例如,对于一个4个节点的图,可以构造一个4x4的稀疏矩阵,其第一列和第一行分别表示节点的编号,第2,3列表示相互连接的边,其第2列表示边的权值。 G = sparse([1 1 2 2 3 3 3 4],[2 3 1 3 2 4 3 4],[5 1 3 2 4 6 1 5],4,4); 上述代码定义了一个4个节点的图,节点之间的边的权值如下: 5 1 -------- 3 / \ / \ 5 3 6 1 / \ / \ 2 ------- 4 5 接下来,我们需要使用shortestpath函数来计算最短路径。例如,如果我们想要计算从节点1到节点4的最短路径,可以使用下面的代码: [P,d] = shortestpath(G,1,4) 其,P是从节点1到节点4的最短路径上的节点序列,d是路径的长度。 最后,我们可以使用“plot”函数把最短路径可视化。例如,使用下面的代码绘制从节点1到节点4的最短路径: plot(1:4,[1 2 3 4],'o'); hold on; for i=1:length(P)-1 j = i+1; plot(P(i:j),i:j,'r'); end hold off; 这样就可以在Matlab的图形界面显示出从节点1到节点4的最短路径。 综上所述,MatlabDijkstra算法使用非常简单,只需要使用内置的“shortestpath”函数即可。需要注意的是,为了正确使用最短路径算法,必须事先定义好节点和边的关系,构建好一个稀疏矩阵。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值