最大流算法MATLAB

最大流算法MATLAB
最大流算法MATLAB

从一个可行流f 开始, 求最大流的Ford--Fulkerson 标号算法的基本步骤:

⑴ 标号过程

① 给发点 v s 以标号(+, +∞) , d s = +∞.

② 选择一个已标号的点 x, 对于x 的所有未给标号的邻接点y, 按下列规则处理:

当 yx∈E, 且f yx >0 时, 令d y = min { f yx , d x }, 并给y 以标号 ( x ? , d y ).

当 xy∈E, 且f xy<C xy 时, 令d y = min {C xy ? f xy , d x }, 并给y 以标号 ( x +, d y ).

③ 重复②直到收点v t 被标号或不再有点可标号时为止. 若v t 得到标号, 说明存在一条

可增广链, 转⑵调整过程; 若v t 未得到标号, 标号过程已无法进行时, 说明f 已经是最大流.

⑵ 调整过程

④ 决定调整量d =d vt , 令u = v t .

⑤ 若 u 点标号为( v +, d u ), 则以f vu + d 代替 f vu ; 若u 点标号为( v ?, d u ), 则以f vu ? d

代替 f vu.

⑥ 若 v = v s, 则去掉所有标号转⑴重新标号; 否则令u = v, 转⑤.

算法终止后, 令已有标号的点集为S, 则割集(S, S c )为最小割, 从而W f = C (S, S c ).

例1 求图 6-19 所示网络的最大流.

利用 Ford--Fulkerson 标号法求最大流算法的MATLAB 程序代码如下:

n=8;C=[0 5 4 3 0 0 0 0

0 0 0 0 5 3 0 0

0 0 0 0 0 3 2 0

0 0 0 0 0 0 2 0

0 0 0 0 0 0 0 4

0 0 0 0 0 0 0 3

0 0 0 0 0 0 0 5

0 0 0 0 0 0 0 0]; %弧容量

for(i=1:n)for(j=1:n)f(i,j)=0;end;end %取初始可行流f 为零流

for(i=1:n)No(i)=0;d(i)=0;end %No,d 记录标号

while(1)

No(1)=n+1;d(1)=Inf; %给发点vs 标号

while(1)pd=1; %标号过程

for(i=1:n)if(No(i)) %选择一个已标号的点vi

