Dijkstra求最短路的MATLAB程序(含注释)

合集下载

最短路dijkstra算法Matlab程序

最短路dijkstra算法Matlab程序

function [c0,c,path0,path]=dijkstra(s,t,C,flag)% Use the Dijkstra's algorithm to find the shortest path from% s to t and can also find the shortest path between s and all% the other points.% Reference: Graph Theory with Applications by J. A. Bondy and% U. S. R. Murty.% Input -- s is the starting point and also is the point s.% -- t is the given terminal point and is the point t.% -- C \in R^{n \times n}is the cost matrix, where% C(i,j)>=0 is the cost from point i to point j.% If there is no direct connection between point i and% j, C(i,j)=inf.% -- flag: if flag=1, the function just reports the% shortest path between s and t; if flag~=1, the% function reports the shortest path between s and t,% and the shortest paths between s and other points.% Output -- c0 is the minimal cost from s to t.% -- path0 denotes the shortest path form s to t.% -- c \in R{1\times n} in which the element i is the% minimal cost from s to point i.% -- path \in R^{n \times n} in which the row i denotes% the shortest path from s to point i.% Copyright by MingHua Xu(徐明华), Changhzou University, 27 Jan. 2014. s=floor(s);t=floor(t);n=size(C,1);if s<1 || t < 1 || s > n || t > nerror(' The starting point and the terminal point exceeds the valid range');endif t==sdisp('The starting point and the terminal point are the same points');endlabel=ones(1,n)*inf;label(s)=0;S=[s];Sbar=[1:s-1,s+1:n];c0=0;path=zeros(n,n);path(:,1)=s;c=ones(1,n)*inf;parent=zeros(1,n);i=1; % number of points in point set S.while i<n% for each point in Sbar, replace label(Sbar(j)) by% min(label(Sbar(j)),label(S(k))+C(S(k),Sbar(j)))for j=1:n-ifor k=1:iif label(Sbar(j)) > label(S(k))+C(S(k),Sbar(j))label(Sbar(j))=label(S(k))+C(S(k),Sbar(j));parent(Sbar(j))=S(k);endendend% Find the minmal label(j), j \in Sbar.temp=label(Sbar(1));son=1;for j=2:n-iif label(Sbar(j))< temptemp=label(Sbar(j));son=j;endend% update the point set S and SbarS=[S,Sbar(son)];Sbar=[Sbar(1:son-1),Sbar(son+1:n-i)];i=i+1;% if flag==1, just output the shortest path between s and t.if flag==1 && S(i)==tson=t;temp_path=[son];if son~=swhile parent(son)~=sson=parent(son);temp_path=[temp_path,son];endtemp_path=[temp_path,s];endtemp_path=fliplr(temp_path);m=size(temp_path,2);path0(1:m)=temp_path;c_temp=0;for j=1:m-1c_temp=c_temp+C(temp_path(j),temp_path(j+1));endc0=c_temp;path(t,1:m)=path0;c(t)=c0;returnendend% Form the output resultsfor i=1:nson=i;temp_path=[son];if son~=swhile parent(son)~=sson=parent(son);temp_path=[temp_path,son];endtemp_path=[temp_path,s];endtemp_path=fliplr(temp_path);m=size(temp_path,2);path(i,1:m)=temp_path;c_temp=0;for j=1:m-1c_temp=c_temp+C(temp_path(j),temp_path(j+1));endc(i)=c_temp;c0=c(t);path0=path(t,:);endreturn。

matlab最短路径案例

matlab最短路径案例

matlab最短路径案例在实际生活和工作中,我们经常会遇到需要找到最短路径的问题,例如在物流配送中,我们需要计算货物从出发地到目的地的最短路线,以提高效率和节约成本。

在这种情况下,MATLAB是一种非常有效的工具,可以帮助我们快速计算出最短路径。

最短路径问题是计算图中两个节点之间最短路径的问题。

在MATLAB中,我们可以使用Graph和Dijkstra算法来实现最短路径的计算。

首先,我们需要构建一个图,用来表示节点和边。

在MATLAB中,我们可以使用Graph对象来表示图,并且可以使用addnode和addedge函数来添加节点和边。

G = graph();G = addnode(G, 5); % 添加5个节点G = addedge(G, 1, 2, 10); % 添加边,每条边都有一个权重G = addedge(G, 1, 3, 15);G = addedge(G, 2, 3, 8);G = addedge(G, 2, 4, 2);G = addedge(G, 3, 4, 6);G = addedge(G, 4, 5, 12);上面的代码创建了一个图,其中包含5个节点和6条边。

每条边都有一个权重,代表两个节点之间的距离。

接下来,我们可以使用dijkstra函数来计算最短路径。

这个函数需要指定图、起始节点和目标节点。

[start_node, end_node, shortest_dist] = shortestpath(G, 1, 5);上面的代码计算了图G中从节点1到节点5的最短路径,并且返回了起始节点、终止节点和最短路径的长度。

最后,我们可以使用plot函数将最短路径可视化。

plot(G, 'EdgeLabel', G.Edges.Weight) % 可视化图highlight(G, shortest_path, 'EdgeColor', 'r') % 高亮显示最短路径通过以上步骤,我们可以使用MATLAB计算并可视化最短路径。

