(图论)matlab模板程序
图论常用算法matlab程序
运筹学算法matlab程序西北工业大学数学系2009级1.顺向Dijkstra 算法M=[ 0 5 9 Inf Inf Inf InfInf 0 Inf Inf 12 Inf InfInf 3 0 15 Inf 23 InfInf 6 Inf 0 Inf 8 7Inf 12 Inf 5 0 Inf 14Inf Inf Inf Inf Inf 0 10Inf Inf Inf Inf Inf Inf 0];first=1;last=7;[m,n]=size(M);L=zeros(1,m);symbol=zeros(1,m);direction=zeros(1,m);for i=1:mif(i~=first)L(i)=inf;enddirection(i)=first;endjudge=1;while judgefor i=1:mif(symbol(i)==0)min=L(i);temporary=i;breakendendfor i=1:mif(symbol(i)==0)if(L(i)<min)min=L(i);temporary=i;endendendk=temporary;for j=1:mif(symbol(1,j)==0)if(M(k,j)==inf)continue;elseif(L(k)+M(k,j)<L(j))L(j)=L(k)+M(k,j);direction(j)=k;endendendendsymbol(k)=1;num=0;for i=1:mif(symbol(i)==1)num=num+1;endendif(num==m)judge=0;endendp=last;arrow=zeros(1,m);arrow(1)=last;i=2;while p~=firstarrow(1,i)=direction(p);i=i+1;p=direction(p);enddistance=L(last);M=[ 0 5 9 Inf Inf Inf Inf Inf 0 Inf Inf 12 Inf InfInf 3 0 15 Inf 23 Inf Inf 6 Inf 0 Inf 8 7 Inf 12 Inf 5 0 Inf 14 Inf Inf Inf Inf Inf 0 10Inf Inf Inf Inf Inf Inf 0]; [m,n]=size(M);first=1;last=7;L=zeros(1,m);direction=zeros(1,m);symbol=zeros(1,m);for i=1:mdirection(i)=last;if(i~=last)L(i)=inf;endendjudge=1;while judgefor i=1:mif(symbol(i)==0)min=L(i);temporary=i;breakendendfor i=1:mif(symbol(i)==0)if(L(i)<min)min=L(i);temporary=i;endendendk=temporary;for i=1:mif(M(i,k)==inf)continueelseif(M(i,k)+L(k)<L(i))L(i)=L(k)+M(i,k);direction(i)=k;endendendsymbol(k)=1;sum=0;for i=1:mif(symbol(i)==1)sum=sum+1;endendif(sum==m)judge=0;endendp=first;i=2;arrow=zeros(1,m);arrow(1)=first;while p~=lastarrow(i)=direction(p);i=i+1;p=direction(p);endd=[0 7 5 12 inf infinf 0 inf 3 inf infinf inf 0 6 inf 1512 inf 6 0 inf 86 inf 13 inf 0 infinf 4 15 inf 9 0];[m,n]=size(d);p=zeros(m,n);for i=1:np(:,i)=i;endfor k=1:nfor i=1:mfor j=1:nif(d(i,k)+d(k,j)<d(i,j))d(i,j)=d(i,k)+d(k,j);p(i,j)=p(i,k);endendendend4.仿floyd 算法d=[inf 6 0 4 0 0 00 inf 0 0 5 0 04 7 inf 0 05 00 0 4 inf 0 3 00 0 2 0 inf 0 00 0 0 0 4 inf 50 0 0 0 6 0 inf];[m,n]=size(d);first=1;last=7;direction=zeros(m,m);for i=1:mdirection(:,i)=i;endfor i=1:mfor j=1:mfor k=1:msmall=min(d(i,k),d(k,j));if d(i,j)<smalld(i,j)=small;direction(i,j)=direction(i,k);endendendendarrow=zeros(1,m);arrow(1)=first;i=2;p=first;while p~=lastp=direction(p,last);arrow(i)=p;i=i+1;end—dijkstra算法d=[0 inf 3 5 inf10 0 14 inf 8inf inf 0 7 -6inf inf inf 0 infinf inf inf -1 0];[m,n]=size(d);first=2;last=4;L=zeros(1,n);z=zeros(m,n);symbol=zeros(1,n);direction=zeros(1,n);for i=1:nfor j=1:mif d(i,j)~=0if d(i,j)~=infz(i,j)=1;endendenddirection(i)=first;if i~=firstL(i)=inf;endendjudge=1;while judgemini=10;for j=1:nif symbol(j)==0sum=0;for i=1:mp=z(i,j)*(1-symbol(i));sum=sum+p;endif(sum==0)mini=j;breakendendendfor j=1:nif symbol(j)==0&&z(mini,j)==1if L(mini)+d(mini,j)<L(j)L(j)=L(mini)+d(mini,j);direction(j)=mini;endendendsymbol(mini)=1;num=0;for i=1:nif symbol(i)==1num=num+1;endendif num==m;judge=0;endendarrow=zeros(1,m);p=last;arrow(1)=last;i=2;while p~=firstp=direction(p);arrow(i)=p;i=i+1;end—dijkstra算法d=[0 inf 3 5 inf10 0 14 inf 8inf inf 0 7 -6inf inf inf 0 infinf inf inf -1 0];[m,n]=size(d);first=2;last=4;L=zeros(1,n);z=zeros(m,n);symbol=zeros(1,n);direction=zeros(1,n);for i=1:nfor j=1:mif d(i,j)~=0if d(i,j)~=infz(i,j)=1;endendenddirection(i)=last;if i~=lastL(i)=inf;endendjudge=1;while judgemini=10;for i=1:nif symbol(i)==0sum=0;for j=1:mp=z(i,j)*(1-symbol(j));sum=sum+p;endif(sum==0)mini=i;breakendendendfor i=1:nif symbol(i)==0&&z(i,mini)==1if L(mini)+d(i,mini)<L(i)L(i)=L(mini)+d(i,mini);direction(i)=mini;endendendsymbol(mini)=1;num=0;for i=1:nif symbol(i)==1num=num+1;endendif num==m;judge=0;endendarrow=zeros(1,m);p=first;arrow(1)=first;i=2;while p~=lastp=direction(p);arrow(i)=p;i=i+1;endM=[ 0 17 11 inf inf inf17 0 13 12 28 1511 13 0 inf 19 infinf 12 inf 0 inf 16inf 28 19 inf 0 10inf 15 inf 16 10 0];[m,n]=size(M);X=zeros(m,n);Y=zeros(m);Z=zeros(m);Y(1)=1;for i=2:mZ(i)=i;endjudge=1;while judgefor i=1:mif(Y(i)~=0)for j=1:mif(Z(j)~=0)min=M(i,j);a=i;b=j;endendendendfor i=1:mif(Y(i)~=0)for j=1:mif(Z(j)~=0)if(M(i,j)<min)min=M(i,j);a=i;b=j;endendendendendY(b)=b;Z(b)=0;X(a,b)=1;X(b,a)=1;c=0;for i=1:mif(Y(i)~=0)c=c+1;endendif(c==m)judge=0;endend网络最大流Ford—Fulkersen算法d=[inf 12 17 0 0 00 inf 0 8 0 00 6 inf 0 12 00 0 5 inf 0 150 0 0 4 inf 90 0 0 0 0 inf];[m,n]=size(d);X=zeros(m,n);first=1;last=6;recognize=1;while recognizeL=zeros(1,m);L(first)=inf;direction=ones(1,m);symbol=zeros(1,m);judge=1;while judgefor i=1:mif symbol(i)==0big=L(i);k=i;break;endendfor i=1:mif symbol(i)==0if L(i)>bigbig=L(i);k=i;endendendif k==nif L(n)==0breakendelsefor j=1:mif d(k,j)>0u=min(L(k),d(k,j)-X(k,j));if u>L(j)L(j)=u;direction(j)=k;endelseif d(j,k)>0u=min(L(k),X(j,k));if u>L(j)L(j)=u;direction(j)=k;endendendendendsymbol(k)=1;num=0;for i=1:mif symbol(i)==1num=num+1;endendif num==mjudge=0;endendafter=last;before=after;while before~=firstbefore=direction(after);if d(before,after)>0X(before,after)=X(before,after)+L(n); elseX(before,after)=X(before,after)-L(n); endafter=before;endif L(m)==0recognize=0;end end。
MATLAB中常见的图论算法介绍
MATLAB中常见的图论算法介绍一、引言图是计算机科学中非常重要的一种数据结构,广泛应用于各个领域。
图论算法能够解决多种问题,如网络分析、社交网络分析、路径规划等。
在本篇文章中,我们将介绍一些在MATLAB中常见的图论算法,帮助读者了解和应用这些算法。
二、图的表示方法在MATLAB中,图可以用邻接矩阵或邻接表来表示。
邻接矩阵是一个二维矩阵,其中行和列分别代表图的节点,矩阵中的元素表示节点之间的关系。
邻接表是一个包含图中所有节点的列表,每个节点链接到其相邻节点的列表。
三、最短路径算法1. Dijkstra算法Dijkstra算法用于解决单源最短路径问题,即寻找一个节点到图中其他所有节点的最短路径。
算法的基本思想是通过不断选择最短路径的节点来逐步扩展最短路径树。
在MATLAB中,可以使用graph对象和shortestpath函数来实现Dijkstra算法。
首先,使用graph对象创建图,然后使用shortestpath函数计算从源节点到目标节点的最短路径。
2. Bellman-Ford算法Bellman-Ford算法也用于解决单源最短路径问题,但相比Dijkstra算法,Bellman-Ford算法可以处理带有负权边的图。
算法的基本思想是通过松弛操作来逐步减小节点的估计距离,直到找到最短路径。
在MATLAB中,可以使用graph对象和shortestpath函数来实现Bellman-Ford算法。
与Dijkstra算法类似,首先使用graph对象创建图,然后使用shortestpath函数计算最短路径。
四、最小生成树算法1. Prim算法Prim算法用于寻找一个无向图的最小生成树。
算法的基本思想是从一个初始节点开始,逐步添加边,直到所有节点都被连接成一棵生成树。
在MATLAB中,可以使用graph对象和minspantree函数来实现Prim算法。
首先,使用graph对象创建图,然后使用minspantree函数计算最小生成树。
超全图论matlab程序-可解决图论方面的绝大多数问题
程序三:有向图关联矩阵和邻接矩阵互换算法
function W=mattransf(F,f) if f==0 m=sum(sum(F)); n=size(F,1); W=zeros(n,m); k=1; for i=1:n for j=i:n if F(i,j)~=0 W(i,k)=1; W(j,k)=-1; k=k+1; end end end elseif f==1 m=size(F,2); n=size(F,1); W=zeros(n,n); for i=1:m a=find(F(:,i)~=0); if F(a(1),i)==1 W(a(1),a(2))=1; else W(a(2),a(1))=1; end end else fprint('Please imput the right value of f'); end W;
第二讲:最短路问题
程序一:Dijkstra算法(计算两点间的最短路)
图论和网络分析算法及Matlab实现(Graph-and-Network-Analysis)
2019/11/17
Dijkstra 算法
2019/11/17
由图G建立一步可达距离阵D=(dij)n×n
给V1(Vs)括号(l1,Vk)=(0,s)给出已标号集合 I和未标号集合J的元素
对于给定的I和J,确定集合A={aij |Vi∈I,Vj ∈J}
1
7
v4 5
v5
• 2. 方法:Dijkstra算法(Dijkstra,1959)
Dijkstra, E.W. (1959). A note on two problems in connexion with graphs. Numerische Mathematik 1, 269–271.
• 原理: Bellman最优化原理 若P是网络G中从Vs到Vt的一条最短路,Vl是P中除Vs与Vt外 的任何一个中间点,则沿P从Vs到Vl的一条路P1亦必是Vs 到Vl的最短路。 证明(反证):
问题的两个共同特点
(1)目的都是从若干可能的安排或方案中寻求 某种意义下的最优安排或方案,数学问题称 为最优化或优化问题。
(2)它们都可用图形形式直观描述,数学上把这 种与图相关的结构称为网络。图和网络相关 的最优化问题就是网络最优化。 网络优化问题是以网络流为研究的对象,常 常被称为网络流或网络流规划等。
Kruskal, J.B. (1956). On the Shortest Spanning Subtree of a Graph and the Traveling Salesman Problem. Proceedings of the American Mathematical Society 7, 48-50.
2019/11/17
matlab图论方法ppt课件
如果某个有限图不满足(2)(3)(4),可在某条
边上增设顶点使之满足.
ppt课件.
10
定义2 若将图G的每一条边e都对应一个实数 F (e), 则称F (e)为该边的权, 并称图G为赋权图(网 络), 记为G = (V, E , F ).
定义3 设G = (V, E)是一个图, v0, v1, …, vk∈V, 且1≤i≤k, vi-1vi∈E, 则称v0 v1 … vk是G的一条通路. 如果通路中没有相同的边, 则称此通路为道路. 始 点和终点相同的道路称为圈或回路. 如果通路中 既没有相同的边, 又没有相同的顶点, 则称此通路 为路径, 简称路.
ppt课件.
22
解:用Floyd算法,首先写出其(对称的)权矩 阵A = (aij )8×8,然后利用计算机编程计算.
01234567 0 0 2 8 1∞∞∞∞ 1 2 0 6∞ 1∞∞∞ 2 8 6 0 7 5 1 2∞ 3 1∞ 7 0∞∞ 9∞ 4∞ 1 5∞ 0 3∞ 8 5∞∞ 1∞ 3 0 4 6 6∞∞ 2 9∞ 4 0 3 7 ∞ ∞ ∞ ∞ 8 ppt课件. 6 3 0 23
已知设备在每年年初的购买费分别为11,11, 12,12,13. 使用不同时间设备所需的维修费分别 为5,6,8,11,18.
解 设bi 表示设备在第i 年年初的购买费,ci 表 示设备使用i 年后的维修费, V={v1, v2, … , v6},点 vi表示第i 年年初购进一台新设备,虚设一个点v6表 示第5年年底. E ={vivj | 1≤i<j≤6}.
G为有限图或n阶图. ppt课件.
5
如果E的每一条边都是无向边, 则称G为无向 图(如图1); 如果E的每一条边都是有向边, 则称G 为有向图(如图2); 否则, 称G为混合图.
图论算法及MATLAB程序代码
i f(x(j)<x(i))xx=x(j);x(j)=x(i);x(i)=xx; end;end;end
T(n,n)=0; %将矩阵 T 中所有的元素赋值为 0 q=0; %记录加入到树 T 中的边数
for(s=1:k)if(q==n)break;end %获得最小生成树 T, 算法终止
for(i=1:n-1)for(j=i+1:n)if (A(i,j)==x(s))T(i,j)=x(s);T(j,i)=x(s); %加入边到树 T 中 TT=T; %临时记录 T
%更新 dij
R(i,j)=k;end;end;end
%更新 rij
k %显示迭代步数 D %显示每步迭代后的路长
R %显示每步迭代后的路径
pd=0;for i=1:n %含有负权时 if(D(i,i)<0)pd=1;break;end;end %存在一条含有顶点 vi 的负回路
if(pd)break;end
设 G = ( X, Y, E )为二部图, 其中 X = {x1, x2, … , xn }, Y = { y1, y2, … , yn}. 任取 G 的一初 始匹配 M (如任取 e∈E, 则 M = {e}是一个匹配).
① 令 S = φ , T = φ , 转向②. ② 若 M 饱和 X \ S 的所有点, 则 M 是二部图 G 的最大匹配. 否则, 任取 M 的非饱和点 u∈X \ S , 令 S = S ∪{ u }, 转向③. ③ 记 N (S ) = {v | u∈S, uv∈E }. 若 N (S ) = T, 转向②. 否则取 y∈N (S ) \ T. 若 y 是 M 的饱和点, 转向④, 否则转向⑤. ④ 设 x y∈M, 则令 S = S ∪{ x }, T = T ∪{ y }, 转向③. ⑤ u − y 路是 M−增广路, 设为 P, 并令 M = M⊕P, 转向①. 这里 M⊕P = M∪P \ M∩ P, 是对称差. 由于计算 M−增广路 P 比较麻烦, 因此将迭代步骤改为: ① 将 X 中 M 的所有非饱和点(不是 M 中某条边的端点)都给以标号 0 和标记*, 转向②. ② 若 X 中所有有标号的点都已去掉了标记*, 则 M 是 G 的最大匹配. 否则任取 X 中一 个既有标号又有标记*的点 xi , 去掉 xi 的标记*, 转向③. ③ 找出在 G 中所有与 xi 邻接的点 yj (即 xi yj∈E ), 若所有这样的 yj 都已有标号, 则转向 ②, 否则转向④. ④ 对与 xi 邻接且尚未给标号的 yj 都给定标号 i. 若所有的 yj 都是 M 的饱和点, 则转向⑤, 否则逆向返回. 即由其中 M 的任一个非饱和点 yj 的标号i 找到 xi, 再由 xi 的标号k 找到 yk , … , 最后由 yt 的标号 s 找到标号为 0 的 xs 时结束, 获得 M −增广路 xs yt … xi yj, 记 P = {xs yt, … , xi yj }, 重新记 M 为 M⊕P, 转向①. ⑤ 将 yj 在 M 中与之邻接的点 xk (即 xk yj∈M), 给以标号 j 和标记*, 转向②.
matlab图论程序算法大全
精心整理图论算法matlab实现求最小费用最大流算法的 MATLAB 程序代码如下:n=5;C=[0 15 16 0 00 0 0 13 14forwhileforfor(i=1:n)for(j=1:n)if(C(i,j)>0&f(i,j)==0)a(i,j)=b(i,j);elseif(C(i,j)>0&f(i,j)==C(i,j))a(j,i)=-b(i,j);elseif(C(i,j)>0)a(i,j)=b(i,j);a(j,i)=-b(i,j);end;end;endfor(i=2:n)p(i)=Inf;s(i)=i;end %用Ford 算法求最短路, 赋初值for(k=1:n)pd=1; %求有向赋权图中vs 到vt 的最短路for(i=2:n)for(j=1:n)if(p(i)>p(j)+a(j,i))p(i)=p(j)+a(j,i);s(i)=j;pd=0;end ;end;endif(pd)break;end;end %求最短路的Ford 算法结束if(p(n)==Inf)break;end %不存在vs 到vt 的最短路, 算法终止. 注意在求最小费用最大流时构造有whileifelseifififpd=0;值t=n;ifelseifif(s(t)==1)break;end %当t 的标号为vs 时, 终止调整过程t=s(t);endif(pd)break;end%如果最大流量达到预定的流量值wf=0; for(j=1:n)wf=wf+f(1,j);end;end %计算最大流量zwf=0;for(i=1:n)for(j=1:n)zwf=zwf+b(i,j)*f(i,j);end;end%计算最小费用f %显示最小费用最大流图 6-22wf %显示最小费用最大流量zwf %显示最小费用, 程序结束__Kruskal 避圈法:k=1; %forifkk=1;for(s=1:k-1)if(x(k)==x(s))kk=0;break;end;end %排除相同的正数k=k+kk;end;end;endk=k-1 %显示A中所有不同正数的个数for(i=1:k-1)for(j=i+1:k) %将x 中不同的正数从小到大排序if(x(j)<x(i))xx=x(j);x(j)=x(i);x(i)=xx;end;end;endT(n,n)=0; %将矩阵T 中所有的元素赋值为0q=0; %记录加入到树T 中的边数for(s=1:k)if(q==n)break;end %获得最小生成树T, 算法终止for(i=1:n-1)for(j=i+1:n)if (A(i,j)==x(s))T(i,j)=x(s);T(j,i)=x(s); %加入边到树T 中TT=T;whileforforifif(pd)pd=0;forifelseT %用2 0 6 Inf 1 Inf Inf Inf8 6 0 7 5 1 2 Inf1 Inf 7 0 Inf Inf 9 InfInf 1 5 Inf 0 3 Inf 8Inf Inf 1 Inf 3 0 4 6Inf Inf 2 9 Inf 4 0 3Inf Inf Inf Inf 8 6 3 0]; % MATLAB 中, Inf 表示∞D=A; %赋初值for(i=1:n)for(j=1:n)R(i,j)=j;end;end %赋路径初值for(k=1:n)for(i=1:n)for(j=1:n)if(D(i,k)+D(k,j)<D(i,j))D(i,j)=D(i,k)+D(k, j); %k %D %R %pd=0;ifif(pd)end %0 0 0 0 0 3 2 00 0 0 0 0 0 2 00 0 0 0 0 0 0 40 0 0 0 0 0 0 30 0 0 0 0 0 0 50 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 记录标号图 6-19while(1)whileforfor弧时ifelseifififif(pd)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; %继续调整前一段弧上的流fwf=0;for(j=1:n)wf=wf+f(1,j);end %计算最大流量f %显示最大流wf %显示最大流量No %显示标号, 由此可得最小割, 程序结束ifforendelseifforW(a(1),a(2))=1;W(a(2),a(1))=1;endelsefprint('Please imput the right value of f');endW;程序二:可达矩阵算法function P=dgraf(A)精心整理n=size(A,1);P=A;for i=2:nP=P+A^i;endP(P~=0)=1;P;程序三:有向图关联矩阵和邻接矩阵互换算法function W=mattransf(F,f)if f==0forendelseifforendelsefprint('Please imput the right value of f');endW;第二讲:最短路问题程序一:Dijkstra算法(计算两点间的最短路)function [l,z]=Dijkstra(W)l(i)=W(1,i);z(i)=0;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-1;endendendendendend程序三:n2short.m 计算指定两点间的最短距离function [P u]=n2short(W,k1,k2)n=length(W);U=W;m=1;for j=1:nif U(i,j)>U(i,m)+U(m,j)U(i,j)=U(i,m)+U(m,j);endendendm=m+1;endu=U(k1,k2);k=1;kk=k2;whileforendendk=1;forendP;)function[Pm D]=n1short(W,k)n=size(W,1);D=zeros(1,n);for i=1:n[P d]=n2short(W,k,i);Pm{i}=P;D(i)=d;end程序五:pass2short.m(计算经过某两点的最短距离)精心整理function [P d]=pass2short(W,k1,k2,t1,t2) [p1 d1]=n2short(W,k1,t1);[p2 d2]=n2short(W,t1,t2);[p3 d3]=n2short(W,t2,k2);dt1=d1+d2+d3;[p4 d4]=n2short(W,k1,t2);[p5 d5]=n2short(W,t2,t1);[p6 d6]=n2short(W,t1,k2);dt2=d4+d5+d6;if dt1<dt2d=dt1;elseendP;d;ifforendendelseb=d;endn=max(max(b(1:2,:)));m=size(b,2);[B,i]=sortrows(b',3);B=B';c=0;T=[];精心整理k=1;t=1:n;for i=1:mif t(B(1,i))~=t(B(2,i))T(1:2,k)=B(1:2,i);c=c+B(3,i);k=k+1;tmin=min(t(B(1,i)),t(B(2,i))); tmax=max(t(B(1,i)),t(B(2,i)));for j=1:nif t(j)==tmaxt(j)=tmin;endc;k=1:l;e=1;whileformin=a(i,j);b=a(i,j); s=i;d=j;endendendendlistV(d)=1;distance(e)=b;source(e)=s;destination(e)=d;精心整理e=e+1;endT=[source;destination];for g=1:e-1c(g)=a(T(1,g),T(2,g));endc;另外两种程序最小生成树程序1(prim 算法构造最小生成树)endresult最小生成树程序2(Kruskal 算法构造最小生成树)clc;clear;a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40;精心整理a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)=30;a(4,7)=42; a(5,6)=70;[i,j,b]=find(a);data=[i';j';b'];index=data(1:2,:);loop=max(size(a))-1;endendresult第四讲:Euler图和Hamilton图程序一:Fleury算法(在一个Euler图中找出Euler环游)注:包括三个文件;fleuf1.m, edf.m, flecvexf.mfunction [T c]=fleuf1(d)%注:必须保证是Euler环游,否则输出T=0,c=0b(b==inf)=0;b(b~=0)=1;m=0;a=sum(b);eds=sum(a)/2;ed=zeros(2,eds);vexs=zeros(1,eds+1);matr=b;for i=1:nifendendif m~=0endif m==0forfor g=1:edsc=c+d(T(1,g),T(2,g));endflagg=0;break;endendendendfunction[flag ed]=edf(matr,eds,vexs,ed,tem)[dvex f]=flecvexf(matr,i,vexs,eds,ed,tem);if f==1flag=0;break;endif dvex~=0ed(:,i)=[vexs(1,i) dvex];vexs(1,i+1)=dvex;matr(vexs(1,i+1),vexs(1,i))=0;endendf=0;dvex=0;ded=[];ifelseforendif kkk==length(edd)tem=vexs(1,i)*ones(1,kkk);edd1=[tem;edd];for l1=1:kkklt=0;ddd=1;for l2=1:edsif edd1(1:2,l1)==ed(1:2,l2)lt=lt+1;endend精心整理if lt==0ded(ddd)=edd(l1);ddd=ddd+1;endendendif temp<=length(dvex1)dvex=dvex1(temp);elseif temp>length(dvex1) & temp<=length(ded)dvex=ded(temp);elseendend路)%d%Cendendendd2=0;for i=1:nif i<nd2=d2+d(i,i+1);elsed2=d2+d(n,1);endendtext(10,30,num2str(d2));n=size(d,2);C=[linspace(1,n,n) 1];for nnn=1:20C1=C;if n>3for m=4:n+1for i=1:(m-3)for j=(i+2):(m-1)if (d(C(i),C(j))+d(C(i+1),C(j+1))<d(C(i),C(i+1))+d(C(j),C(j+1))) C1(1:i)=C(1:i);for k=(i+1):jd1;endfor i=1:nstr1='V';str2=num2str(i);dot=[str1,str2];text(v(i,1)-1,v(i,2)-2,dot); %给点命名endv2=[v;v(1,1),v(1,2)];plot(v(C(:),1),v(C(:),2),'r');text(10,30,num2str(d1));第五讲:匹配问题及算法程序一:较大基础匹配算法function J=matgraf(W)n=size(W,1);J=zeros(n,n);while sum(sum(W))~=0a=find(W~=0);t1=mod(a(1),n);if t1==0t1=n;endifendendJ;ifendb=a;ifendfor i =1:m(1)b(i,:)=b(i,:)-min(b(i,:));endfor j=1:m(2)b(:,j)=b(:,j)-min(b(:,j));endd=(b==0);[e,total]=fc02(d);while total~=m(1)b=fc03(b,e);精心整理d=(b==0);[e,total]=fc02(d);endinx=sub2ind(size(a),e(:,1),e(:,2)); e=[e,a(inx)];s=sum(a(inx));function [e,total]=fc02(d)total=0;m=size(d);e=zeros(m(1),2);t=sum(sum(d)');nump=sum(d');whileendwhiletp=sum(p+q);inp=find(p==1);n=size(inp);for i=1:n(1)inq=find(b(inp(i),:)==0); q(inq)=1;endinp=find(q==1);n=size(inp);for i=1:n(1)精心整理if all(e(:,2)-inp(i))==0inq=find((e(:,2)-inp(i))==0);p(e(inq))=1;endendtq=sum(p+q);t=tq-tp;endinp=find(p==1);inq=find(q==0);cmin=min(min(b(inp,inq))');for%求初始匹配Mif(M(i,j))break;end;end %获得仅含一条边的初始匹配M while(1)for(i=1:m)x(i)=0;end %将记录X中点的标号和标记*for(i=1:n)y(i)=0;end %将记录Y中点的标号和标记*for(i=1:m)pd=1; %寻找X中M的所有非饱和点for(j=1:n)if(M(i,j))pd=0;end;endif(pd)x(i)=-n-1;end;end %将X中M的所有非饱和点都给以标号0 和标记*, 程序中用n+1 表示0for取Xif标记for;e nd %if(k>1)k=k-1;for(j=1:k)pdd=1;for(i=1:m)if(M(i,yy(j)))x(i)=-yy(j);pdd=0;break;end;end %将yj 在M中与之邻接的点xk (即xkyj∈M), 给以标号j 和标记*if(pdd)break;end;endif(pdd)k=1;j=yy(j); %yj 不是M的饱和点while(1)P(k,2)=j;P(k,1)=y(j);j=abs(x(y(j))); %任取M的一个非饱和点yj, 逆向返回if M-增广路forM去掉Mif*,M %程序3 Kuhn-Munkres算法(即赋权完备二元图的最佳匹配程序)function kk=kexingdian(A)%求赋权完备二元图最佳匹配A=[4 5 5 1;2 2 4 6;4 2 3 3;5 0 2 1]; %A为邻接矩阵n=length(A);for(i=1:n)L(i,1)=0;L(i,2)=0;endfor(i=1:n)for(j=1:n)if(L(i,1)<A(i,j))L(i,1)=A(i,j);end; %初始可行点标记L M(i,j)=0;end;endfor(i=1:n)for(j=1:n) %生成子图Glif(L(i,1)+L(j,2)==A(i,j))Gl(i,j)=1;jsn=0;for(i=1:jss)for(j=1:n)if(Gl(S(i),j))jsn=jsn+1;NlS(jsn)=j; %NL(S)={v|u ∈S,uv∈EL}for(k=1:jsn-1)if(NlS(k)==j)jsn=jsn-1;end;end;end;end;endif(jsn==jst)pd=1; %判断NL(S)=T?for(j=1:jsn)if(NlS(j)~=T(j))pd=0;break;end;end;end if(jsn==jst&pd)al=Inf; %如果NL(S)=T, 计算al, Inf为∞ for(i=1:jss)for(j=1:n)pd=1;for(k=1:jst)if(T(k)==j)pd=0;break;end;endfor(j=1:jsn)pd=1; %取y∈NL(S)\Tfor(k=1:jst)if(T(k)==NlS(j))pd=0;break;end;end if(pd)jj=j;break;end;endpd=0; %判断y是否为 M的饱和点for(i=1:n)if(M(i,NlS(jj)))pd=1;ii=i;break;end;endif(pd)jss=jss+1;S(jss)=ii;jst=jst+1;T(jst)=NlS(jj); %S=S∪{x}, T=T∪{y}else %获得Gl 的一条M-增广路, 调整匹配 Mfor(k=1:jst)M(S(k),T(k))=1;M(S(k+1),T(k))=0;endif(jst==0)k=0;endM %%C%f1%f%wfifelsef=f1;endNo=zeros(1,n);d=zeros(1,n);while (1)No(1)=n+1;d(1)=Inf;while (1)pd=1;for (i=1:n)精心整理if (No(i))for (j=1:n)if (No(j)==0 & f(i,j)<C(i,j))No(j)=i;d(j)=C(i,j)-f(i,j);pd=0;if (d(j)>d(i))d(j)=d(i);endelseif (No(j)==0 & f(j,i)>0)No(j)=-i;d(j)=f(j,i);pd=0;if (d(j)>d(i))d(j)=d(i);endifendendt=No(t);endendwf=0;for (j=1:n)wf=wf+f(1,j);endf;wf;精心整理程序二:Busacker-Gowan算法(求最大流最小费用)%C=[0 15 16 0 0;0 0 0 13 14;0 11 0 17 0;0 0 0 0 8;0 0 0 0 0]%b=[0 4 1 0 0;0 0 0 6 1;0 2 0 3 0;0 0 0 0 2;0 0 0 0 0]%function [f wf zwf]=BGf(C,b)%C表示弧容量矩阵%b表示弧上单位流量的费用%f表示最大流最小费用矩阵%wf最大流量%zwf表示最小费用n=size(C,2);whileforendforendforendforfor (i=2:n)for (j=1:n)if (p(i)>p(j)+a(j,i))p(i)=p(j)+a(j,i);s(i)=j;pd=0;endendendif (pd)break;end精心整理endif (p(n)==inf)break;enddvt=inf;t=n;while (1)if (a(s(t),t)>0)dvtt=C(s(t),t)-f(s(t),t);elseif (a(s(t),t)<0)dvtt=f(t,s(t));endendifendendif (pd)break;endwf=0;for (j=1:n)wf=wf+f(1,j);endendzwf=0;for (i=1:n)精心整理for (j=1:n)zwf=zwf+b(i,j)*f(i,j);endend。
图论中最短路问题的MATLAB程序实现[1]
安庆师范学院学报(自然科学版)2007年1问题的提出设G=(V,E)为连通图,顶点集为{1,2,3,…n},图中各边(i,j)有非负权cij(当(i,j)不是边时,权等于inf;当(i,j)是有向边时,cji与cij可以不相等),求一条道路使它是从顶点1到顶点n的所有道路中总权数最小的路,这就是图论中的最短路问题[1]。
解决这个问题至今公认最好的方法是1959年提出Di-jkstra算法,它用于计算一个点s到其他所有点的最短路。
此算法基本原理是:若某条路是最短路,这条路上的任意一段路也是连接这段路两个端点的最短路[1,2]。
2算法描述[3,4]第一步将点s标上永久性标记P(s)=0,表示从开始点s到达点s的最短距离是零。
第二步将其余的顶点标上T标记,T记号是试探性标记,点j的T标记T(j)分两部分,T(j)=T1(j)(T2(j)),第一部分T1(j)为从开始点s经过带P标记的点到达j点的最短路的权和,括号中T2(j)为第二部分,是这最短路中j点的前一点(如有多条最短路,则T2(j)可能有多值)。
不能经过带P标记的点到达的点的T1值是无穷大(用inf表示),T2是空集。
第三步若这些带有T标记中权和数T1最小的点是k,则点k是带P标记的点外与开始点s最近的点。
把点k的T标记改为P标记,如果权和数最小的点有多个,则把它们都改为P标记。
若点n不是P标记,转第二步(对带有T标记的点重新标记,直至点n为P标记为止)。
第四步追寻最短路,从终点n开始逆向逐次求最短路经过的点权和为P(n).从算法直接可见所得到的路是最短路。
上述算法更具体的步骤如下:不妨设开始点的标号是1。
⑴设N=0,P(1)=0,其余各点都是T标记,T1值为无穷大,T2值为空集。
⑵若vi点为刚成为P标记的(一个或几个)点,将所有与这些vi相邻的带有T标记的点vj的T标记的值改为;若T1(vj,N+1)=P(vi)+cij,则T2(vj,N+1)=vi,若T1(vj,N+1)=T1(vj,N),则T2(vj,N+1)=T2(vj,N),(因此T2可能是多值的)。
Matlab中的网络分析与图论算法
Matlab中的网络分析与图论算法在现代社会中,网络分析和图论算法正变得越来越重要。
随着信息技术的迅猛发展,人们对网络的研究也日益深入。
而Matlab作为一种强大的科学计算软件,其网络分析和图论算法的应用也越来越广泛。
I. 网络分析的概述网络分析是指通过研究网络中的节点(节点可以代表人、物或其他实体)之间的关系,来理解和分析网络的结构和特征。
网络分析方法主要包括节点度数分布、社区结构、中心性指标等。
1. 节点度数分布网络中的节点度数指的是与该节点相连接的其他节点的数量。
在网络分析中,研究节点度数分布可以帮助我们了解网络中节点的连接情况,进而揭示网络的结构特征。
Matlab中有丰富的函数可以用来计算节点度数分布,如hist函数和bar函数。
2. 社区结构社区结构是指网络中的节点按某种规则或特征被划分为多个聚类的情况。
社区结构分析可以帮助我们发现网络中的子群体,进一步研究节点的集聚性和节点之间的相似性。
Matlab中的图论工具箱中提供了多种算法,如谱聚类算法(Spectral Clustering)和模块度优化算法(Modularity Optimization),可以用于社区结构的分析。
3. 中心性指标中心性指标是用来衡量网络中节点的重要性程度。
常见的中心性指标有度中心性(Degree Centrality),介数中心性(Betweenness Centrality)和接近中心性(Closeness Centrality)等。
这些指标可以帮助我们找出网络中的核心节点,并进行节点的排序和权重的计算。
在Matlab中,我们可以使用centrality函数来计算节点的中心性指标。
II. 图论算法的应用图论算法是一类数学算法,用于研究网络的图结构和图的性质。
在Matlab中,有许多图论算法可以帮助我们解决各种实际问题。
1. 最短路径算法最短路径算法用于寻找网络中两个节点之间的最短路径。
其中一种常见的算法是迪杰斯特拉算法(Dijkstra's algorithm),它可以在网络中找到起点到终点的最短路径,并计算路径的长度。
MATLAB程序大全
1.全景图到穹景图这个程序我最初是用FreeImage写的,这两天改成了matlab,再不贴上来,我就要忘了。
看到一篇文章有这样的变换,挺有意思的,就拿来试了一下,文章点此。
全景图到穹顶图变换,通俗的说就是将全景图首尾相接做成一个圆环的样子。
先看下面这张图:下面的矩形就是我们要处理的全景图,上面的矩形是变换后的图像。
下面图像的底边对应穹顶图的内圆,顶边对应穹顶图的外圆,当然,反过来也是可以的。
程序流程:1.定义穹顶图内圆和外圆的半径,变换后的像素就填充在这个内外半径的圆环中。
2.遍历穹顶图,当所处理当前像素位于圆环内,则通过极坐标反变换去全景图中寻找相应位置的像素进行填充。
3.遍历完图像就行了。
用的技巧和图像旋转或放大缩小都是类似的。
处理结果:原图:结果:matlab代码如下:clear all;close all;clc;img=imread('pan.jpg');imshow(img);[m,n]=size(img);r1=100; %内环半径r2=r1+m; %外环半径imgn=zeros(2*r2,2*r2);[re_m,re_n]=size(imgn);for y=1:re_mfor x=1:re_ndis_x=x-re_n/2;dis_y=y-re_m/2;l=sqrt(dis_x^2+dis_y^2);if l<=r2 && l>=r1theta=0;if y>re_m/2theta=atan2(dis_y,dis_x);endif y<re_m/2theta=pi+atan2(-dis_y,-dis_x);endif y==re_m/2theta=atan2(dis_y,dis_x)+0.0001;endxx=ceil(n*theta/(2*pi));yy=ceil(l-r1);if yy>=1 && yy<=m && xx>=1 && xx<=nimgn(y,x)=img(yy,xx);endendendendfigure;imshow(imgn,[])最后要说的是,一般我们要是有一张全景图,通常会用cubic映射,将图像变换为立方体的六个面,然后通过图形学方法贴到立方体上,就能做出类似谷歌街景的样子。
超全图论matlab程序
超全的图论程序关注微信公众号“超级数学建模”,教你做有料、有趣的数模人程序一:可达矩阵算法function P=dgraf(A)n=size(A,1);P=A;for i=2:nP=P+A^i;endP(P~=0)=1;P;程序二:关联矩阵和邻接矩阵互换算法function W=incandadf(F,f)if f==0m=sum(sum(F))/2;n=size(F,1);W=zeros(n,m);k=1;for i=1:nfor j=i:nif F(i,j)~=0W(i,k)=1;W(j,k)=1;k=k+1;endendendelseif f==1m=size(F,2);n=size(F,1);W=zeros(n,n);for i=1:ma=find(F(:,i)~=0);W(a(1),a(2))=1;W(a(2),a(1))=1;endelsefprint('Please imput the right value of f');endW;程序三:有向图关联矩阵和邻接矩阵互换算法function W=mattransf(F,f)if f==0m=sum(sum(F));n=size(F,1);W=zeros(n,m);k=1;for i=1:nfor j=i:nif F(i,j)~=0W(i,k)=1;W(j,k)=-1;k=k+1;endendendelseif f==1m=size(F,2);n=size(F,1);W=zeros(n,n);for i=1:ma=find(F(:,i)~=0);if F(a(1),i)==1W(a(1),a(2))=1;elseW(a(2),a(1))=1;endendelsefprint('Please imput the right value of f'); endW;第二讲:最短路问题程序一:Dijkstra算法(计算两点间的最短路)function [l,z]=Dijkstra(W)n = size (W,1);for i = 1 :nl(i)=W(1,i);z(i)=0;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-1;if j<ii=j-1;endendendi=i+1;end程序二:floyd算法(计算任意两点间的最短距离)function [d,r]=floyd(a)n=size(a,1);d=a;for i=1:nfor j=1:nr(i,j)=j;endendr;for 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); r(i,j)=r(i,k);endendendend程序三:n2short.m 计算指定两点间的最短距离function [P u]=n2short(W,k1,k2)n=length(W);U=W;m=1;while m<=nfor i=1:nfor j=1:nif U(i,j)>U(i,m)+U(m,j)U(i,j)=U(i,m)+U(m,j);endendendm=m+1;endu=U(k1,k2);P1=zeros(1,n);k=1;P1(k)=k2;V=ones(1,n)*inf;kk=k2;while kk~=k1for i=1:nV(1,i)=U(k1,kk)-W(i,kk);if V(1,i)==U(k1,i)P1(k+1)=i;kk=i;k=k+1;endendendk=1;wrow=find(P1~=0);for j=length(wrow):-1:1P(k)=P1(wrow(j));k=k+1;endP;程序四、n1short.m(计算某点到其它所有点的最短距离)function[Pm D]=n1short(W,k)n=size(W,1);D=zeros(1,n);for i=1:n[P d]=n2short(W,k,i);Pm{i}=P;D(i)=d;end程序五:pass2short.m(计算经过某两点的最短距离) function [P d]=pass2short(W,k1,k2,t1,t2)[p1 d1]=n2short(W,k1,t1);[p2 d2]=n2short(W,t1,t2);[p3 d3]=n2short(W,t2,k2);dt1=d1+d2+d3;[p4 d4]=n2short(W,k1,t2);[p5 d5]=n2short(W,t2,t1);[p6 d6]=n2short(W,t1,k2);dt2=d4+d5+d6;if dt1<dt2d=dt1;P=[p1 p2(2:length(p2)) p3(2:length(p3))]; elsed=dt1;p=[p4 p5(2:length(p5)) p6(2:length(p6))]; endP;d;第三讲:最小生成树程序一:最小生成树的Kruskal算法function [T c]=krusf(d,flag)if nargin==1n=size(d,2);m=sum(sum(d~=0))/2;b=zeros(3,m);k=1;for i=1:nfor j=(i+1):nif d(i,j)~=0b(1,k)=i;b(2,k)=j;b(3,k)=d(i,j);k=k+1;endendendelseb=d;endn=max(max(b(1:2,:)));m=size(b,2);[B,i]=sortrows(b',3);B=B';c=0;T=[];k=1;t=1:n;for i=1:mif t(B(1,i))~=t(B(2,i))T(1:2,k)=B(1:2,i);c=c+B(3,i);k=k+1;tmin=min(t(B(1,i)),t(B(2,i)));tmax=max(t(B(1,i)),t(B(2,i)));for j=1:nif t(j)==tmaxt(j)=tmin;endendendif k==nbreak;endendT;c;程序二:最小生成树的Prim算法function [T c]=Primf(a)l=length(a);a(a==0)=inf;k=1:l;listV(k)=0;listV(1)=1;e=1;while (e<l)min=inf;for i=1:lif listV(i)==1for j=1:lif listV(j)==0 & min>a(i,j)min=a(i,j);b=a(i,j);s=i;d=j;endendendendlistV(d)=1;distance(e)=b;source(e)=s;destination(e)=d;e=e+1;endT=[source;destination];for g=1:e-1c(g)=a(T(1,g),T(2,g));endc;另外两种程序最小生成树程序1(prim 算法构造最小生成树)a=[inf 50 60 inf inf inf inf;50 inf inf 65 40 inf inf;60 inf inf 52 inf inf 45;...inf 65 52 inf 50 30 42;inf 40 inf 50 inf 70 inf;inf inf inf 30 70 inf inf;...inf inf 45 42 inf inf inf];result=[];p=1;tb=2:length(a);while length(result)~=length(a)-1temp=a(p,tb);temp=temp(:);d=min(temp);[jb,kb]=find(a(p,tb)==d);j=p(jb(1));k=tb(kb(1));result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[];endresult最小生成树程序2(Kruskal 算法构造最小生成树)clc;clear;a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40;a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)=30;a(4,7)=42; a(5,6)=70;[i,j,b]=find(a);data=[i';j';b'];index=data(1:2,:);loop=max(size(a))-1;result=[];while length(result)<looptemp=min(data(3,:));flag=find(data(3,:)==temp);flag=flag(1);v1=data(1,flag);v2=data(2,flag);if index(1,flag)~=index(2,flag)result=[result,data(:,flag)];endindex(find(index==v2))=v1;data(:,flag)=[];index(:,flag)=[];endresult第四讲:Euler图和Hamilton图程序一:Fleury算法(在一个Euler图中找出Euler环游)注:包括三个文件;fleuf1.m, edf.m, flecvexf.m function [T c]=fleuf1(d)%注:必须保证是Euler环游,否则输出T=0,c=0n=length(d);b=d;b(b==inf)=0;b(b~=0)=1;m=0;a=sum(b);eds=sum(a)/2;ed=zeros(2,eds);vexs=zeros(1,eds+1);matr=b;for i=1:nif mod(a(i),2)==1m=m+1;endendif m~=0fprintf('there is not exit Euler path.\n') T=0;c=0;endif m==0vet=1;flag=0;t1=find(matr(vet,:)==1);for ii=1:length(t1)ed(:,1)=[vet,t1(ii)];vexs(1,1)=vet;vexs(1,2)=t1(ii);matr(vexs(1,2),vexs(1,1))=0;flagg=1;tem=1;while flagg[flagg ed]=edf(matr,eds,vexs,ed,tem); tem=tem+1;if ed(1,eds)~=0 & ed(2,eds)~=0T=ed;T(2,eds)=1;c=0;for g=1:edsc=c+d(T(1,g),T(2,g));endflagg=0;break;endendendendfunction[flag ed]=edf(matr,eds,vexs,ed,tem)flag=1;for i=2:eds[dvex f]=flecvexf(matr,i,vexs,eds,ed,tem);if f==1flag=0;break;endif dvex~=0ed(:,i)=[vexs(1,i) dvex];vexs(1,i+1)=dvex;matr(vexs(1,i+1),vexs(1,i))=0;elsebreak;endendfunction [dvex f]=flecvexf(matr,i,vexs,eds,ed,temp) f=0;edd=find(matr(vexs(1,i),:)==1);dvex=0;dvex1=[];ded=[];if length(edd)==1dvex=edd;elsedd=1;dd1=0;kkk=0;for kk=1:length(edd)m1=find(vexs==edd(kk));if sum(m1)==0dvex1(dd)=edd(kk);dd=dd+1;dd1=1;elsekkk=kkk+1;endendif kkk==length(edd)tem=vexs(1,i)*ones(1,kkk);edd1=[tem;edd];for l1=1:kkklt=0;ddd=1;for l2=1:edsif edd1(1:2,l1)==ed(1:2,l2)lt=lt+1;endendif lt==0ded(ddd)=edd(l1);ddd=ddd+1;endendendif temp<=length(dvex1)dvex=dvex1(temp);elseif temp>length(dvex1) & temp<=length(ded)dvex=ded(temp);elsef=1;endend程序二:Hamilton改良圈算法(找出比较好的Hamilton路)function [C d1]= hamiltonglf(v)%d表示权值矩阵%C表示算法最终找到的Hamilton圈。
图论MATLAB算法
第一章:Dijkstra 算法开始?dot i ≤输入,确定邻接矩阵a 确定邻接矩阵a 的节点数dot1=i算每一个节点到U 中每一个节点的最小值 输出第n i 个节点到第一个节点的最小距离i L ,i=1∧dot结束算这dot 个最小值的最小值l ,并确定其节点位置i nl L i n =将第一个节点放入集合U 中将已经确定的第i n 节点到所有节点的权值赋为∞ 将所有节点到第i n 节点的权值加上l 并代替之 ?2>i1+=i i将第i n 节点放入集合U 中 YESNOYESNO求下面赋权图(左图)中顶点u0到其余顶点的最短路。
其邻接矩阵W 为:⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞=024782063446046340357630135102273201847210W)(i u l迭 代 次 数0u 1u 2u 3u 4u 5u 6u 7u1 2 3 4 5 6 7 8 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞1 2 ∞ 7 ∞ 4 82 4 7 ∞ 4 83 7 ∞4 86 9 4 86 9 69 6 9 最后标记)(v l )(v z0 1 2 3 6 9 4 6 0u 0u 0u 2u 3u 3u 0u 6u1u 2u 3u 4u 5u 6u 7u 0ufunction dijkstra%注:此程序仅作参考,欢迎批评指正。
clcclear%Dijkstra算法:%%%%给邻接矩阵赋值%%%%%%%%%%%%a=[0,1,2,inf,7,inf,4,8;1,0,2,3,inf,inf,inf,7;0,0,0,1,5,inf,inf,inf;0,0,0,0,3,6,inf,inf;0,0,0,0,0,4,3,inf;0,0,0,0,0,0,6,4;0,0,0,0,0,0,0,2;];for i=2:8for j=1:i-1a(i,j)=a(j,i);endenddot=size(a,1);%节点数fprintf('\t邻接矩阵的标准形式:');afuquantu=a;%在赋权图中用到fprintf('\t其中,inf代表无穷大∞,a(i,j)代表第i个节点到第j个节点的权。
应用篇-第14章-图论算法及其MATLAB实现
对每个图G=(V,E),均有
d(v)=2|E|
vV
证明:根据顶点度的定义,在计算点度时每条边对于它所关联的顶点被计 算了两次。因此,图G 中点度的总和恰为边数|V|的2倍。证毕。 推论14.1 在任何图G=(V,E)中,奇点的个数为偶数。
定理14.4对任意有向图D=(V,A)均有
14.8 Dijkstra 算法及其MATLAB实现
14.8.1 问题描述与算法思想
Dijkstra算法是解单源最短路径问题的一个贪心算法。其基本思想是,设置 一个顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当 且仅当从源到该顶点的最短路径长度已知。设v是图中的一个顶点,记L(v) 为顶点v到源点v1的最短距离, vi , v j V 若 (vi , v j ) E ,记vi到vj的权。
① A(G)为对称矩阵;
② 若G 为无环图,则A(G)中第i行(列)的元素之和等于顶点vi的度; ③ 两图G 和H 同构的充分必要条件是存在置换矩阵P 使得A(G)=PTA(H)P。
类似地,有向图D 的邻接矩阵A(D)=(aij)n×n的元素aij定义为:元素aij表示从始点vi到 终点vj的有向边的条,,其中vi和vj为D 的顶点。
14.3.2 关联矩=(V,E),其中顶点集V={v1,v2,…,vn},边集E={e1,e2,…,eε}。 用 mij表示顶点vi与边ej关联的次数,可能取值为0,1,2,称所得矩阵M(G)=(mij)n×ε为 图G 的关联矩阵。 类似地,有向图D 的关联矩阵M(D)=(mij)n×ε的元素mij定义为:
14.2.4 路
在图论理论中,路具有特殊的重要性,古往今来,许多学者均对它进行过深入研究。本 节主要介绍简单图G=(V,E)中有关路和连通性的简单性质。 定理14.1 若图G 中有一条(u,v)途径,则G 中也存在一条(u,v)路。
图论编程实现连通图实验报告MATLAB
连通图的判断
一、实验目的
了解连通图的判定方法。
二、实验内容
1、设计一个算法判断图是否连通;
2、在matlab中编程来实现此算法。
用下面的实例来调试程序:
三、使用环境
个人计算机,MATLAB软件
四、编程思路
从邻接矩阵中得到顶点数N,对邻接矩阵求N次方,并求其秩,可以通过邻接矩阵N次幂的秩来判断是否为连通,连通图的秩+1=顶点数,则连通。
五、调试过程
1.程序代码:
function liantong(F)
n=size(F,1);%计算矩阵行数
P=zeros(n,n);%生成同维0矩阵
k=1;
for k=1:n
F1=F^k;
P=P+F1;%将原矩阵的n次方传给P
end
S=n-rank(P);%求矩阵的秩
if S==1
disp('连通');
else
disp('不连通');
end
2.运行窗口:
在运行窗口输入:。
图论的matlab算法概要
第六讲图论初步§ 6.1 引言图论是运筹学的一个经典和重要的分支,它起源于欧拉(Euler 对七桥问题的抽象和论证。
1936年, 匈牙利数学家柯尼希(König出版了图论的第一部专著《有限图与无限图理论》 ,竖立了图论发展的第一座里程碑。
此后,图论进入发展与突破的快车道,所研究的问题涉及经济管理、工业工程、交通运输、计算机科学与信息技术、通讯与网络技术等诸多领域。
近几十年来,由于计算机技术和科学的飞速发展,大大地促进了图论研究和应用,图论的理论和方法已经渗透到物理、化学、通讯科学、建筑学、生物遗传学、心理学、经济学、社会学等学科中。
图论中所谓的“图”是指某类具体事物和这些事物之间的联系。
如果我们用点表示这些具体事物,用连接两点的线段(直的或曲的表示两个事物的特定的联系,就得到了描述这个“图”的几何形象。
图论为任何一个包含了一种二元关系的离散系统提供了一个数学模型,借助于图论的概念、理论和方法,可以对该模型求解。
引例 6.1.1 最短路问题(SPP -shortest path problem一名货柜车司机奉命在最短的时间内将一车货物从甲地运往乙地。
从甲地到乙地的公路网纵横交错, 因此有多种行车路线,这名司机应选择哪条线路呢?假设货柜车的运行速度是恒定的,那么这一问题相当于需要找到一条从甲地到乙地的最短路。
引例 6.1.2 中国邮递员问题(CPP -chinese postman problem一名邮递员负责投递某个街区的邮件。
如何为他(她设计一条最短的投递路线(从邮局出发,经过投递区内每条街道至少一次,最后返回邮局?由于这一问题是我国管梅谷教授 1960年首先提出的,所以国际上称之为中国邮递员问题。
引例 6.1.3 旅行商问题(TSP -traveling salesman problem一名推销员准备前往若干城市推销产品。
如何为他(她设计一条最短的旅行路线(从驻地出发,经过每个城市恰好一次,最后返回驻地?这一问题的研究历史十分悠久,通常称之为旅行商问题。
图论举例MATLAB
例1 某公司在六个城市621,,,c c c 中有分公司,从i c 到j c 的直接航程票价记在下述矩阵的),(j i 位置上。
(∞表示无直接航路),请帮助该公司设计一张城市1c 到其它城市间的票价最便宜的路线图。
⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎣⎡∞∞∞∞∞∞055252510550102025251001020402010015252015050102540500用矩阵n n a ⨯(n 为顶点个数)存放各边权的邻接矩阵,行向量pb 、1index 、2index 、d 分别用来存放P 标号信息、标号顶点顺序、标号顶点索引、最短通路的值。
其中分量⎩⎨⎧=顶点未标号当第顶点已标号当第i i i pb 01)(; )(2i index 存放始点到第i 点最短通路中第i 顶点前一顶点的序号;)(i d 存放由始点到第i 点最短通路的值。
求第一个城市到其它城市的最短路径的Matlab 程序如下: clear; clc;M=10000;a(1,:)=[0,50,M,40,25,10];a(2,:)=[zeros(1,2),15,20,M,25]; a(3,:)=[zeros(1,3),10,20,M]; a(4,:)=[zeros(1,4),10,25]; a(5,:)=[zeros(1,5),55]; a(6,:)=zeros(1,6); a=a+a';pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a)); d(1:length(a))=M;d(1)=0;temp=1; while sum(pb)<length(a) tb=find(pb==0);d(tb)=min(d(tb),d(temp)+a(temp,tb)); tmpb=find(d(tb)==min(d(tb))); temp=tb(tmpb(1)); pb(temp)=1;index1=[index1,temp];index=index1(find(d(index1)==d(temp)-a(temp,index1))); if length(index)>=2index=index(1);endindex2(temp)=index;endd, index1, index2例2 从北京(Pe)乘飞机到东京(T)、纽约(N)、墨西哥城(M)、伦敦(L)、巴黎(Pa)五城市做旅游,每城市恰去一次再回北京,应如何安排旅游线,使旅程最短?各城市之间的航线clc,cleara(1,2)=56;a(1,3)=35;a(1,4)=21;a(1,5)=51;a(1,6)=60;a(2,3)=21;a(2,4)=57;a(2,5)=78;a(2,6)=70;a(3,4)=36;a(3,5)=68;a(3,6)=68;a(4,5)=51;a(4,6)=61;a(5,6)=13;a(6,:)=0;a=a+a';c1=[5 1:4 6];L=length(c1);flag=1;while flag>0flag=0;for m=1:L-3for n=m+2:L-1ifa(c1(m),c1(n))+a(c1(m+1),c1(n+1))<a(c1(m),c1(m+1))+a(c1(n),c1(n+1 ))flag=1;c1(m+1:n)=c1(n:-1:m+1);endendendendsum1=0;for i=1:L-1sum1=sum1+a(c1(i),c1(i+1));endcircle=c1;sum=sum1;c1=[5 6 1:4];%改变初始圈,该算法的最后一个顶点不动flag=1;while flag>0flag=0;for m=1:L-3for n=m+2:L-1if a(c1(m),c1(n))+a(c1(m+1),c1(n+1))<... a(c1(m),c1(m+1))+a(c1(n),c1(n+1))flag=1;c1(m+1:n)=c1(n:-1:m+1);endendendendsum1=0;for i=1:L-1sum1=sum1+a(c1(i),c1(i+1));endif sum1<sumsum=sum1;circle=c1;endcircle,sum。
matlab图论程序算法大全
图论算法matlab实现求最小费用最大流算法的 MATLAB 程序代码如下:n=5;C=[0 15 16 0 00 0 0 13 140 11 0 17 00 0 0 0 80 0 0 0 0]; %弧容量b=[0 4 1 0 00 0 0 6 10 2 0 3 00 0 0 0 20 0 0 0 0]; %弧上单位流量的费用wf=0;wf0=Inf; %wf 表示最大流量, wf0 表示预定的流量值for(i=1:n)for(j=1:n)f(i,j)=0;end;end %取初始可行流f 为零流while(1)for(i=1:n)for(j=1:n)if(j~=i)a(i,j)=Inf;end;end;end%构造有向赋权图for(i=1:n)for(j=1:n)if(C(i,j)>0&f(i,j)==0)a(i,j)=b(i,j);elseif(C(i,j)>0&f(i,j)==C(i,j))a(j,i)=-b(i,j);elseif(C(i,j)>0)a(i,j)=b(i,j);a(j,i)=-b(i,j);end;end;endfor(i=2:n)p(i)=Inf;s(i)=i;end %用Ford 算法求最短路, 赋初值for(k=1:n)pd=1; %求有向赋权图中vs 到vt 的最短路for(i=2:n)for(j=1:n)if(p(i)>p(j)+a(j,i))p(i)=p(j)+a(j,i);s(i)=j;pd=0;end;end;en dif(pd)break;end;end %求最短路的Ford 算法结束if(p(n)==Inf)break;end %不存在vs 到vt 的最短路, 算法终止. 注意在求最小费用最大流时构造有向赋权图中不会含负权回路, 所以不会出现k=ndvt=Inf;t=n; %进入调整过程, dvt 表示调整量while(1) %计算调整量if(a(s(t),t)>0)dvtt=C(s(t),t)-f(s(t),t); %前向弧调整量elseif(a(s(t),t)<0)dvtt=f(t,s(t));end %后向弧调整量if(dvt>dvtt)dvt=dvtt;endif(s(t)==1)break;end %当t 的标号为vs 时, 终止计算调整量t=s(t);end %继续调整前一段弧上的流fpd=0;if(wf+dvt>=wf0)dvt=wf0-wf;pd=1;end%如果最大流量大于或等于预定的流量值t=n;while(1) %调整过程if(a(s(t),t)>0)f(s(t),t)=f(s(t),t)+dvt; %前向弧调整elseif(a(s(t),t)<0)f(t,s(t))=f(t,s(t))-dvt;end %后向弧调整if(s(t)==1)break;end %当t 的标号为vs 时, 终止调整过程t=s(t);endif(pd)break;end%如果最大流量达到预定的流量值wf=0; for(j=1:n)wf=wf+f(1,j);end;end %计算最大流量zwf=0;for(i=1:n)for(j=1:n)zwf=zwf+b(i,j)*f(i,j);end;end%计算最小费用f %显示最小费用最大流图 6-22wf %显示最小费用最大流量zwf %显示最小费用, 程序结束__Kruskal 避圈法:Kruskal 避圈法的MATLAB 程序代码如下:n=8;A=[0 2 8 1 0 0 0 02 0 6 0 1 0 0 08 6 0 7 5 1 2 01 0 7 0 0 0 9 00 1 5 0 0 3 0 80 0 1 0 3 0 4 60 0 2 9 0 4 0 30 0 0 0 8 6 3 0];k=1; %记录A中不同正数的个数for(i=1:n-1)for(j=i+1:n) %此循环是查找A中所有不同的正数if(A(i,j)>0)x(k)=A(i,j); %数组x 记录A中不同的正数kk=1; %临时变量for(s=1:k-1)if(x(k)==x(s))kk=0;break;end;end %排除相同的正数k=k+kk;end;end;endk=k-1 %显示A中所有不同正数的个数for(i=1:k-1)for(j=i+1:k) %将x 中不同的正数从小到大排序if(x(j)<x(i))xx=x(j);x(j)=x(i);x(i)=xx;end;end;endT(n,n)=0; %将矩阵T 中所有的元素赋值为0q=0; %记录加入到树T 中的边数for(s=1:k)if(q==n)break;end %获得最小生成树T, 算法终止for(i=1:n-1)for(j=i+1:n)if (A(i,j)==x(s))T(i,j)=x(s);T(j,i)=x(s); %加入边到树T 中TT=T; %临时记录Twhile(1)pd=1; %砍掉TT 中所有的树枝for(y=1:n)kk=0;for(z=1:n)if(TT(y,z)>0)kk=kk+1;zz=z;end;end %寻找TT 中的树枝if(kk==1)TT(y,zz)=0;TT(zz,y)=0;pd=0;end;end %砍掉TT 中的树枝if(pd)break;end;end %已砍掉了TT 中所有的树枝pd=0; %判断TT 中是否有圈for(y=1:n-1)for(z=y+1:n)if(TT(y,z)>0)pd=1;break;end;end;endif(pd)T(i,j)=0;T(j,i)=0; %假如TT 中有圈else q=q+1;end;end;end;end;endT %显示近似最小生成树T, 程序结束用Warshall-Floyd 算法求任意两点间的最短路.n=8;A=[0 2 8 1 Inf Inf Inf Inf2 0 6 Inf 1 Inf Inf Inf8 6 0 7 5 1 2 Inf1 Inf 7 0 Inf Inf 9 InfInf 1 5 Inf 0 3 Inf 8Inf Inf 1 Inf 3 0 4 6Inf Inf 2 9 Inf 4 0 3Inf Inf Inf Inf 8 6 3 0]; % MATLAB 中, Inf 表示∞D=A; %赋初值for(i=1:n)for(j=1:n)R(i,j)=j;end;end %赋路径初值for(k=1:n)for(i=1:n)for(j=1:n)if(D(i,k)+D(k,j)<D(i,j))D(i,j)=D(i,k)+D(k,j); %更新dijR(i,j)=k;end;end;end %更新rijk %显示迭代步数D %显示每步迭代后的路长R %显示每步迭代后的路径pd=0;for i=1:n %含有负权时if(D(i,i)<0)pd=1;break;end;end %存在一条含有顶点vi 的负回路if(pd)break;end %存在一条负回路, 终止程序end %程序结束利用 Ford--Fulkerson 标号法求最大流算法的MATLAB 程序代码如下:n=8;C=[0 5 4 3 0 0 0 00 0 0 0 5 3 0 00 0 0 0 0 3 2 00 0 0 0 0 0 2 00 0 0 0 0 0 0 40 0 0 0 0 0 0 30 0 0 0 0 0 0 50 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 记录标号图 6-19while(1)No(1)=n+1;d(1)=Inf; %给发点vs 标号while(1)pd=1; %标号过程for(i=1:n)if(No(i)) %选择一个已标号的点vifor(j=1:n)if(No(j)==0&f(i,j)<C(i,j)) %对于未给标号的点vj, 当vivj 为非饱和弧时No(j)=i;d(j)=C(i,j)-f(i,j);pd=0;if(d(j)>d(i))d(j)=d(i);endelseif(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;endif(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; %继续调整前一段弧上的流fwf=0;for(j=1:n)wf=wf+f(1,j);end %计算最大流量f %显示最大流wf %显示最大流量No %显示标号, 由此可得最小割, 程序结束图论程序大全程序一:关联矩阵和邻接矩阵互换算法function W=incandadf(F,f)if f==0m=sum(sum(F))/2;n=size(F,1);W=zeros(n,m);k=1;for i=1:nfor j=i:nif F(i,j)~=0W(i,k)=1;W(j,k)=1;k=k+1;endendendelseif f==1m=size(F,2);n=size(F,1);W=zeros(n,n);for i=1:ma=find(F(:,i)~=0);W(a(1),a(2))=1;W(a(2),a(1))=1;endelsefprint('Please imput the right value of f');endW;程序二:可达矩阵算法function P=dgraf(A)n=size(A,1);P=A;for i=2:nP=P+A^i;endP(P~=0)=1;P;程序三:有向图关联矩阵和邻接矩阵互换算法function W=mattransf(F,f)if f==0m=sum(sum(F));n=size(F,1);W=zeros(n,m);k=1;for i=1:nfor j=i:nif F(i,j)~=0W(i,k)=1;W(j,k)=-1;k=k+1;endendendelseif f==1m=size(F,2);n=size(F,1);W=zeros(n,n);for i=1:ma=find(F(:,i)~=0);if F(a(1),i)==1W(a(1),a(2))=1;elseW(a(2),a(1))=1;endendelsefprint('Please imput the right value of f'); endW;第二讲:最短路问题程序一:Dijkstra算法(计算两点间的最短路)function [l,z]=Dijkstra(W)n = size (W,1);for i = 1 :nl(i)=W(1,i);z(i)=0;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-1;if j<ii=j-1;endendendi=i+1;end程序二:floyd算法(计算任意两点间的最短距离)function [d,r]=floyd(a)n=size(a,1);d=a;for i=1:nfor j=1:nr(i,j)=j;endendr;for 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);r(i,j)=r(i,k);endendendend程序三:n2short.m 计算指定两点间的最短距离function [P u]=n2short(W,k1,k2)n=length(W);U=W;m=1;while m<=nfor i=1:nfor j=1:nif U(i,j)>U(i,m)+U(m,j)U(i,j)=U(i,m)+U(m,j);endendendm=m+1;endu=U(k1,k2);P1=zeros(1,n);k=1;P1(k)=k2;V=ones(1,n)*inf;kk=k2;while kk~=k1for i=1:nV(1,i)=U(k1,kk)-W(i,kk);if V(1,i)==U(k1,i)P1(k+1)=i;kk=i;k=k+1;endendendk=1;wrow=find(P1~=0);for j=length(wrow):-1:1P(k)=P1(wrow(j));k=k+1;endP;程序四、n1short.m(计算某点到其它所有点的最短距离)function[Pm D]=n1short(W,k)n=size(W,1);D=zeros(1,n);for i=1:n[P d]=n2short(W,k,i);Pm{i}=P;D(i)=d;end程序五:pass2short.m(计算经过某两点的最短距离)function [P d]=pass2short(W,k1,k2,t1,t2)[p1 d1]=n2short(W,k1,t1);[p2 d2]=n2short(W,t1,t2);[p3 d3]=n2short(W,t2,k2);dt1=d1+d2+d3;[p4 d4]=n2short(W,k1,t2);[p5 d5]=n2short(W,t2,t1);[p6 d6]=n2short(W,t1,k2);dt2=d4+d5+d6;if dt1<dt2d=dt1;P=[p1 p2(2:length(p2)) p3(2:length(p3))];elsed=dt1;p=[p4 p5(2:length(p5)) p6(2:length(p6))];endP;d;第三讲:最小生成树程序一:最小生成树的Kruskal算法function [T c]=krusf(d,flag)if nargin==1n=size(d,2);m=sum(sum(d~=0))/2;b=zeros(3,m);k=1;for i=1:nfor j=(i+1):nif d(i,j)~=0b(1,k)=i;b(2,k)=j;b(3,k)=d(i,j);k=k+1;endendendelseb=d;endn=max(max(b(1:2,:)));m=size(b,2);[B,i]=sortrows(b',3);B=B';c=0;T=[];k=1;t=1:n;for i=1:mif t(B(1,i))~=t(B(2,i))T(1:2,k)=B(1:2,i);c=c+B(3,i);k=k+1;tmin=min(t(B(1,i)),t(B(2,i)));tmax=max(t(B(1,i)),t(B(2,i)));for j=1:nif t(j)==tmaxt(j)=tmin;endendendif k==nbreak;endendT;c;程序二:最小生成树的Prim算法function [T c]=Primf(a)l=length(a);a(a==0)=inf;k=1:l;listV(k)=0;listV(1)=1;e=1;while (e<l)min=inf;for i=1:lif listV(i)==1for j=1:lif listV(j)==0 & min>a(i,j)min=a(i,j);b=a(i,j);s=i;d=j;endendendendlistV(d)=1;distance(e)=b;source(e)=s;destination(e)=d;e=e+1;endT=[source;destination];for g=1:e-1c(g)=a(T(1,g),T(2,g));endc;另外两种程序最小生成树程序1(prim 算法构造最小生成树)a=[inf 50 60 inf inf inf inf;50 inf inf 65 40 inf inf;60 inf inf 52 inf inf 45;...inf 65 52 inf 50 30 42;inf 40 inf 50 inf 70 inf;inf inf inf 30 70 inf inf;...inf inf 45 42 inf inf inf];result=[];p=1;tb=2:length(a);while length(result)~=length(a)-1temp=a(p,tb);temp=temp(:);d=min(temp);[jb,kb]=find(a(p,tb)==d);j=p(jb(1));k=tb(kb(1));result=[result,[j;k;d]];p=[p,k];tb(find(tb==k))=[];endresult最小生成树程序2(Kruskal 算法构造最小生成树)clc;clear;a(1,2)=50; a(1,3)=60; a(2,4)=65; a(2,5)=40;a(3,4)=52;a(3,7)=45; a(4,5)=50; a(4,6)=30;a(4,7)=42; a(5,6)=70;[i,j,b]=find(a);data=[i';j';b'];index=data(1:2,:);loop=max(size(a))-1;result=[];while length(result)<looptemp=min(data(3,:));flag=find(data(3,:)==temp);flag=flag(1);v1=data(1,flag);v2=data(2,flag);if index(1,flag)~=index(2,flag)result=[result,data(:,flag)];endindex(find(index==v2))=v1;data(:,flag)=[];index(:,flag)=[];endresult第四讲:Euler图和Hamilton图程序一:Fleury算法(在一个Euler图中找出Euler环游)注:包括三个文件;fleuf1.m, edf.m, flecvexf.mfunction [T c]=fleuf1(d)%注:必须保证是Euler环游,否则输出T=0,c=0n=length(d);b=d;b(b==inf)=0;b(b~=0)=1;m=0;a=sum(b);eds=sum(a)/2;ed=zeros(2,eds);vexs=zeros(1,eds+1);matr=b;for i=1:nif mod(a(i),2)==1m=m+1;endendif m~=0fprintf('there is not exit Euler path.\n')T=0;c=0;endif m==0vet=1;flag=0;t1=find(matr(vet,:)==1);for ii=1:length(t1)ed(:,1)=[vet,t1(ii)];vexs(1,1)=vet;vexs(1,2)=t1(ii);matr(vexs(1,2),vexs(1,1))=0;flagg=1;tem=1;while flagg[flagg ed]=edf(matr,eds,vexs,ed,tem); tem=tem+1;if ed(1,eds)~=0 & ed(2,eds)~=0T=ed;T(2,eds)=1;c=0;for g=1:edsc=c+d(T(1,g),T(2,g));endflagg=0;break;endendendendfunction[flag ed]=edf(matr,eds,vexs,ed,tem)flag=1;for i=2:eds[dvex f]=flecvexf(matr,i,vexs,eds,ed,tem);if f==1flag=0;break;endif dvex~=0ed(:,i)=[vexs(1,i) dvex];vexs(1,i+1)=dvex;matr(vexs(1,i+1),vexs(1,i))=0;elsebreak;endendfunction [dvex f]=flecvexf(matr,i,vexs,eds,ed,temp) f=0;edd=find(matr(vexs(1,i),:)==1);dvex=0;dvex1=[];ded=[];if length(edd)==1dvex=edd;elsedd=1;dd1=0;kkk=0;for kk=1:length(edd)m1=find(vexs==edd(kk));if sum(m1)==0dvex1(dd)=edd(kk);dd=dd+1;dd1=1;elsekkk=kkk+1;endendif kkk==length(edd)tem=vexs(1,i)*ones(1,kkk);edd1=[tem;edd];for l1=1:kkklt=0;ddd=1;for l2=1:edsif edd1(1:2,l1)==ed(1:2,l2)lt=lt+1;endendif lt==0ded(ddd)=edd(l1);ddd=ddd+1;endendendif temp<=length(dvex1)dvex=dvex1(temp);elseif temp>length(dvex1) & temp<=length(ded)dvex=ded(temp);elsef=1;endend程序二:Hamilton改良圈算法(找出比较好的Hamilton路)function [C d1]= hamiltonglf(v)%d表示权值矩阵%C表示算法最终找到的Hamilton圈。
图论算法及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 到jv 的权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 到nv 的最短路径,则121n v v v -也必然是从1v 到1n v -的最优路径。
在下面的MATLAB 实现代码中,我们用到了距离矩阵,矩阵第i 行第j 行元素表示顶点i v 到jv 的权ijw ,若i v 到jv 无边,则realmaxij w =,其中realmax 是MATLAB 常量,表示最大的实数(1.7977e+308)。
function re=Dijkstra(ma)%用Dijkstra算法求单源最短路径%输入参量ma是距离矩阵%输出参量是一个三行n列矩阵,每列表示顶点号及顶点到源的最短距离和前顶点n=size(ma,1);%得到距离矩阵的维数s=ones(1,n);s(1)=0;%标记集合S和S的补r=zeros(3,n);r(1,:)=1:n;r(2,2:end)=realmax;%初始化for i=2:n;%控制循环次数mm=realmax;for j=find(s==0);%集合S中的顶点for k=find(s==1);%集合S补中的顶点if(r(2,j)+ma(j,k)<r(2,k))r(2,k)=r(2,j)+ma(j,k);r(3,k)=j;endif(mm>r(2,k))mm=r(2,k);t=k;endendends(1,t)=0;%找到最小的顶点加入集合S end re=r;1.2 动态规划求解最短路径动态规划是美国数学家Richard Bellman 在1951年提出来的分析一类多阶段决策过程的最优化方法,在工程技术、工业生产、经济管理、军事及现代化控制工程等方面均有着广泛的应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(图论)matlab模板程序第一讲:图论模型程序一:可达矩阵算法%根据邻接矩阵A(有向图)求可达矩阵P(有向图)function P=dgraf(A)n=size(A,1);P=A;for i=2:nP=P+A^i;endP(P~=0)=1; %将不为0的元素变为1P;程序二:无向图关联矩阵和邻接矩阵互换算法F表示所给出的图的相应矩阵W表示程序运行结束后的结果f=0表示把邻接矩阵转换为关联矩阵f=1表示把关联矩阵转换为邻接矩阵%无向图的关联矩阵和邻接矩阵的相互转换function W=incandadf(F,f)if f==0 %邻接矩阵转换为关联矩阵m=sum(sum(F))/2; %计算图的边数n=size(F,1);W=zeros(n,m);k=1;for i=1:nfor j=i:nif F(i,j)~=0W(i,k)=1; %给边的始点赋值为1W(j,k)=1; %给边的终点赋值为1k=k+1;endendendelseif f==1 %关联矩阵转换为邻接矩阵m=size(F,2);n=size(F,1);W=zeros(n,n);for i=1:ma=find(F(:,i)~=0);W(a(1),a(2))=1; %存在边,则邻接矩阵的对应值为1W(a(2),a(1))=1;endelsefprint('Please imput the right value of f');endW;程序三:有向图关联矩阵和邻接矩阵互换算法%有向图的关联矩阵和邻接矩阵的转换function W=mattransf(F,f)if f==0 %邻接矩阵转换为关联矩阵m=sum(sum(F));n=size(F,1);W=zeros(n,m);k=1;for i=1:nfor j=i:nif F(i,j)~=0 %由i发出的边,有向边的始点W(i,k)=1; %关联矩阵始点值为1W(j,k)=-1; %关联矩阵终点值为-1k=k+1;endendendelseif f==1 %关联矩阵转换为邻接矩阵m=size(F,2);n=size(F,1);W=zeros(n,n);for i=1:ma=find(F(:,i)~=0); %有向边的两个顶点if F(a(1),i)==1W(a(1),a(2))=1; %有向边由a(1)指向a(2)elseW(a(2),a(1))=1; %有向边由a(2)指向a(1)endendelsefprint('Please imput the right value of f');endW;第二讲:最短路问题程序0:最短距离矩阵W表示图的权值矩阵D表示图的最短距离矩阵%连通图中各项顶点间最短距离的计算function D=shortdf(W)%对于W(i,j),若两顶点间存在弧,则为弧的权值,否则为inf;当i=j时W(i,j)=0 n=length(W);D=W;m=1;while m<=nfor i=1:nfor j=1:nif D(i,j)>D(i,m)+D(m,j)D(i,j)+ D(i,m)+D(m,j); %距离进行更新endendendm=m+1;endD;程序一:Dijkstra算法(计算两点间的最短路)function [l,z]=Dijkstra(W)n = size (W,1);for i = 1 :nl(i)=W(1,i);z(i)=0;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-1;if j<ii=j-1;endendendi=i+1;end程序二:floyd算法(计算任意两点间的最短距离)function [d,r]=floyd(a)n=size(a,1);d=a;for i=1:nfor j=1:nr(i,j)=j;endendr;for 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);r(i,j)=r(i,k);endendendend程序三:n2short.m 计算指定两点间的最短距离function [P u]=n2short(W,k1,k2)n=length(W);U=W;m=1;while m<=nfor i=1:nfor j=1:nif U(i,j)>U(i,m)+U(m,j)U(i,j)=U(i,m)+U(m,j);endendendm=m+1;endu=U(k1,k2);P1=zeros(1,n);k=1;P1(k)=k2;V=ones(1,n)*inf;kk=k2;while kk~=k1for i=1:nV(1,i)=U(k1,kk)-W(i,kk);if V(1,i)==U(k1,i)P1(k+1)=i;kk=i;k=k+1;endendendk=1;wrow=find(P1~=0);for j=length(wrow):-1:1P(k)=P1(wrow(j));k=k+1;endP;程序四、n1short.m(计算某点到其它所有点的最短距离)function[Pm D]=n1short(W,k)n=size(W,1);D=zeros(1,n);for i=1:n[P d]=n2short(W,k,i);Pm{i}=P;D(i)=d;end程序五:pass2short.m(计算经过某两点的最短距离)function [P d]=pass2short(W,k1,k2,t1,t2)[p1 d1]=n2short(W,k1,t1);[p2 d2]=n2short(W,t1,t2);[p3 d3]=n2short(W,t2,k2);dt1=d1+d2+d3;[p4 d4]=n2short(W,k1,t2);[p5 d5]=n2short(W,t2,t1);[p6 d6]=n2short(W,t1,k2);dt2=d4+d5+d6;if dt1<dt2d=dt1;P=[p1 p2(2:length(p2)) p3(2:length(p3))];elsed=dt1;p=[p4 p5(2:length(p5)) p6(2:length(p6))];endP;d;第三讲:最小生成树程序一:最小生成树的Kruskal算法function [T c]=krusf(d,flag)if nargin==1n=size(d,2);m=sum(sum(d~=0))/2;b=zeros(3,m);k=1;for i=1:nfor j=(i+1):nif d(i,j)~=0b(1,k)=i;b(2,k)=j;b(3,k)=d(i,j);k=k+1;endendendelseb=d;endn=max(max(b(1:2,:)));m=size(b,2);[B,i]=sortrows(b',3);B=B';c=0;T=[];k=1;t=1:n;for i=1:mif t(B(1,i))~=t(B(2,i))T(1:2,k)=B(1:2,i);c=c+B(3,i);k=k+1;tmin=min(t(B(1,i)),t(B(2,i)));tmax=max(t(B(1,i)),t(B(2,i)));for j=1:nif t(j)==tmaxt(j)=tmin;endendendif k==nbreak;endendT;c;程序二:最小生成树的Prim算法function [T c]=Primf(a)l=length(a);a(a==0)=inf;k=1:l;listV(k)=0;listV(1)=1;e=1;while (e<l)min=inf;for i=1:lif listV(i)==1for j=1:lif listV(j)==0 & min>a(i,j)min=a(i,j);b=a(i,j);s=i;d=j;endendendendlistV(d)=1;distance(e)=b;source(e)=s;destination(e)=d;e=e+1;endT=[source;destination];for g=1:e-1c(g)=a(T(1,g),T(2,g));endc;第四讲:Euler图和Hamilton图程序一:Fleury算法(在一个Euler图中找出Euler环游)注:包括三个文件;fleuf1.m, edf.m, flecvexf.mfunction [T c]=fleuf1(d)%注:必须保证是Euler环游,否则输出T=0,c=0n=length(d);b=d;b(b==inf)=0;b(b~=0)=1;m=0;a=sum(b);eds=sum(a)/2;ed=zeros(2,eds);vexs=zeros(1,eds+1);matr=b;for i=1:nif mod(a(i),2)==1m=m+1;endendif m~=0fprintf('there is not exit Euler path.\n') T=0;c=0;endif m==0vet=1;flag=0;t1=find(matr(vet,:)==1);for ii=1:length(t1)ed(:,1)=[vet,t1(ii)];vexs(1,1)=vet;vexs(1,2)=t1(ii);matr(vexs(1,2),vexs(1,1))=0;flagg=1;tem=1;while flagg[flagg ed]=edf(matr,eds,vexs,ed,tem); tem=tem+1;if ed(1,eds)~=0 & ed(2,eds)~=0T=ed;T(2,eds)=1;c=0;for g=1:edsc=c+d(T(1,g),T(2,g));endflagg=0;break;endendendendfunction[flag ed]=edf(matr,eds,vexs,ed,tem)flag=1;for i=2:eds[dvex f]=flecvexf(matr,i,vexs,eds,ed,tem);if f==1flag=0;break;endif dvex~=0ed(:,i)=[vexs(1,i) dvex];vexs(1,i+1)=dvex;matr(vexs(1,i+1),vexs(1,i))=0;elsebreak;endendfunction [dvex f]=flecvexf(matr,i,vexs,eds,ed,temp) f=0;edd=find(matr(vexs(1,i),:)==1);dvex=0;dvex1=[];ded=[];if length(edd)==1dvex=edd;elsedd=1;dd1=0;kkk=0;for kk=1:length(edd)m1=find(vexs==edd(kk));if sum(m1)==0dvex1(dd)=edd(kk);dd=dd+1;dd1=1;elsekkk=kkk+1;endendif kkk==length(edd)tem=vexs(1,i)*ones(1,kkk);edd1=[tem;edd];for l1=1:kkklt=0;ddd=1;for l2=1:edsif edd1(1:2,l1)==ed(1:2,l2)lt=lt+1;endendif lt==0ded(ddd)=edd(l1);ddd=ddd+1;endendif temp<=length(dvex1)dvex=dvex1(temp);elseif temp>length(dvex1) & temp<=length(ded)dvex=ded(temp);elsef=1;endend程序二:Hamilton改良圈算法(找出比较好的Hamilton路)function [C d1]= hamiltonglf(v)%d表示权值矩阵%C表示算法最终找到的Hamilton圈。