for(j=1:n)if(No(j)==0&f(i,j)

No(j)=i;d(j)=C(i,j)-f(i,j);pd=0;

if(d(j)>d(i))d(j)=d(i);end

elseif(No(j)==0&f(j,i)>0) %对于未给标号的点vj, 当vjvi 为非零流弧时

No(j)=-i;d(j)=f(j,i);pd=0;

if(d(j)>d(i))d(j)=d(i);end;end;end;end;end

if(No(n)|pd)break;end;end%若收点vt 得到标号或者无法标号, 终止标号过程

if(pd)break;end %vt 未得到标号, f 已是最大流, 算法终止

dvt=d(n);t=n; %进入调整过程, dvt 表示调整量

while(1)

if(No(t)>0)f(No(t),t)=f(No(t),t)+dvt; %前向弧调整

elseif(No(t)<0)f(No(t),t)=f(No(t),t)-dvt;end %后向弧调整

if(No(t)==1)for(i=1:n)No(i)=0;d(i)=0; end;break;end %当t 的标号为vs 时, 终止调整过程 t=No(t);end;end; %继续调整前一段弧上的流f

wf=0;for(j=1:n)wf=wf+f(1,j);end %计算最大流量

f %显示最大流

wf %显示最大流量

No %显示标号, 由此可得最小割, 程序结束

最短路径的Dijkstra算法及Matlab程序

两个指定顶点之间的最短路径 问题如下:给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,找一条最短铁路线。 以各城镇为图G 的顶点,两城镇间的直通铁路为图G 相应两顶点间的边,得图G 。对G 的每一边e ,赋以一个实数)(e w —直通铁路的长度,称为e 的权,得到赋权图G 。G 的子图的权是指子图的各边的权和。问题就是求赋权图G 中指定的两个顶点00,v u 间的具最小权的轨。这条轨叫做00,v u 间的最短路,它的权叫做00,v u 间的距离,亦记作),(00v u d 。 求最短路已有成熟的算法:迪克斯特拉(Dijkstra )算法,其基本思想是按距0u 从近到远为顺序,依次求得0u 到G 的各顶点的最短路和距离,直至0v (或直至G 的所有顶点),算法结束。为避免重复并保留每一步的计算信息,采用了标号算法。下面是该算法。 (i) 令0)(0=u l ,对0u v ≠,令∞=)(v l ,}{00u S =,0=i 。 (ii) 对每个i S v ∈(i i S V S \=),用 )}()(),({min uv w u l v l i S u +∈ 代替)(v l 。计算)}({min v l i S v ∈,把达到这个最小值的一个顶点记为1+i u ,令}{11++=i i i u S S 。 (iii). 若1||-=V i ,停止;若1||-

最短路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 > n error(' The starting point and the terminal point exceeds the valid range'); end if t==s disp('The starting point and the terminal point are the same points'); end label=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 label(S(k))+C(S(k),Sbar(j)) label(Sbar(j))=label(S(k))+C(S(k),Sbar(j)); parent(Sbar(j))=S(k); end end

dijkstra算法的matlab实现

学号: 课程设计 题目Dijkstra算法的MATLAB实现 学院信息工程学院 专业通信工程 班级 姓名 指导教师 2012 年 1 月9 日 课程设计任务书 学生姓名:专业班级:通信 0901班 指导教师:工作单位:信息工程学院 题目: Dijkstra算法的MATLAB实现 初始条件: (1)MATLAB应用软件的基本知识以及基本操作技能 (2)高等数学、线性代数等基础数学中的运算知识 (3)数据结构里面关于Dijkstra算法的基本原理和思想 要求完成的主要任务: 必做题:采用MATLAB选用适当的函数或矩阵进行如下计算 (1)极限的计算、微分的计算、积分的计算、级数的计算、求解代数方程、求解常微分方程; (2)矩阵的最大值、最小值、均值、方差、转置、逆、行列式、特征值的计算、矩阵的相乘、右除、左除、幂运算;

(3)多项式加减乘除运算、多项式求导、求根和求值运算、多项式的部分分式展开、多项式的拟合、插值运算。 选做题:Dijkstra算法的MATLAB实现 时间安排: 第一周,安排任务地点:鉴主17楼实验室 第1-17,周仿真设计地点:鉴主13楼计算机实验室 第18周,完成答辩,提交报告地点:鉴主17楼实验室 指导教师签名:年月日 系主任(或责任教师)签名:年月

目录 摘要................................................................................................................................. I Abstract ......................................................................................................................... II 1 MATLAB的基本运算 .. 0 1.1 基础微积分计算 0 1.1.1 极限的基本运算 0 1.1.2 微分的计算 0 1.1.3 积分的计算 (1) 1.1.4 级数的运算 (1) 1.1.5 求解代数微分方程 (1) 1.1.6 求解常微分方程 (2) 1.2 矩阵的基本运算 (2) 1.2.1 矩阵的最大最小值 (2) 1.2.2 矩阵的均值方差 (3) 1.2.3 矩阵的转置和逆 (3) 1.2.4 矩阵的行列式 (3) 1.2.5 矩阵特征值的计算 (3) 1.2.6 矩阵的相乘 (4) 1.2.7 矩阵的右除和左除 (4) 1.2.8 矩阵的幂运算 (4) 1.3 多项式的基本运算 (4) 1.3.1 多项式的四则运算 (4) 1.3.2 多项式的求导、求根、求值运算 (5) 1.3.3 多项式的部分分式展开 (5) 1.3.4 多项式的拟合 (5) 1.3.5 多项式的插值运算 (6) 2关于Dijkstra的问题描述 (6) 2.1问题的提出 (6) 2.2 Dijkstra算法的算法思想 (7) 2.3 Dijkstra算法的算法原理 (7) 3 Dijkstra算法的设计分析 (8) 3.1 Dijkstra算法部分的设计分析 (8) 3.2 程序主体的设计分析 (9) 4程序源代码与算法思想 (10) 4.1 文件isIn.m的源代码 (10) 4.2 文件default_dat.m的源代码 (11) 4.3 文件input_dat.m的源代码 (11) 4.4 文件menu.m的源代码 (11) 4.5 文件dijkstra.m的源代码 (13) 5 测试报告 (16) 6 心得体会 (17) 7 参考文献 (18)

dijkstra算法原理及MATLAB代码

Dijkstra算法是寻找最短路径的一种搜索算法,由荷兰科学家提出。 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径, 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v 到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。 2)算法步骤: a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点, 即:U={其余顶点},若v与U中顶点u有边,则正常有权值,若u不是v的出边邻接点,则权值为∞。 b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k 的最短路径长度)。 c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经 过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。 d.重复步骤b和c直到所有顶点都包含在S中。 算法描述:通过为每个节点保留目前为止所找到的从s到e的最短路径。为了记录最佳路径轨迹,记录路径上每个节点的前趋,通过回溯法找出最短路径轨迹。