实验三 Dijkstra最短路算法的程序仿真1

实验三  Dijkstra最短路算法的程序仿真1

实验三Dijkstra最短路算法的程序仿真实验目的:●了解IP核心网中OSPF路由协议核心算法的实现原理●掌握matlab编程,实现Dijkstra最短路算法的应用实验要求:●掌握Dijkstra算法●掌握matlab语言对于最短路仿真的功能实验场景:实验参考程序:function [l,z]=Dijkstra_a(W)% Dijkstra算法% 输入W表示连接矩阵% 输出l表示参考点的最小距离,DD表示最短路径生成树n = size (W,1);for i = 1 :nl(i)=W(1,i);z(i)=1;endi=1;while i<=nfor j =1 :nif l(i)>l(j)+W(j,i)l(i)=l(j)+W(j,i);z(i)=j;if j<iif j~=1i=j-1;elsei=1;endendendendi=i+1;end任务:(1)按网络拓扑图给出连接矩阵,例如连接矩阵为W = [0 1 Inf 2; 1 0 2 Inf; Inf 2 0 4; 2 Inf 4 Inf];请按照上例给出场景中的连接矩阵(2)计算场景中R1到各路由器的最短距离;(3)设计一个9点的网络拓扑图,计算每个路由器到其它路由器的所有最短路径。

按此文档格式编写实验报告,写出完成步骤的实现和代码,以及相应结果图,完成电子版,然后打印出来,贴到实验报告册。

实验小结通过Dijkstra最短路算法的程序仿真实验的学习,增强了我对Dijkstra最短路算法的了解,能够看懂图形,并能写出连接矩阵W,再通过MATLAB得出1和z,由z画出树状图。

总之,这次实验加深了对Dijkstra最短路算法的应用的了解和运用,体验到了自己画图并计算每个路由器到其它路由器的所有最短路径的乐趣。

D_i_j_k_s_t_r_a最短路算法MATLAB程序_

D_i_j_k_s_t_r_a最短路算法MATLAB程序_

从起点sb到终点db通用的Dijkstra标号算法程序function [mydistance,mypath]=mydijkstra(a,sb,db);% 输入:a—邻接矩阵,a(i,j)是指i到j之间的距离,可以是有向的% sb—起点的标号, db—终点的标号% 输出:mydistance—最短路的距离, mypath—最短路的路径n=size(a,1); visited(1:n) = 0;distance(1:n) = inf; distance(sb) = 0; %起点到各顶点距离的初始化visited(sb)=1; u=sb; %u为最新的P标号顶点parent(1:n) = 0; %前驱顶点的初始化for i = 1: n-1id=find(visited==0); %查找未标号的顶点for v = idif a(u, v) + distance(u) < distance(v)distance(v) = distance(u) + a(u, v); %修改标号值parent(v) = u;endendtemp=distance;temp(visited==1)=inf; %已标号点的距离换成无穷[t, u] = min(temp); %找标号值最小的顶点visited(u) = 1; %标记已经标号的顶点endmypath = [];if parent(db) ~= 0 %如果存在路!t = db; mypath = [db];while t ~= sb %从终点db开始回溯p = parent(t);mypath = [p mypath];t = p;endendmydistance = distance(db);例题:运筹学教材P205 第七题D=[0 3 6 1 inf inf inf inf;inf 0 2 inf 4 6 inf inf;inf inf 0 inf inf 5 inf inf;inf inf 4 0 inf 3 6 inf;inf inf inf inf 0 inf inf 7;inf inf inf inf inf 0 7 11;inf inf inf inf inf inf 0 8;inf inf inf inf inf inf inf 0]在command window输入:[mydistance,mypath]=mydijkstra(D,1,8);。

最短路dijkstra算法详解

最短路dijkstra算法详解

最短路dijkstra算法详解最短路问题是图论中的一个经典问题,其目标是在给定图中找到从一个起点到其他所有节点的最短路径。

Dijkstra算法是解决最短路问题的一种常用算法,本文将详细介绍Dijkstra算法的原理、实现以及时间复杂度等相关内容。

一、Dijkstra算法的原理Dijkstra算法是一种贪心算法,其基本思想是从起点开始,逐步扩展到其他节点。

具体而言,Dijkstra算法通过维护一个集合S来记录已经找到了最短路径的节点,以及一个数组dist来记录每个节点到起点的距离。

初始时,S集合为空,dist数组中除了起点外所有节点都被初始化为无穷大。

接下来,重复以下步骤直到所有节点都被加入S集合:1. 从dist数组中选择距离起点最近的未加入S集合的节点u;2. 将u加入S集合;3. 更新与u相邻的未加入S集合的节点v的距离:如果从起点出发经过u可以得到更短的路径,则更新v对应位置上dist数组中存储的值。

重复以上步骤直至所有节点都被加入S集合,并且dist数组中存储了每个节点到起点的最短距离。

最后,根据dist数组中存储的信息可以得到起点到任意节点的最短路径。

二、Dijkstra算法的实现在实现Dijkstra算法时,需要使用一个优先队列来维护未加入S集合的节点,并且每次从队列中选择距离起点最近的节点。

由于C++标准库中没有提供优先队列,因此需要手动实现或者使用第三方库。

