matlab图论程序算法大全

合集下载

图论常用算法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中常见的图论算法,帮助读者了解和应用这些算法。

二、图的表示方法在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程序-可解决图论方面的绝大多数问题

超全图论matlab程序-可解决图论方面的绝大多数问题
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<dt2 d=dt1; P=[p1 p2(2:length(p2)) p3(2:length(p3))]; else d=dt1; p=[p4 p5(2:length(p5)) p6(2:length(p6))]; end P; d;
程序三:有向图关联矩阵和邻接矩阵互换算法
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)

图论和网络分析算法及Matlab实现(Graph-and-Network-Analysis)
dij w,ij,i不i能能一一步步到到达 jj达
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

图论算法

图论算法

Dijkstra 算法:用矩阵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)>=2 index=index(1); endindex2(temp)=index; endd, index1, index2%dijkstra 最短路算法通用程序,用于求从起始点s 到其它各点的最短路%D 为赋权邻接矩阵,d 为s 到其它各点最短路径的长度,DD 记载了最短路径生成树 function [d,DD]=dijkstra_aiwa(D,s) [m,n]=size(D); d=inf.*ones(1,m); d(1,s)=0;dd=zeros(1,m);dd(1,s)=1;y=s;DD=zeros(m,m);DD(y,y)=1;counter=1;while length(find(dd==1))<mfor i=1:mif dd(i)==0d(i)=min(d(i),d(y)+D(y,i)); endendddd=inf;for i=1:mif dd(i)==0&&d(i)<dddddd=d(i);endendyy=find(d==ddd);counter=counter+1;DD(y,yy(1,1))=counter;DD(yy(1,1),y)=counter;y=yy(1,1);dd(1,y)=1;endFloyd算法: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);b=a+a';path=zeros(length(b));for k=1:6for i=1:6for j=1:6if b(i,j)>b(i,k)+b(k,j)b(i,j)=b(i,k)+b(k,j);path(i,j)=k;end end end end b, pathprim 算法构造最小生成树:prim 算法如下:(i )}{1v P =,Φ=Q ; (ii )while V P =~},,min(P V v P p w pv pv -∈∈= }{v P P += }{pv Q Q += end用prim 算法求右图的最小生成树。

Matlab中的网络分析与图论算法

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算法大全第05章__图与网络

matlab算法大全第05章__图与网络

-68-第五章 图与网络模型及方法§1 概论图论起源于18世纪。

第一篇图论论文是瑞士数学家欧拉于1736 年发表的“哥尼斯堡的七座桥”。

1847年,克希霍夫为了给出电网络方程而引进了“树”的概念。

1857年,凯莱在计数烷22+n n H C 的同分异构物时,也发现了“树”。

哈密尔顿于1859年提出“周游世界”游戏,用图论的术语,就是如何找出一个连通图中的生成圈、近几十年来,由于计算机技术和科学的飞速发展,大大地促进了图论研究和应用,图论的理论和方法已经渗透到物理、化学、通讯科学、建筑学、运筹学,生物遗传学、心理学、经济学、社会学等学科中。

图论中所谓的“图”是指某类具体事物和这些事物之间的联系。

如果我们用点表示这些具体事物,用连接两点的线段(直的或曲的)表示两个事物的特定的联系,就得到了描述这个“图”的几何形象。

图论为任何一个包含了一种二元关系的离散系统提供了一个数学模型,借助于图论的概念、理论和方法,可以对该模型求解。

哥尼斯堡七桥问题就是一个典型的例子。

在哥尼斯堡有七座桥将普莱格尔河中的两个岛及岛与河岸联结起来,问题是要从这四块陆地中的任何一块开始通过每一座桥正好一次,再回到起点。

图1 哥尼斯堡七桥问题当然可以通过试验去尝试解决这个问题,但该城居民的任何尝试均未成功。

欧拉为了解决这个问题,采用了建立数学模型的方法。

他将每一块陆地用一个点来代替,将每一座桥用连接相应两点的一条线来代替,从而得到一个有四个“点”,七条“线”的“图”。

问题成为从任一点出发一笔画出七条线再回到起点。

欧拉考察了一般一笔画的结构特点,给出了一笔画的一个判定法则:这个图是连通的,且每个点都与偶数线相关联,将这个判定法则应用于七桥问题,得到了“不可能走通”的结果,不但彻底解决了这个问题,而且开创了图论研究的先河。

图与网络是运筹学(Operations Research )中的一个经典和重要的分支,所研究的问题涉及经济管理、工业工程、交通运输、计算机科学与信息技术、通讯与网络技术等诸多领域。

MATLAB程序大全

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映射,将图像变换为立方体的六个面,然后通过图形学方法贴到立方体上,就能做出类似谷歌街景的样子。

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

精心整理图论算法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。

相关文档
最新文档