过程如下: 在网上搜索一些版本的Matlab实现方法,感觉都有些毛病。经过修改,得到比较好的效果。[cpp]view plain copy 1.function [ distance path] = Dijk( W,st,e ) 2.%DIJK Summary of this function goes here 3.% W 权值矩阵 st 搜索的起点 e 搜索的终点 4.n=length(W);%节点数 5. D = W(st,:); 6.visit= ones(1:n); visit(st)=0; 7.parent = zeros(1,n);%记录每个节点的上一个节点 8. 9.path =[]; 10. 11.for i=1:n-1

Dijkstra算法

最短路径—Dijkstra算法 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。 问题描述:在无向图G=(V,E) 中,假设每条边E[i] 的长度为w[i],找到由顶点V0 到其余各点的最短路径。(单源最短路径) 2.算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S 中只有一个源点,以后每求得一条最短路径, 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。 2)算法步骤: a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边, 则正常有权值,若u不是v的出边邻接点,则权值为∞。 b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。 c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短, 则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。 d.重复步骤b和c直到所有顶点都包含在S中。 GPSR路由协议:(车载自组织网络中自适应路由协议研究_李诗雨) 2>基于地理位置的路由 随着科技的发展,现在的车辆通常都会具有全球定位系统,利用这个系统, 车辆可以随时随地查找出自己的地理坐标。于是越来越多的学者开始利用这些定 位系统来制定新的路由,如Greedy Perimeter Stateless Routing(GPSR)}ZO}。GPSR 是影响最广和应用范围最大的一个路由协议。它脱离了传统路由协议需要维护一 个全局静态路由,需要时刻去查看该路由的有效性的方式,而开始将更多的注意 力放到车辆四周的临近车辆,只依赖它们进行短距离的路由计算。在GPSR协议 中[[21],网络节点都可以通过GPS等方法获取自身的地理位置,源节点在发送数据 时会在报文里加入目的节点的GPS坐标,在后面每一跳节点都会查找自己的邻居 车辆,在其中找到一个距离目的节点在地理位置上最近的节点作为下一跳节点。

图论算法及matlab程序的三个案例

图论实验三个案例 单源最短路径问题 Dijkstra 算法 Dijkstra 算法是解单源最短路径问题的一个贪心算法。其基本思想是,设置一个顶点集合S 并不断地作贪心选择来扩充这个集合。一个顶点属于集合S 当且仅当从源到该顶点的最短路径长度已知。设v 是图中的一个顶点,记()l v 为顶点 v 到源点v 1的最短距离, ,i j v v V ?∈,若 (,)i j v v E ?,记i v 到j v 的权ij w =∞。 Dijkstra 算法: ① 1{}S v =,1()0l v =;1{}v V v ??-,()l v =∞,1i =,1{}S V v =-; ② S φ=,停止,否则转③; ③ ()min{(),(,)} j l v l v d v v =, j v S ∈,v S ?∈; ④ 存在 1 i v +,使 1()min{()} i l v l v +=,v S ∈; ⑤ 1{} i S S v +=, 1{} i S S v +=-,1i i =+,转②; 实际上,Dijkstra 算法也是最优化原理的应用:如果12 1n n v v v v -是从1v 到 n v 的最短路径,则 12 1 n v v v -也必然是从1v 到 1 n v -的最优路径。 在下面的MATLAB 实现代码中,我们用到了距离矩阵,矩阵第i 行第j 行元 素表示顶点i v 到j v 的权ij w ,若i v 到j v 无边,则realmax ij w =,其中realmax 是 MATLAB 常量,表示最大的实数+308)。 function re=Dijkstra(ma)