以下是一个基于STL堆实现的Dijkstra算法代码示例:```c++#include <iostream>#include <vector>#include <queue>using namespace std;const int INF = 0x3f3f3f3f;vector<pair<int, int>> adj[10001];int dist[10001];void dijkstra(int start) {priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;pq.push(make_pair(0, start));dist[start] = 0;while (!pq.empty()) {int u = pq.top().second;pq.pop();for (auto v : adj[u]) {if (dist[u] + v.second < dist[v.first]) {dist[v.first] = dist[u] + v.second;pq.push(make_pair(dist[v.first], v.first));}}}}int main() {int n, m, start;cin >> n >> m >> start;for (int i = 1; i <= n; i++) {dist[i] = INF;}for (int i = 1; i <= m; i++) {int u, v, w;cin >> u >> v >> w;adj[u].push_back(make_pair(v, w));}dijkstra(start);for (int i = 1; i <= n; i++) {if (dist[i] == INF) {cout << "INF" << endl;} else {cout << dist[i] << endl;}}return 0;}```以上代码中,adj数组用于存储图的邻接表,dist数组用于存储每个节点到起点的最短距离。

matlab实现dijkstra算法

matlab实现dijkstra算法

matlab实现dijkstra算法Matlab实现Dijkstra算法第一段:什么是Dijkstra算法,为什么它重要?Dijkstra算法是一种用于解决最短路径问题的经典算法。

它由荷兰计算机科学家Edsger Dijkstra在1956年提出,被广泛应用于网络路由、地图导航和图论等领域。

该算法的核心思想是在给定的带权图中找到从起点到终点的最短路径,通过迭代的方式逐步推进,直到找到最短路径或处理完所有节点。

Dijkstra算法被广泛认为是一种高效、可靠的解决方案,具有良好的理论基础和实际应用性。

第二段:如何在Matlab中实现Dijkstra算法?在Matlab中实现Dijkstra算法,可以分为以下几个步骤:1. 创建带权图:我们需要将问题转化为带权图的形式。

在Matlab中,可以使用邻接矩阵来表示图的连接关系,其中每个边的权重存储在矩阵中的对应位置。

2. 初始化距离和路径:将起点到每个节点的距离初始化为无穷大,并为每个节点设置一个空路径。

将起点的距离设置为0,表示起点到自身的距离为0。

3. 遍历节点:循环遍历所有节点,找到距离起点最近的节点,并标记为已访问。

更新与该节点相邻节点的距离和路径信息。

如果经过当前节点到达某个相邻节点的距离更短,则更新该节点的距离和路径。

4. 重复步骤3,直到所有节点都被遍历为止。

这样,我们就能得到从起点到其他节点的最短路径信息。

第三段:个人观点和理解Dijkstra算法是解决最短路径问题的经典算法之一,它具有广泛的应用价值。

在日常生活中,我们经常需要找到最佳的路径规划,例如快递员送货时选择最短路径、地铁或公交车乘客选择最快到达目的地的路线等。

对于这些问题,Dijkstra算法可以提供一个可靠、高效的解决方案。

在使用Matlab实现Dijkstra算法时,我们可以利用Matlab强大的矩阵运算能力和易用的函数库来简化算法的实现过程。

Matlab还提供了丰富的可视化工具,可以帮助我们直观地展示算法执行过程和结果。

matlab最短路径

matlab最短路径

matlab最短路径在计算机科学中,最短路径问题是一个经典的问题,它涉及到在图形或网络中找到两个点之间的最短路径。

这个问题可以用许多不同的算法来解决,其中一种是Dijkstra算法,它是一种贪婪算法,用于解决单源最短路径问题。

Matlab提供了一种方便的方法来计算最短路径,使用Matlab中的图形对象和图形算法工具箱。

下面是一个简单的例子,演示如何使用Matlab计算最短路径:1. 首先,创建一个图形对象,可以使用Matlab中的graph函数。

2. 接着,添加节点和边到图形对象中,可以使用addnode和addedge函数。

3. 然后,使用shortestpath函数计算从一个起点到一个终点的最短路径。

4. 最后,使用plot函数绘制最短路径。

这里是一个使用Matlab计算最短路径的示例代码:% 创建一个图形对象g = graph();% 添加节点到图形对象g = addnode(g, {'A', 'B', 'C', 'D', 'E', 'F'});% 添加边到图形对象g = addedge(g, 'A', 'B', 1);g = addedge(g, 'A', 'C', 2);g = addedge(g, 'B', 'D', 3);g = addedge(g, 'C', 'D', 1);g = addedge(g, 'C', 'E', 1);g = addedge(g, 'D', 'F', 2);g = addedge(g, 'E', 'F', 2);% 计算最短路径p = shortestpath(g, 'A', 'F');% 绘制最短路径plot(g, 'EdgeLabel', g.Edges.Weight);highlight(g, p, 'EdgeColor', 'r', 'LineWidth', 2);这个例子创建了一个包含6个节点和7条边的图形对象,使用Dijkstra算法计算从节点A到节点F的最短路径,并绘制了这条路径。

最短路算法伪代码

最短路算法伪代码

最短路算法伪代码1. 引言最短路算法是一种在图中计算两个节点之间最短路径的算法。

它被广泛应用于网络路由、城市规划、物流配送等领域。

本文将介绍最短路算法的常见实现方式和伪代码,以便读者更好地理解和掌握。

2. Dijkstra算法Dijkstra算法是一种基于贪心算法的最短路算法。

这个算法首先会把起点到各个节点的距离初始化成无限大,然后从起点开始,不停地寻找距离起点最近的一个节点,进而更新与这个节点相邻的节点的距离。

具体操作过程如下:1. 初始化:定义一个dist数组(dist[i]表示起点到i节点的距离)和一个visited数组(记录节点是否已访问);将dist数组初始为无穷大,将visited数组初始为false;将起点s的dist[s]设为0。

2. 迭代找出距离起点最短的节点:从未访问的节点中选出距离起点最近的节点u;设该节点为visited,对与节点u相邻的节点v进行操作。

3. 更新与节点u相邻的节点v的距离:若dist[u]+w(u,v)<dist[v],则更新dist[v]=dist[u]+w(u,v),其中w(u,v)表示节点u和节点v之间的边权。

4. 重复2、3步骤,直至所有节点都被访问过。

Dijkstra算法的时间复杂度为O(N^2),其中N表示节点数。

如果利用堆优化可以将时间复杂度降为O(MlogN),其中M表示边数。

3. Bellman-Ford算法Bellman-Ford算法是另一种基于动态规划的最短路算法。

该算法对边进行松弛操作,直到找到最短路或者判断出存在负权环。

其具体操作过程如下:1. 初始化:定义一个dist数组(dist[i]表示起点到i节点的距离);将dist数组初始为无穷大,将dist[s]设为0。

2. 迭代进行松弛操作:进行V-1轮松弛操作,其中V表示节点数;每轮松弛操作都会遍历图中所有的边,对每条边进行更新。

3. 检查是否存在负权环:进行第N轮松弛操作,当存在松弛操作后dist数组还能再次更新时,就意味着存在负权环。

metlab最短路标号法代码及结果

metlab最短路标号法代码及结果

metlab最短路标号法代码及结果MATLAB 最短路-标号法代码函数代码function [min,path]=dijkstra(w,start,terminal)n=size(w,1); label(start)=0; f(start)=start;for i=1:nif i~=startlabel(i)=inf;end, ends(1)=start; u=start;while length(s)for i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;end, endif ins==0v=i;if label(v)>(label(u)+w(u,v))label(v)=(label(u)+w(u,v)); f(v)=u;end, end, endv1=0;k=inf;for i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;end, endif ins==0v=i;if k>label(v)k=label(v); v1=v;u=v1;endmin=label(terminal); path(1)=terminal; i=1;while path(i)~=startpath(i+1)=f(path(i));i=i+1 ;endpath(i)=start;L=length(path);path=path(L:-1:1);脚本代码weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf;inf inf 4 inf 0 0.5 3;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight, i,j) 输出结果>> weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf;inf inf 4 inf 0 0.5 3;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight,1,4)dis =5path =0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf;inf inf 4 inf 0 0.5 3;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight,1,5) dis = 8.5000path =1 2 4 6 5>> weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf;inf inf 4 inf 0 0.5 3;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight,1,7)dis =9.5000path =1 2 4 6 7>> weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf;inf inf 4 inf 0 0.5 3;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight,4,5) dis =>> weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf;inf inf 4 inf 0 0.5 3;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight,4,7) dis = 4.5000path =4 6 7>> weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf; inf inf 4 inf 0 0.5 3; inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight,5,7)dis =2path =5 6 7>> weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf;inf inf 4 inf 0 0.5 3;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;path =7 6 4 2 1>> weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf;inf inf 4 inf 0 0.5 3;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight,5,1) dis =8.5000path =5 6 4 2 1>> weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf;inf inf 4 inf 0 0.5 3;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight,4,1) dis =5path =4 2 1>> weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight,5,4)dis =3.5000path =5 6 4>> weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf;inf inf 4 inf 0 0.5 3;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight,7,4) dis = 4.5000path =7 6 4>> weight=[0 3 5 inf inf inf inf;3 0 inf 2 inf inf inf ;5 inf 0 1.5 4 inf inf;inf 2 1.5 0 inf 3 inf;inf inf 4 inf 0 0.5 3;inf inf inf 3 0.5 0 1.5;inf inf inf inf 3 1.5 inf;]; [dis, path]=dijkstra(weight,7,5) dis = 2path =7 6 5。

matlab 单源最短路径

matlab 单源最短路径

matlab 单源最短路径Matlab单源最短路径算法是计算机科学中非常重要的算法之一,该算法可以解决许多实际问题。

本文将针对Matlab单源最短路径,进行详细介绍。

1.问题的定义:对于一个带权无向图,如何从其中的某一节点出发,找到到其他节点的最短路径?2.算法思想:Dijkstra算法是解决单源最短路径问题的一个经典算法。

该算法基于贪心思想,每次选择当前距离源点最近的一个没有确定最短路径的点作为下一步的目标,并依据这个点来更新其余点到源点的距离。

3.算法流程(1)初始化:将源点标记为已确定最短路径,将源点到其余点的距离赋值给初始路径。

(2)迭代:对于未确定最短路径的点,选择距离源点最近的点标记为已确定最短路径,更新其余点到源点的距离。