利用MATLAB实现Dijkstra算法

利用计算机语言编程实现D算法 一:实验目的 本实验课程主要目的是让学生够熟练掌握图论中的D算法。 二:实验方法 选择MATLAB语言编程实现D算法。 三:实验要求 1.输入必要参数,包括:节点个数、节点间路径长度、给定节点; 2.输出给定节点到其它各节点的最短路径、径长; 3.节点间路径长度用矩阵形式表示。 四:实验内容 无向图共有7个节点,如下图所示。 v1 45 7 计算机输入的节点间路径长度为7×7矩阵: 1234567 1 2 3 4 5 6 7 0123 106 2054 304 5407 6408 780?? ∞∞∞?? ∞∞∞∞?? ??∞∞∞??∞∞∞∞?? ??∞∞∞ ??∞∞∞ ????∞∞∞∞ ??v v v v v v v v v v v v v v 若 1 v为指定节点,则1v到其它各节点的最短路径及径长的计算机计算结果为: 提示:不相邻的两个节点间∞可以用相对较大的数代替(如输入100表示∞)

五:实验原理 1. D 算法原理 已知图G=(V,E),将其节点集分为两组:置定节点集p G 和未置定节点集 p G G -。其中p G 内的所有置定节点,是指定点s v 到这些节点的路径为最短(即已完成最短路径的计算)的节点。而p G G -内的节点是未置定节点,即s v 到未置定节点距离是暂时的,随着算法的下一步将进行不断调整,使其成为最短径。在调整各未置定节点的最短径时,是将p G 中的节点作为转接点。具体地说,就是将p G 中的节点作为转接点,计算(s v ,j v )的径长(j p v G G ∈-),若该次计算的径长小于上次的值,则更新径长,否则,径长不变。计算后取其中径长最短者,之后将j v 划归到p G 中。当(p G G -)最终成为空集,同时p G G =,即求得s v 到所有其他节点的最短路径。 j w 表示s v 与其他节点的距离。 在p G 中,i w 表示上一次划分到p G 中的节点i v 到s v 得最短路径。在 p G G -中,表示s v 到j v (j p v G G ∈-)仅经过p G 中的节点作为转接点所求得的该次的最短路径的长度。 如果s v 与j v 不直接相连,且无置定节点作为转接点,则令j w =∞。 2. D 算法实现流程 D 算法流程如下图所示。

图论算法及matlab程序的三个案例

图论实验三个案例 单源最短路径问题 1.1 Dijkstra 算法 Dijkstra 算法是解单源最短路径问题的一个贪心算法。其基本思想是,设置一个顶点集合S 并不断地作贪心选择来扩充这个集合。一个顶点属于集合S 当且仅当从源到该顶点的最短路径长度已知。设v 是图中的一个顶点,记()l v 为顶点 v 到源点v 1的最短距离, ,i j v v V ?∈,若 (,)i j v v E ?,记i v 到 j v 的权 ij w =∞ 。 Dijkstra 算法: ① 1{}S v =,1()0l v =;1{}v V v ??-,()l v =∞,1i =,1{}S V v =-; ② S φ=,停止,否则转③; ③ ()min{(),(,)} j l v l v d v v =, j v S ∈,v S ?∈; ④ 存在1i v +,使1()min{()}i l v l v +=,v S ∈; ⑤ 1{}i S S v += ,1{}i S S v +=-,1i i =+,转②; 实际上,Dijkstra 算法也是最优化原理的应用:如果121n n v v v v - 是从1v 到n v 的最短路径,则121n v v v - 也必然是从1v 到1n v -的最优路径。 在下面的MATLAB 实现代码中,我们用到了距离矩阵,矩阵第i 行第j 行元素表示顶点i v 到 j v 的权 ij w ,若i v 到 j v 无边,则 realmax ij w =,其中realmax 是 MATLAB 常量,表示最大的实数(1.7977e+308)。 function re=Dijkstra(ma)