(3)结束条件:当所有节点都被标记为最短路径或者无法到达时,算法结束。

4.算法实现:以一个典型的图作为例子,展示Dijkstra算法在Matlab中的实现过程。

由于在Matlab中没有提供图数据结构,我们需要手动定义节点和边的信息。

这里我们采用数组来存储节点和边的信息,如下:G = sparse([1 1 1 2 2 3 3 4],... %边所连接的节点[2 3 4 3 4 4 5 5],...[2 1 5 3 2 3 1 3],... %边的权值5,5); %定义图的大小此时,G表示一个含有5个节点和8条边的无向图,权值保存在3行中。

接下来,定义源点、初始路径、标记点位,并进行循环计算。

在每一次循环中,找到当前未标记节点中距离源点最短的节点,将其标记,更新其余节点到源点的距离,并赋值到路径变量中。

5.算法应用:Matlab的单源最短路径算法可应用于很多实际问题中。

除了传统的路由算法,也可应用于社交网络中的用户推荐、电子商务中的商品推荐等多个领域。

综上所述,Matlab单源最短路径算法是计算机科学中非常重要的算法之一,具有广泛的应用场景。

如果读者想要深入学习该算法,可以通过Matlab提供的简单实例进行探索。

最短路dijkstra算法Matlab程序

最短路dijkstra算法Matlab程序

function [c0,c,path0,path]=dijkstra(s,t,C,flag)% Use the Dijkstra's algorithm to find the shortest path from% s to t and can also find the shortest path between s and all% the other points.% Reference: Graph Theory with Applications by J. A. Bondy and% U. S. R. Murty.% Input -- s is the starting point and also is the point s.% -- t is the given terminal point and is the point t.% -- C \in R^{n \times n}is the cost matrix, where% C(i,j)>=0 is the cost from point i to point j.% If there is no direct connection between point i and% j, C(i,j)=inf.% -- flag: if flag=1, the function just reports the% shortest path between s and t; if flag~=1, the% function reports the shortest path between s and t,% and the shortest paths between s and other points.% Output -- c0 is the minimal cost from s to t.% -- path0 denotes the shortest path form s to t.% -- c \in R{1\times n} in which the element i is the% minimal cost from s to point i.% -- path \in R^{n \times n} in which the row i denotes% the shortest path from s to point i.% Copyright by MingHua Xu(徐明华), Changhzou University, 27 Jan. 2014. s=floor(s);t=floor(t);n=size(C,1);if s<1 || t < 1 || s > n || t > nerror(' The starting point and the terminal point exceeds the valid range');endif t==sdisp('The starting point and the terminal point are the same points');endlabel=ones(1,n)*inf;label(s)=0;S=[s];Sbar=[1:s-1,s+1:n];c0=0;path=zeros(n,n);path(:,1)=s;c=ones(1,n)*inf;parent=zeros(1,n);i=1; % number of points in point set S.while i<n% for each point in Sbar, replace label(Sbar(j)) by% min(label(Sbar(j)),label(S(k))+C(S(k),Sbar(j)))for j=1:n-ifor k=1:iif label(Sbar(j)) > label(S(k))+C(S(k),Sbar(j))label(Sbar(j))=label(S(k))+C(S(k),Sbar(j));parent(Sbar(j))=S(k);endendend% Find the minmal label(j), j \in Sbar.temp=label(Sbar(1));son=1;for j=2:n-iif label(Sbar(j))< temptemp=label(Sbar(j));son=j;endend% update the point set S and SbarS=[S,Sbar(son)];Sbar=[Sbar(1:son-1),Sbar(son+1:n-i)];i=i+1;% if flag==1, just output the shortest path between s and t.if flag==1 && S(i)==tson=t;temp_path=[son];if son~=swhile parent(son)~=sson=parent(son);temp_path=[temp_path,son];endtemp_path=[temp_path,s];endtemp_path=fliplr(temp_path);m=size(temp_path,2);path0(1:m)=temp_path;c_temp=0;for j=1:m-1c_temp=c_temp+C(temp_path(j),temp_path(j+1));endc0=c_temp;path(t,1:m)=path0;c(t)=c0;returnendend% Form the output resultsfor i=1:nson=i;temp_path=[son];if son~=swhile parent(son)~=sson=parent(son);temp_path=[temp_path,son];endtemp_path=[temp_path,s];endtemp_path=fliplr(temp_path);m=size(temp_path,2);path(i,1:m)=temp_path;c_temp=0;for j=1:m-1c_temp=c_temp+C(temp_path(j),temp_path(j+1));endc(i)=c_temp;c0=c(t);path0=path(t,:);endreturn。

暴强Dijkstra算法求任意两点间最短路径(matlab程序)

暴强Dijkstra算法求任意两点间最短路径(matlab程序)

暴强D i j k s t r a算法求任意两点间最短路径(m a t l a b程序)-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN效果展示:开头输入的是点的序列号(表示第几个点),显示的是最短路径的走法(同样以点的序列号显示,表示途径的第几个点)。

%编写m文件function [distance,path]=dijkstra(A,s,e)% [DISTANCE,PATH]=DIJKSTRA(A,S,E)% returns the distance and path between the start node and the end node.%% A: adjcent matrix% s: start node% e: end node% initializen=size(A,1); % node numberD=A(s,:); % distance vectorpath=[]; % path vectorvisit=ones(1,n); % node visibilityvisit(s)=0; % source node is unvisibleparent=zeros(1,n); % parent node% the shortest distancefor i=1:n-1 % BlueSet has n-1 nodestemp=zeros(1,n);count=0;for j=1:nif visit(j)temp=[temp(1:count) D(j)];elsetemp=[temp(1:count) inf];endcount=count+1;end[value,index]=min(temp);j=index; visit(j)=0;for k=1:nif D(k)>D(j)+A(j,k)D(k)=D(j)+A(j,k);parent(k)=j;endendenddistance=D(e);% the shortest distance pathif parent(e)==0return;endpath=zeros(1,2*n); % path preallocationt=e; path(1)=t; count=1;while t~=s && t>0p=parent(t);path=[p path(1:count)];t=p;count=count+1;endif count>=2*nerror(['The path preallocation length is too short.',... 'Please redefine path preallocation parameter.']);endpath(1)=s;path=path(1:count);%算法实现clc; clear; close all;%% 载入设置数据lines = load(''); %点与点之间的距离矩阵A=lines;A(find(A>10))=inf; %对步长的限制,根据自己的要求决定!我们在此选择10. % A就是连接矩阵,其中对角线为0,表示本身% 有连接关系的就对应线的长度% 没有连接关系的就对应inf%% 下面的是dijstra算法,有两种方式可以调用s =input('输入起点'); % 起点(点的序号)e =input('输入终点'); % 终点(点的序号)[distance,path0] = dijkstra(A,s,e);fprintf('\n Use Dijkstra the Min Distance is: %.5f \n', distance);fprintf('\n Use Dijkstra the Min Distance path is: \n');disp(path0);A1 = A;A1(isinf(A1)) = 0;[d, p, pred] = graphshortestpath(sparse(A1), s, e);fprintf('\n Use graphshortestpath the Min Distance is: %.5f \n', d);fprintf('\n Use graphshortestpath the Min Distance path is: \n');disp(p);for i = 1 : length(path0)if i == length(path0)temp = [path0(1) path0(i)];elsetemp = [path0(i) path0(i+1)];endend。

基于MATLAB求解最短路问题

基于MATLAB求解最短路问题

基于MATLAB求解最短路问题1.引言MATLAB和Mathematica、Maple并称为三大数学软件。

它在数学类科技应用软件中在数值计算方面首屈一指。

通过本学期的学习了解和上机实践,已经初步掌握使用MATLAB工具解决实际问题的能力。

结合运筹学课程的学习,我考虑使用MATLAB求解最短路问题,而在所有求解最短路的方法中,Dijkstra算法是最为经典的一种,因此本文主要解决在MATLAB环境下使用Dijkstra算法求解最短路。

1.1 提出问题设6个城市v1,v2,......,v6之间的一个公路网(图1)每条公路为图中的边,边上的权数表示该段公路的长度(单位:百公里),设你处在城市v1,那么从v1到v6应选择哪一路径使你的费用最省。

1.2 分析问题这属于一个典型的求解最短路的问题,图中顶点代表六个城市,边上的权数表示该段公路的长度,题目所求为从v1到v6、的一条费用最省的路径,我们假设所需费用仅与路径长短有关,因此求费用最省的路径即求权值最小的路径。

网络图中各权值均为正,可以使用Dijkstra算法。

1.3 数据整理将网络图中各边的权作如下整理以方便程序运行W(1,2)=5; W(2,1)=5;W(1,3)=2; W(3,1)=2;W(2,3)=1; W(3,2)=1;W(2,4)=5; W(4,2)=5;W(2,5)=5; W(5,2)=5;W(3,4)=8; W(4,3)=8;W(3,5)=10; W(5,3)=10;W(4,5)=2; W(5,4)=2;W(4,6)=5; W(6,4)=5;W(5,6)=2; W(6,5)=2;2.数学原理2.1 Dijkstra算法介绍Dijkstra 算法思想为:设G=(V,E)是一个带权有向图(也可以是无向图,无向图是有向图的特例),把图中顶点集合V分成两组:第一组为已求出最短路径的顶点集合(用S 表示,初始时S 中只有一个源点,以后每求得一条最短路径,就将其加入到集合S 中,直到全部顶点都加入到S 中,算法就结束了);第二组为其余未确定最短路径的顶点集合(用U 表示),按最短路径长度的递增次序依次把第二组的顶点加入S 中。

Dijkstra算法,最短路径路由算法matlab代码

Dijkstra算法,最短路径路由算法matlab代码

Dijkstra算法,最短路径路由算法matlab代码Dijkstra算法是⼀种最短路径路由算法,⽤于计算⼀个节点到其他所有节点的最短路径。

主要特点是以起始点为中⼼向外层层扩展,直到扩展到终点为⽌。

Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率较低。

算法详细解释各⽹站都有,不太难。

下边是对下图从D开始到A节点寻找最短路径的matlab代码,个⼈原创。