最短路dijkstra算法Matlab程序调用举例

最短路dijkstra算法Matlab程序调用举例 2014/4/17 徐明华 设赋权图如下图所示 下述Matlab程序 % test dijkstra's algorithm % The test example is take from the following book % Graph Theory with Applications by J. A. Bondy and U. S. R. Murty. % Page 16. clc s=1; t=5; flag=1; W=ones(11,11)*inf; % for i=1:11 W(i,i)=0; end W(1,2)=2; W(2,1)=2; W(2,3)=1; W(3,2)=1; W(3,4)=2; W(4,3)=2; W(4,5)=9; W(5,4)=9; W(5,6)=4; W(6,5)=4; W(6,7)=1; W(7,6)=1; W(7,8)=9; W(8,7)=9; W(8,1)=1; W(1,8)=1; W(1,9)=8; W(9,1)=8; W(9,2)=6; W(2,9)=6;

W(9,8)=7; W(8,9)=7; W(9,7)=2; W(7,9)=2; W(9,10)=1;W(10,9)=1; W(9,3)=5; W(3,9)=5; W(10,7)=4; W(7,10)=4; W(10,11)=6; W(11,10)=6; W(10,3)=3; W(3,10)=3; W(11,7)=3; W(7,11)=3; W(11,6)=1; W(6,11)=1; W(11,4)=7; W(4,11)=7; W(11,5)=2; W(5,11)=2; W(11,3)=9; W(3,11)=9; [c0,c,path0,path]=dijkstra(s,t,W,flag); c0 path0 调用matlab函数dijkstra(具体见本文库文档:最短路dijkstra算法Matlab程序), 可得到顶点v1 到顶点v5的最短路径path0及最短路径的长度c0如下: c0 = 13 path0 = 1 2 3 10 9 7 6 11 5 如果将上述程序中的语句 flag=1; 替换为 flag=2; 并将 [c0,c,path0,path]=dijkstra(s,t,C,flag); c0 path0 替换为 [c0,c,path0,path]=dijkstra(s,t,C,flag); c path 运行程序可得到顶点v1到图中其他各顶点的最短路径所成矩阵path和各最短路径的长度所成向量c,其中path的第i行表示v1到第i个顶点的最短路径,c(i) 为v1到第i个顶点的最短路径的长度。具体运算结果如下: c = 0 2 3 5 13 10 9 1 7 6 11 path = 1 0 0 0 0 0 0 0 0 0 0

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-1 id=find(visited==0); %查找未标号的顶点 for v = id if a(u, v) + distance(u) < distance(v) distance(v) = distance(u) + a(u, v); %修改标号值 parent(v) = u; end end temp=distance; temp(visited==1)=inf; %已标号点的距离换成无穷 [t, u] = min(temp); %找标号值最小的顶点 visited(u) = 1; %标记已经标号的顶点 end mypath = []; if parent(db) ~= 0 %如果存在路! t = db; mypath = [db]; while t ~= sb %从终点db开始回溯 p = parent(t); mypath = [p mypath]; t = p; end end mydistance = 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]

Dijkstra算法的Matlab程序

Function path=DijkstraPlan(position,sign) %%基于Dijkstra算法的路径规划算法 %position i nput %节点位置 %sign input %节点间是否可达(可用NaN表示不可达)%path output %规划路径 %%计算路径距离 cost=ones(size(sign))*10000; [n,m]=size(sign); for i =1:n for j=1:m if sign(i,j)==1 cost(i,j)=sqrt(sum((positon(i,:)-position(j,:)).^2)); end end end %%路径开始点 dist=cost(1,:); %节点间路径长度 s=zeros(size(dist)); %节点经过标志 s(1)=1;dist(1)=0; path=zeros(size(dist)); %依次经过的节点

path(1,:)=1; %%循环寻找路径点 for num=2:n %选择路径长度最小点 mindist=10000; for i=1:length(dist) if s(i)==0 if dist(i)

path(w)=u; end end end end

Dijkstra、Floyd算法Matlab_Lingo实现

Dijkstra 算法Matlab 实现。 %求一个点到其他各点的最短路径 function [min,path]=dijkstra(w,start,terminal) %W 是邻接矩阵 %start 是起始点 %terminal 是终止点 %min 是最短路径长度 %path 是最短路径 n=size(w,1); label(start)=0; f(start)=start; for i=1:n if i~=start label(i)=inf; end end s(1)=start; u=start; while length(s)(label(u)+w(u,v)) label(v)=(label(u)+w(u,v)); f(v)=u; end end end v1=0; k=inf; for i=1:n ins=0; for j=1:length(s) if i==s(j) ins=1; end end 应用举例: edge=[ 2,3,1,3,3,5,4,4,1,7,6,6,5,5,11,1,8,6,9,10,8,9, 9,10;... 3,4,2,7,5,3,5,11,7,6,7,5,6,11,5,8,1,9,5,11,9,8,10,9;... 3,5,8,5,6,6,1,12,7,9,9,2,2,10,10,8,8,3,7,2,9,9,2,2]; n=11; weight=inf*ones(n,n); for i=1:n weight(i,i)=0; end for i=1:size(edge,2) weight(edge(1,i),edge(2,i))=edge(3,i); end [dis,path]=dijkstra(weight,1,11)

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

效果展示: 开头输入的是点的序列号(表示第几个点),显示的是最短路径的走法(同样以点的序列号显示,表示途径的第几个点)。 %编写m文件 function [distance,path]=dijkstra(A,s,e) % [DISTANCE,PA TH]=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 % initialize n=size(A,1); % node number

D=A(s,:); % distance vector path=[]; % path vector visit=ones(1,n); % node visibility visit(s)=0; % source node is unvisible parent=zeros(1,n); % parent node % the shortest distance for i=1:n-1 % BlueSet has n-1 nodes temp=zeros(1,n); count=0; for j=1:n if visit(j) temp=[temp(1:count) D(j)]; else temp=[temp(1:count) inf]; end count=count+1; end [value,index]=min(temp); j=index; visit(j)=0; for k=1:n if D(k)>D(j)+A(j,k) D(k)=D(j)+A(j,k); parent(k)=j; end end end distance=D(e); % the shortest distance path if parent(e)==0 return; end path=zeros(1,2*n); % path preallocation t=e; path(1)=t; count=1; while t~=s && t>0 p=parent(t); path=[p path(1:count)]; t=p; count=count+1; end if count>=2*n error(['The path preallocation length is too short.',... 'Please redefine path preallocation parameter.']);

(完整word版)图论算法及matlab程序的三个案例.docx

图论实验三个案例 单源最短路径问题 1.1 Dijkstra算法 Dijkstra 算法是解单源最短路径问题的一个贪心算法。其基本思想是,设置一个顶点集合 S 并不断地作贪心选择来扩充这个集合。一个顶点属于集合 S 当且 仅当从源到该顶点的最短路径长度已知。设v 是图中的一个顶点,记l (v) 为顶点 v 到源点 v1的最短距离,v i ,v j V ,若 (v i , v j ) E ,记 v i到 v j的权 w ij。 Dijkstra算法: ①S{ v 1 } , l (v 1 ) 0 ; v V { v 1 } , l (v) , i 1,S V { v1}; ②S ,停止,否则转③; ③l (v) min{ l (v), d (v j , v)} , v j S ,v S ; ④存在v i 1,使l (v i 1) min{ l (v)},v S; ⑤S S U { v i 1 } , S S { v i 1 } ,i i 1,转②; 实际上,Dijkstra算法也是最优化原理的应用:如果v 1 v 2 L v n 1 v n是从 v 1 到 v n的最 短路径,则v 1 v 2 L v n 1也必然是从 v 1 到 v n 1的最优路径。 实现代码中,我们用到了距离矩阵,矩阵第i 行第 j 行元 在下面的 MATLAB 素表示顶点v i 到 v j的权 w ij,若 v i 到 v j无边,则 w ij realmax ,其中 realmax 是 MATLAB常量,表示最大的实数 (1.7977e+308) 。 function re=Dijkstra(ma)