%% Dijkstra算法%by Jubobolv369 at 2022/1/22clc;clear;close all;%% 初始化带权邻接矩阵,起点、终点等initRoute=[0 12 inf inf inf 16 14;12 0 10 inf inf 7 inf;inf 10 0 3 5 6 inf;inf inf 3 0 4 inf inf;inf inf 5 4 0 2 8;16 7 6 inf 2 0 9;14 inf inf inf 8 9 0;];[row,column]=size(initRoute);start_node=4;end_node=1;close_list=[];open_list=[];%closelist中加⼊初始节点close_list=[start_node,start_node,0];%% 如果closelist中没有终点,则遍历节点,通过⽐较逐渐加⼊节点到closelist。

while isempty(find(close_list(:,1) == end_node))[last1,~]=size(close_list);%获取closelist的最后⼀⾏的索引now_node=close_list(last1,1);%当前节点编号now_length=close_list(last1,3);%当前最优长度[last2,~]=size(open_list); %%获取openlist的最后⼀⾏的索引now_list=initRoute(now_node,:); %从原始矩阵中取初当前节点的边权值i=1;%% 更新openlistfor j=1:column%如果第j个节点可达、不是⾃⾝且不在close_list中,该点可能需要改动或添加到openlist中if now_list(j)~=inf && now_list(j)~=0 && isempty(find(close_list(:,1) == j))if last1==1open_list(i,1)=j;open_list(i,2)=now_node;open_list(i,3)=now_list(j);i=i+1;%如果不在openlist中,就将其添加到其中,否则将通过当前⽗节点到此节点的权值与之前的作⽐较elsek=find(open_list(:,1) == j);if isempty(k)open_list(last2+i,1)=j;open_list(last2+i,2)=now_node;open_list(last2+i,3)=now_list(j)+now_length;i=i+1;elseif open_list(k,3)>(now_list(j)+now_length) %若現在的路徑⾧度⼩,則更新路徑open_list(k,1)=j;open_list(k,1)=j;open_list(k,2)=now_node;open_list(k,3)=now_list(j)+now_length;endendendend%% 更新closelist和openlist。

Dijkstra、Floyd算法Matlab_Lingo实现

Dijkstra、Floyd算法Matlab_Lingo实现

Dijkstra算法Matlab实现。