Dijkstra最短路径算法课程设计

二、Dijkstra最短路径算法 利用matlab软件实现Dijkstra最短路径算法 要求: 1、输入节点数量,随机产生网孔型(不完全网状网)网络拓扑(随机产生 每条链路的度量) 2、计算并画出任意两点之间的最短路径,以及以任一点为根的最短路径 树。 设计过程 一、 Dijkstra算法 首先,引进一个辅助向量D,它的每个分量D表示当前所找到的从始点 v到每个终点vi的最短路径的长度。如D[3]=2表示从始点v到终点3 的路径相对最小长度为2。这里强调相对就是说在算法过程中D的值是 在不断逼近最终结果但在过程中不一定就等于最短路径长度。它的初始 状态为:若从v到vi直接相连,则D为之间的直接权值;否则置D为∞。显然,长度为 D[j]=Min{D | vi∈V} 的路径就是从v出发的长度 最短的一条最短路径。此路径为(v,vj)。假设该次短路径的终点是vk, 则这条路径或者是(v,vk),或者是(v,vj,vk)。它的长度或者是从v到 vk的弧上的权值,或者是D[j]和从vj到vk的弧上的权值之和。一般 情况下,假设S为已求得最短路径的终点的集合,则可证明:下一条最 短路径(设其终点为X)或者是弧(v,x),或者是中间只经过S中的顶 点而最后到达顶点X的路径。因此,下一条长度次短的最短路径的长度 必是D[j]=Min{D | vi∈V-S} 其中,D或者是弧(v,vi)上的权值,或者 是D[k](vk∈S)和弧(vk,vi)上的权值之和。 随机产生网络拓扑,随机产生两点之间的度量,若两点直接相连,给出 一个随机数(在此随机取从1到20之间的某一个数)。 二、程序设计 %Dijkstra/最短路径算法 %输入结点数量,随机产生网孔型(不完全网状网)网络拓扑(随机产生每条链路的度量)。 clear all N=6 ;%输入结点的数量 net=zeros(N,N); for i=1:N for j=1:N net(i,j)=randint(1,1,10);%随机产生每条链路的度量; end end for i=1:N net(i,i)=0;end

最短路径问题(Dijkstra算法)和最小生成树(Kruskal算法和Prim算法)

上机实验1、2 1.最短路径问题(Dijkstra算法) 2.最小生成树(Kruskal算法和Prim算法)

一、最短路径问题(Dijkstra 算法) 实验问题描述:如图的交通网络,每条弧上的数字代表车辆在该路段行驶所需的时间,有向边表示单行道,无向边表示可双向行驶。若有一批货物要从1号顶点运往11号顶点,问运货车应沿哪条线路行驶,才能最快地到达目的地。 Dijkstra 算法原理: 设P(u,v)是加权图G 中从u 到v 的路径,则该路径上的边权之和称为该路径的权,记为w(P). 从u 到v 的路径中权最小者 P*(u,v)称为u 到v 的最短路径. 当图中所有途径的权都不小于0时,目前公认最好的方法是由Dijkstra 于1959年提出来的。 Dijkstra 方法的基本思想是从 s v 出发,逐步地向外探寻最短路。执行过程中,与每个点对 应,记录下一个数(称为这个点的标号),它或者表示从s v 到该点的最短路的权(称为P 标号),或者表示从 s v 到该点的最短路的权的上界(称为T 标号),方法的每一步是去修 改T 标号,并且把某一个具T 标号的点改变为具P 标号的点,从而使图中具P 标号的顶点数多一个,这样,至多经过p-1步,就可以求出从 s v 到各点的最短路。 Dijkstra 算法步骤: S: 具有永久标号的顶点集; l(v): v 的标记; f(v):v 的父顶点,用以确定最短路径;输入加权图的带权邻接矩阵w=[w(vi,vj)]nxm 1、初始化:令l(v0)=0,S=Φ;?v ≠v0 ,l(v)=∞; 2、更新l(v), f(v):寻找不在S 中的顶点u,使l(u)为最小.把u 加入到S 中,然后对所有不在S 中的顶点v,如l(v)>l(u)+w(u,v),则更新l(v),f(v), 即l(v)←l(u)+w(u,v),f(v)←u; 3、重复步骤2), 直到所有顶点都在S 中为止。

用Matlab-C实现基于Dijkstra的路由选择算法实现

* 给定一个带权有向图G = (V,E),其中每条边的权是一个非负整数。* * 另外还给定V中的一个顶点,称为源。现在我们要计算从源到所有其* * 他各顶点的最短路长度。这里路径长度是路上各边权之和。这个问* * 题通常称为单源最短路径问题。* ***************************************************************/ #include #define INFINITE 100 void main() { int j,i,n,k,t,**w,*s,*p,*d; cout<<"input the value of n:"; cin>>n; cout<>w[i][j]; for(s[0] = 1,i = 1; i < n; i++) { s[i] = 0; d[i] = w[0][i]; if(d[i] < INFINITE) p[i]=0; else p[i]=-1; }

for(i = 1; i < n; i++) { t = INFINITE; k = 1; for(j = 1; j < n; j++) if((!s[j]) && (d[j] < t)) { t = d[j]; k = j; } s[k]=1;//point k join the S for (j = 1; j < n; j++) if((!s[j]) && (d[j] > d[k] + w[k][j])) { d[j] = d[k] + w[k][j]; p[j] = k; } } cout<<"从源点到其它顶点的最短距离依次如下:"; for(i=1;i

dijkstra算法

1、(求两点之间的最短路程)Dijkstra算法的MATLAB程序dijkstra.m如下:% Dijkstra’s Algorithm function [S, D]= dijkstra (i,m,W) % i为最短路径的起始点,m为图顶点数,W为图的带权邻接矩阵 % 不构成边的两顶点之间用inf 表示 % S的每一列从上到下记录了从始点到终点的最短路径所经顶点的序号% D是一个行向量,记录了S中所示路径的大小 dd=[ ];tt=[ ];ss=[ ];ss(1,1)=i; v=1:m; v(i)=[ ];dd=[0;i]; % dd的第二行是每次求出的最短路径的终点,第一行是最短路径的值 kk=2; [mdd,ndd]=size(dd); while ~isempty(v) [tmpd,j]=min(W(i,v));tmpj=v(j); for k=2:ndd [tmp1,jj]=min(dd(1,k)+W(dd(2,k),v)); tmp2=v(jj);tt(k-1,:)=[tmp1,tmp2,jj]; end tmp=[tmpd,tmpj,j;tt]; [tmp3,tmp4]=min(tmp(:,1)); if tmp3==tmpd,ss(1:2,kk)=[i;tmp(tmp4,2)]; else, tmp5=find(ss(:,tmp4)~=0); tmp6=length(tmp5); if dd(2,tmp4)==ss(tmp6,tmp4) ss(1:tmp6+1,kk)=[ss(tmp5,tmp4); tmp(tmp4,2)]; else, ss(1:3,kk)=[i; dd(2,tmp4); tmp(tmp4,2)]; end end dd=[dd,[tmp3;tmp(tmp4,2)]];v(tmp(tmp4,3))=[ ]; [mdd,ndd]=size(dd);kk=kk+1; end S=ss;D=dd(1,: );

相关主题
相关文档
最新文档