%求一个点到其他各点的最短路径function [min,path]=dijkstra(w,start,terminal)%W是邻接矩阵%start是起始点Array %terminal是终止点%min是最短路径长度%path是最短路径n=size(w,1);label(start)=0;f(start)=start;for i=1:nif i~=startlabel(i)=inf;endends(1)=start;u=start;while length(s)<nfor i=1:nins=0;forif i==s(j)ins=1;endendif ins==0v=i;if label(v)>(label(u)+w(u,v))label(v)=(label(u)+w(u,v));f(v)=u;endendendv1=0;k=inf;for i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;endend-if ins==0v=i;if k>label(v)k=label(v);v1=v;endendends(length(s)+1)=v1;u=v1;endmin=label(terminal);path(1)=terminal;i=1;while path(i)~=startpath(i+1)=f(path(i));i=i+1 ;endpath(i)=start;L=length(path);path=path(L:-1:1);Floyd算法:matlab程序:%floyd算法,function [D,path,min1,path1]=floyd(a,start,terminal)%a是邻接矩阵%start是起始点%terminal是终止点%D是最小权值表D=a;n=size(D,1);path=zeros(n,n);for i=1:nfor j=1:nif D(i,j)~=infpath(i,j)=j;endendendfor k=1:nfor i=1:nfor j=1:nif D(i,k)+D(k,j)<D(i,j)-D(i,j)=D(i,k)+D(k,j);path(i,j)=path(i,k);endendendendif nargin==3min1=D(start,terminal);m(1)=start;i=1;path1=[ ];while path(m(i),terminal)~=terminalk=i+1;m(k)=path(m(i),terminal);i=i+1;endm(i+1)=terminal;path1=m;end1 6 5 5 5 66 2 3 4 4 65 2 3 4 5 45 2 3 4 5 61 4 3 4 5 11 2 4 4 1 6Floyd算法:Lingo程序:!用LINGO11.0编写的FLOYD算法如下;model:sets:nodes/c1..c6/;link(nodes,nodes):w,path; !path标志最短路径上走过的顶点;endsetsdata:path=0;w=0;@text(mydata1.txt)=@writefor(nodes(i):@writefor(nodes(j):-@format(w(i,j),' 10.0f')),@newline(1));@text(mydata1.txt)=@write(@newline(1));@text(mydata1.txt)=@writefor(nodes(i):@writefor(nodes(j):@format(path(i,j),' 10.0f')),@newline(1));enddatacalc:w(1,2)=50;w(1,4)=40;w(1,5)=25;w(1,6)=10;w(2,3)=15;w(2,4)=20;w(2,6)=25;w(3,4)=10;w(3,5)=20;w(4,5)=10;w(4,6)=25;w(5,6)=55;@for(link(i,j):w(i,j)=w(i,j)+w(j,i));@for(link(i,j) |i#ne#j:w(i,j)=@if(w(i,j)#eq#0,10000,w(i,j)));@for(nodes(k):@for(nodes(i):@for(nodes(j):tm=@smin(w(i,j),w(i,k)+w(k,j));path(i,j)=@if(w(i,j)#gt# tm,k,path(i,j));w(i,j)=tm)));endcalcend无向图的最短路问题Lingomodel:sets:cities/1..5/;roads(cities,cities):w,x;endsetsdata:w=0;enddatacalc:w(1,2)=41;w(1,3)=59;w(1,4)=189;w(1,5)=81;w(2,3)=27;w(2,4)=238;w(2,5)=94;w(3,4)=212;w(3,5)=89;w(4,5)=171;@for(roads(i,j):w(i,j)=w(i,j)+w(j,i));@for(roads(i,j):w(i,j)=@if(w(i,j) #eq# 0, 1000,w(i,j)));endcalcn=@size(cities); !城市的个数;min=@sum(roads:w*x);@for(cities(i)|i #ne#1 #and# i #ne#n:@sum(cities(j):x(i,j))=@sum(cities(j):x(j,i)));@sum(cities(j):x(1,j))=1;-@sum(cities(j):x(j,1))=0; !不能回到顶点1;@sum(cities(j):x(j,n))=1;@for(roads:@bin(x));endLingo编的sets:dian/a b1 b2 c1 c2 c3 d/:;link(dian,dian)/a,b1 a,b2 b1,c1 b1,c2 b1,c3 b2,c1 b2,c2 b2,c3 c1,d c2,d c3,d/:x,w;endsetsdata:w=2 4 3 3 1 2 3 1 1 3 4;enddatamin=@sum(link:w*x);@for(link:@bin(x));n=@size(dian);@sum(link(i,j)|i#eq#1:x(i,j))=1;@sum(link(j,i)|i#eq#n:x(j,i))=1;@for(dian(k)|k#ne#1#and#k#ne#n:@sum(link(i,k):x(i,k))=@sum(link(k,i):x(k,i)));- sets:dian/1..5/:level; !level(i)表示点i的水平,用来防止生产圈;link(dian,dian):d,x;endsetsdata:d=0 41 59 189 8141 0 27 238 9459 27 0 212 89189 238 212 0 17181 94 89 171 0;enddatan=@size(dian);min=@sum(link(i,j)|i#ne#j:d(i,j)*x(i,j));@sum(dian(j)|j#gt#1:x(1,j))>1;@for(dian(i)|i#gt#1:@sum(dian(j)|j#ne#i:x(j,i))=1);@for(dian(i)|i#gt#1:@for(dian(j)|j#ne#i#and#j#gt#1:level(j)>level(i)+x(i,j)-(n-2)*(1-x(i,j))+(n-3)*x(j, i)));@for(dian(i)|i#gt#1:level(i)<n-1-(n-2)*x(1,i));@for(dian(i)|i#gt#1:@bnd(1,level(i),100000));@for(link:@bin(x));。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Dijkstra求解最短路(含注释)
function [P,D]=dijkstra_pt(A,sv)
%Dijkstra法求解最短路
%A为邻接矩阵;
%sv为寻求最短路的起始点
%P为所有点的P标号,即路权值
%D为sv到所有结点的最短路径矩阵
%2010年8月28日凌晨1:41
[n,n]=size(A);
s=sv;
T=inf.*ones(1,n);%T标号初始化
P=inf.*ones(1,n);%P标号初始化
Tv=1:1:n;%具有T标号的点,初始时,所有点均为T标号
v=zeros(1,n);%结点的前驱,初始时,均为0
Tm=zeros(n,n);%所有点从P标号变为T标号的过程矩阵
P(s)=0;
for i=1:n%将所有结点从P标号变为T标号的过程
Pv(i)=s;%Pv具有P标号的结点
Tv=Tmark(Tv,s);%删去具有P标号的结点
Tm(s,:)=A(s,:);
for k=Pv%将具有P标号的点赋值无穷大,从而不影响后面的程序取最小值Tm(s,k)=inf;
T(k)=inf;
end
for k=Tv%一次修改P标号点所对应的T标号点的T标号
Tm(s,k)=Tm(s,k)+P(s);
end
for k=Tv
[x,val]=min([T(k),Tm(s,k)]);
T(k)=x;%二次修改P标号点所对应的T标号点的T标号
if val==2
v(k)=s;%修改P标号点所对应的T标号点的前驱
end
end
[x,val]=min(T);%寻找P标号点
if x==inf
break;
end
s=val;
P(s)=x;%修改P标号
end
%下面求解从sv到各点的最短路矩阵
aad=zeros(1,n);%最短路临时存储向量
for i=n:-1:1
w=i;
for k=1:n%将sv到i点的最短路倒序存储在aad中if w==0
break;
end
aad(k)=w;
w=v(w);
if w==sv
aad(k+1)=w;
break;
end
end
for l=1:n%将sv到i点的最短路顺序存储在D中if aad(l)==sv
k=1;
for j=l:-1:1
D(i,k)=aad(j);
k=k+1;
end
end
end
aad=zeros(1,n);
end
[g,h]=size(D);
for i=1:g%将与最短路径无关的点赋值NaN
for j=1:h%con由上面计算得到
if D(i,j)==0
D(i,j)=NaN;
end
end
end
%下面为在T标号结点集合中删除P标号的子函数function Tvad=Tmark(Tv,vm)
tg=length(Tv);
for i=1:tg
if Tv(i)==vm;
wd=i;break;
end
end
Tvad=[Tv(1,1:wd-1),Tv(1,wd+1:tg)];。

相关文档
最新文档