Floyd算法_计算最短距离矩阵和路由矩阵_查询最短距离和路由_matlab实验报告
matlab的floyd算法

matlab的floyd算法Floyd算法,是一种图论算法,用于在加权图中求解最短路径。
它是以发明者之一、罗伯特·弗洛伊德的名字命名的。
这个算法同样被用于对于任意两点之间的最长路径(所谓的最短路径问题)进行求解。
算法描述给定一个带权的有向图G=(V,E),其权值函数为w,下面我们定义从顶点i到顶点j的路径经过的最大权值为dist(i,j)。
特别地,当i=j时,dist(i,j)=0。
为了方便描述算法,我们用D(k,i,j)表示从顶点i到顶点j且路径中的所有顶点都在集合{1,2,⋯,k}中的所有路径中,最大边权值的最小值。
则从顶点i到顶点j的最短路径的边权值就是 D(n,i,j),其中n是图中顶点的数量。
算法思想:建立中间顶点集合算法是通过不断地扩充中间顶点集合S,来求解任意两点之间的最短路径。
具体来说,设S={1, 2, ⋯, k},其中k是整数。
Floyd算法的基本思想是,依次考察所有可能的中间顶点x(即所有S中的顶点),对于每个中间顶点x,若从i到x再到j的路径比已知的路径更短,则更新dist(i,j)为更小的值D(k,i,j)。
最终,在S={1, 2, ⋯, n}的情况下,所得到的D(n,i,j)就是顶点i到顶点j之间的最短路径的长度。
Floyd算法的核心是一个三重循环,在每一轮循环中,枚举S中所有的中间顶点x,通过动态规划计算出从i到j的最短路径长度D(k,i,j)。
这一过程可表述为:for k = 1 to nfor i = 1 to nfor j = 1 to nif D(k,i)+D(j,k) < D(k,i,j)D(k,i,j) = D(k,i)+D(j,k)其中D(0,i,j)即为dist(i,j),若i和j不连通,则D(0,i,j)=+Inf。
算法实现function D = Floyd(adjmat)% adjmat为邻接矩阵邻接矩阵adjmat的定义为:- 若两个顶点之间有边相连,则对应位置为该边的边权值;- 若两个顶点之间没有边相连,则对应位置为0。
2011高教社杯全国大学生数学建模竞赛B题参考答案

交巡警服务平台的设置与调度优化分析摘要本文以实现警察的刑事执法、治安管理、交通管理、服务群众四大职能为宗旨,利用有限的警务资源,根据城市的实际情况与需求合理地设置了交巡警服务平台、分配各平台的管辖范围及调度警务资源。
并分别对题目的各问,作了合理的解答。
问题一:(1)、根据题目所给数据,确定各节点之间的相邻关系和距离,利用Floyd 算法及matlab编程求出两点之间的最短距离,使其尽量满足能在3分钟内有交巡警平台警力到达案发结点的原则,节点去选择平台,把节点分配给离节点距离最近的平台管辖,据此,我们得到了平台的管辖区域划分。
(2)、我们对进出该区的13条交通要道实现快速全封锁的问题,我们认定在所有调度方案中,某种方案中耗时最长的的围堵时间最短即最佳方案,利用0-1变量确定平台的去向,并利用线性规划知识来求解指派问题,求得了最优的调度方案。
(3)、在确定增添平台的个数和具体位置的问题中,我们将尽量保证每个节点都有一个平台可以在三分钟内到达作为主要原则来求解。
我们先找出到达每个平台的时间都超过三分钟的节点,并尝试在这些节点中选取若干个作为新的平台,求出合理的添加方案。
问题二:(1)、按照设置交巡警服务平台的原则和任务,分析现有的服务平台的设置是否合理,我们以各区覆盖率作为服务平台分布合不合理的评价标准,得到C、D、E、F区域平台设置不合理。
并尝试一些新的设置方案使得设置更为合理,最后以覆盖率最低的E区为例,使用一种修改方案得到一个比原方案更合理的交巡警服务平台的设置方案。
(2)、追捕问题要求在最快的时间内抓到围堵罪犯,在罪犯和警察的行动速度一致的前提假设下,我们先设定一个具体较小的时间,编写程序检验在这个时间内是否可以成功抓捕罪犯,不行则以微小时间间隔增加时间,当第一次成功围堵时,这个时间即为最佳围堵方案。
关健字: MATLAB软件,0-1规划,最短路,Floyd算法,指派问题一、问题重述“有困难找警察”,是家喻户晓的一句流行语。
floyd算法求解邻接矩阵的最短距离矩阵

文章编号:001主题:探讨floyd算法求解邻接矩阵的最短距离矩阵在计算机算法中,图论一直是一个重要的研究领域。
而其中,最短路径算法一直是图论中的热门话题之一。
在众多的最短路径算法中,floyd算法因其简洁高效的特点而备受青睐。
本文将深入探讨floyd算法在求解邻接矩阵的最短距离矩阵中的应用,并分析其实现原理及优缺点。
一、floyd算法简介Floyd算法是一种用于寻找加权图中顶点之间最短路径的动态规划算法。
它的基本思想是每次引入一个新的顶点,看看这个新顶点能不能对原来两个顶点之间的距离产生改变,如果可能,就进行更新。
通过多次迭代,最终得到所有顶点之间的最短路径。
二、floyd算法的实现步骤1. 初始化邻接矩阵在使用floyd算法求解最短路径时,首先需要初始化邻接矩阵。
邻接矩阵的每个元素代表图中两个顶点之间的距禋,如果两个顶点之间没有直接连接,则距离设为无穷大。
如果两个顶点直接相连,则距离设为两个顶点之间的权值。
2. 动态规划求解最短路径接下来,利用动态规划的思想,通过逐渐引入新的顶点,不断更新已有的最短路径。
具体做法是,对于每对顶点i和j,检查它们之间是否存在顶点k,使得从i到j的最短路径可以经过顶点k。
如果存在这样的顶点k,那么更新i到j的最短路径为i到k和k到j的距离之间的较小值。
3. 递推过程重复上述步骤,通过逐渐引入新的顶点k,直到遍历完所有顶点,就可以得到最终的最短距离矩阵。
三、floyd算法的优缺点1. 优点floyd算法可以求解任意两点之间的最短路径,且适用于有向图和无向图。
并且可以方便地求出最短路径的具体路径。
算法简单易懂,实现起来也比较容易。
2. 缺点floyd算法的时间复杂度较高,为O(n^3),当n较大时,计算量会非常庞大。
另外,在处理稀疏图时,可能会造成大量的计算浪费,因为floyd算法会对所有的顶点对进行遍历,而对于稀疏图来说,很多顶点对之间并不存在直接连接的边。
四、个人观点和理解在实际应用中,floyd算法通常适用于节点数量不是特别大,但边的数量非常大或者需要求解任意两点之间最短路径的情况。
floyd算法matlab代码

function [D,R]=floyd(a)% a=[3 2;4 6];采用floyd算法计算图a中每对顶点最短路% a=[0 4 11;6 0 2;3 inf 0];n=size(a,1);D=a % D是距离矩阵for i=1:nfor j=1:nR(i,j)=j;endendR % R是路由矩阵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);endendendkDRend••••••••••••••••••【唯美句子】走累的时候,我就到升国旗哪里的一角台阶坐下,双手抚膝,再闭眼,让心灵受到阳光的洗涤。
懒洋洋的幸福。
顶 3 收藏 2•【唯美句子】一个人踮着脚尖,在窄窄的跑道白线上走,走到很远的地方又走回来。
阳光很好,温暖,柔和。
漫天的安静。
顶7 收藏7•【唯美句子】清风飘然,秋水缓淌。
一丝云起,一片叶落,剔透生命的空灵。
轻轻用手触摸,就点碎了河面的脸。
落叶舞步婀娜不肯去,是眷恋,是装点?瞬间回眸,点亮了生命精彩。
顶11 收藏9•【唯美句子】几只从南方归来的燕子,轻盈的飞来飞去,“几处早莺争暖树,谁家新燕啄春泥,”其乐融融的山林气息,与世无争的世外桃源,让人心旷神怡。
顶0 收藏 2•【唯美句子】流年清浅,岁月轮转,或许是冬天太过漫长,当一夜春风吹开万里柳时,心情也似乎开朗了许多,在一个风轻云淡的早晨,踏着初春的阳光,漫步在碧柳垂青的小河边,看小河的流水因为解开了冰冻而欢快的流淌,清澈见底的的河水,可以数得清河底的鹅软石,偶尔掠过水面的水鸟,让小河荡起一层层的涟漪。
河岸换上绿色的新装,刚刚睡醒的各种各样的花花草草,悄悄的露出了嫩芽,这儿一丛,那儿一簇,好像是交头接耳的议论着些什么,又好象是在偷偷地说着悄悄话。
顶 3 收藏 4•【唯美句子】喜欢海子写的面朝大海春暖花开,不仅仅是因为我喜欢看海,还喜欢诗人笔下的意境,每当夜深人静时,放一曲纯音乐,品一盏茶,在脑海中搜寻诗中的恬淡闲适。
matlab中求最短路径的函数

matlab中求最短路径的函数在matlab中,有多种方法可以求解最短路径问题。
其中,较为常用的方法包括Dijkstra算法、Bellman-Ford算法和Floyd算法等。
这些方法对应的函数分别为dijkstra、bellmanford和floyd。
以下是这些函数的使用方法:1. dijkstra函数dijkstra函数可以求解带权有向图的单源最短路径问题。
其使用方法如下:[d,path] = dijkstra(W,s,t)其中,W为带权邻接矩阵,s为源节点,t为目标节点。
函数返回最短路径长度d和路径path。
例如,假设有以下带权有向图:W = [0 1 12 0;0 0 9 3;0 0 0 0;0 0 4 0];其中,0表示两节点之间没有边相连。
则可以使用以下代码求解1号节点到4号节点的最短路径:[d,path] = dijkstra(W,1,4)最短路径长度为7,路径为[1 2 4]。
2. bellmanford函数bellmanford函数可以求解带权有向图的单源最短路径问题,但是可以处理负权边。
其使用方法如下:[d,path] = bellmanford(W,s,t)其中,W为带权邻接矩阵,s为源节点,t为目标节点。
函数返回最短路径长度d和路径path。
例如,假设有以下带权有向图:W = [0 1 12 0;-4 0 9 3;0 0 0 0;0 0 4 0];其中,负权边被用负数表示。
则可以使用以下代码求解1号节点到4号节点的最短路径:[d,path] = bellmanford(W,1,4)最短路径长度为-1,路径为[1 2 4]。
3. floyd函数floyd函数可以求解带权有向图的所有节点之间的最短路径问题。
其使用方法如下:[D,path] = floyd(W)其中,W为带权邻接矩阵。
函数返回最短路径长度矩阵D和路径矩阵path。
例如,假设有以下带权有向图:W = [0 1 12 0;0 0 9 3;0 0 0 0;0 0 4 0];则可以使用以下代码求解所有节点之间的最短路径:[D,path] = floyd(W)最短路径长度矩阵为:D = [0 1 10 4;Inf 0 9 3;Inf Inf 0 Inf;Inf Inf 4 0];其中,Inf表示两节点之间不存在路径。
Floyd最短路算法的MATLAB程序

Floyd最短路算法的MATLAB程序Floyd最短路算法的MATLAB程序2006-08-17 20:14%floyd.m%采用floyd算法计算图a中每对顶点最短路 %d是矩离矩阵%r是路由矩阵function [d,r]=floyd(a)n=size(a,1);d=a;for i=1:nfor j=1:nr(i,j)=j;endendrfor k=1:nfor i=1:nfor j=1:nif d(i,k)+d(k,j)<d(i,j)< p="">d(i,j)=d(i,k)+d(k,j); r(i,j)=r(i,k)endendendkdrendvoid Dijkstral(int v0){int i;bool s[MAX_VEX];for(i=0;i<dim;i++)< p="">{d[v0][i]=map[v0][i];s[i]=false;if((i!=0)&&(d[v0][i]<inf))< p="">p[v0][i]=v0;elsep[v0][i]=-1;}s[v0]=true;d[v0][v0]=0;for(i=0;i<dim;i++)< p="">{double min=INF;int u=v0;for(int j=0;j<dim;j++)< p="">if(!s[j]&&d[v0][j]<min)< p="">{u=j;min=d[v0][j];}s[u]=true;for(int w=0;w<dim;w++)< p="">{if((!s[w])&&(d[v0][w]>d[v0][u]+map[u][w])) {d[v0][w]=d[v0][u]+map[u][w];p[v0][w]=u;}}}}Justin Hou介绍寻找最有价值路径(c语言)描述:从上(入口)往下行走,直到最下节点(出口)结束,将所经节点上的数值相加,要求找到一条最有价值路径(既是路径总数值最大)并输出总数值。
基于matlab的floyd算法 matlab计算最短路径

function [d,path]=floyd(a,sp,ep) % floyd % % Syntax: [d,path]=floyd(a,sp,ep) % % Inputs: % % % % % Outputs: % % % d - 最短路的距离 a sp ep - 距离矩阵是指 i 到 j 之间的距离,可以是有向的 - 起点的标号 - 终点的标号 - 最短路问题
试计算下图的最短路径, 1. 起点 C 点,终点 A 点。 2. 起点 A 点,终点 G 点。 3. 起点 D 点,终点 F 点。
试计算下图的最短路径, 1.起点 F 点,终点 A 点。 2. 起点 E 点,终点 C 点。
if D(i,j)~=inf path(i,j)=j; %j 是 i 的后续点 end end end for k=1:n for i=1:n for j=1:n if D(i,j)>D(i,k)+D(k,j)
D(i,j)=D(i,k)+D(k,j); path(i,j)=path(i,k); end end end end p=[sp]; mp=sp; for k=1:n if mp~=ep d=path(mp,ep); p=[p,d]; mp=d; end end d=D(sp,ep) path=p
path - 最短路的路径
பைடு நூலகம்
a =[ 0 50 Inf 50 0 15 inf; 15 ; 0 ];% a(i,j),从节点 i 到 j 之间的距离
% [d,path]=floyd(a,2,5) sp=3; ep=1; n=size(a,1); D=a; path=zeros(n,n); for i=1:n for j=1:n
matlab floyd最短路算法例题

matlab floyd最短路算法例题摘要:一、简介二、Floyd 算法的原理三、MATLAB 实现Floyd 最短路算法的例题四、Floyd 算法的适用范围和局限性五、总结正文:一、简介Floyd 算法是一种经典的动态规划算法,用于求解加权连通图中所有顶点之间的最短路径。
它可以处理有向图和无向图,同时也可以处理带有负权边的图。
Floyd 算法的时间复杂度为O(n^3),其中n 为图的顶点数。
二、Floyd 算法的原理Floyd 算法的核心思想是:对于任意两个顶点i 和j,我们可以通过若干个中间顶点k 来进行路径传递。
也就是说,从顶点i 到顶点j 的最短路径可能经过顶点k,也可能直接从顶点i 到顶点j。
因此,我们需要遍历所有可能的中间顶点k,检查从顶点i 到顶点k 再到顶点j 的路径是否比直接从顶点i 到顶点j 的路径更短。
如果成立,我们就更新从顶点i 到顶点j 的路径长度。
三、MATLAB 实现Floyd 最短路算法的例题以下是一个简单的MATLAB 实现Floyd 算法的例题:```matlab% 创建一个邻接矩阵表示的图A = [0, 1, 0, 0, 0;1, 0, 1, 0, 0;0, 1, 0, 1, 0;0, 0, 1, 0, 1;0, 0, 0, 1, 0];% 使用Floyd 算法计算最短路径dist = floyd(A);% 输出最短路径距离矩阵disp(dist);```在这个例题中,我们创建了一个5x5 的邻接矩阵A 来表示一个简单的图。
然后我们使用MATLAB 内置的floyd 函数来计算该图的所有顶点之间的最短路径。
最后,我们输出最短路径距离矩阵。
四、Floyd 算法的适用范围和局限性Floyd 算法适用于求解加权连通图中所有顶点之间的最短路径问题。
它尤其适用于处理有向图和无向图,同时也可以处理带有负权边的图。
然而,Floyd 算法不能用于构造最短路径,也不能用于计算带有负权回路的最短路径。
用floyd算法求每对顶点间的最短路,矩阵c语言

用floyd算法求每对顶点间的最短路,矩阵c语言Floyd算法是一种动态规划算法,用于求解每对顶点间的最短路径问题。
以下是一个用C语言实现的Floyd算法示例:```cinclude <>include <>define V 5 // 顶点数int graph[V][V]; // 邻接矩阵表示的图int dist[V][V]; // 最短路径矩阵// 初始化邻接矩阵和最短路径矩阵void init() {for (int i = 0; i < V; i++) {for (int j = 0; j < V; j++) {graph[i][j] = INT_MAX; // 初始化为无穷大dist[i][j] = INT_MAX; // 初始化为无穷大}}}// 计算最短路径void floyd() {init(); // 初始化邻接矩阵和最短路径矩阵for (int k = 0; k < V; k++) {for (int i = 0; i < V; i++) {for (int j = 0; j < V; j++) {if (graph[i][k] + graph[k][j] < graph[i][j]) {dist[i][j] = graph[i][k] + graph[k][j]; // 更新最短路径矩阵 }}}}}int main() {int i, j, k;init(); // 初始化邻接矩阵和最短路径矩阵// 初始化邻接矩阵graph[0][1] = 2; // 0->1的距离为2graph[0][2] = 3; // 0->2的距离为3graph[1][2] = 1; // 1->2的距离为1graph[1][3] = 4; // 1->3的距离为4graph[2][3] = 2; // 2->3的距离为2graph[2][4] = 5; // 2->4的距离为5graph[3][4] = 1; // 3->4的距离为1floyd(); // 使用Floyd算法计算最短路径矩阵printf("The Floyd algorithm finds the shortest path matrix:\n"); for (i = 0; i < V; i++) {for (j = 0; j < V; j++) {printf("%d ", dist[i][j]); // 输出最短路径矩阵中的元素值}printf("\n");}return 0;}```。
matlab floyd算法

matlab floyd算法
Floyd算法是一种用于求解最短路径的算法,它可以在有向图或者无向图中找到任意两个顶点之间的最短路径。
Floyd算法的核心思想是动态规划,它通过不断更新每个顶点之间的距离来求解最短路径。
Floyd算法的基本思路是,对于图中的任意两个顶点i和j,如果存在一条从i到j的路径,那么这条路径的长度就是i到j的最短路径。
如果不存在这样的路径,那么i到j的最短路径就是无穷大。
Floyd 算法通过不断更新每个顶点之间的距离来求解最短路径。
Floyd算法的实现过程比较简单,它可以用一个二维数组来表示图中每个顶点之间的距离。
初始时,这个数组的值就是图中每个边的权值。
然后,对于每个顶点k,我们都尝试更新从i到j的最短路径。
如果从i到k再到j的路径比当前的最短路径更短,那么我们就更新这个最短路径。
Floyd算法的时间复杂度为O(n^3),其中n是图中顶点的个数。
虽然这个时间复杂度比较高,但是Floyd算法的实现比较简单,而且它可以处理带有负权边的图。
因此,在实际应用中,Floyd算法还是比较常用的。
Floyd算法是一种用于求解最短路径的算法,它通过不断更新每个顶点之间的距离来求解最短路径。
虽然它的时间复杂度比较高,但
是它的实现比较简单,而且它可以处理带有负权边的图。
因此,在实际应用中,Floyd算法还是比较常用的。
floyd算法求解邻接矩阵的最短距离矩阵

floyd算法求解邻接矩阵的最短距离矩阵摘要:1.Floyd 算法简介2.邻接矩阵的概念3.最短距离矩阵的计算方法4.Floyd 算法的应用实例5.总结正文:【1.Floyd 算法简介】Floyd 算法是一种用于寻找加权图中所有顶点之间最短路径的算法,由Robert C.Floyd 于1968 年提出。
该算法主要应用于计算邻接矩阵的最短距离矩阵,适用于存在负权边的图,但不适用于存在负权环的图。
【2.邻接矩阵的概念】邻接矩阵是一种用于表示有向图或无向图中顶点之间关系的矩阵。
设图G 有n 个顶点,用A 表示邻接矩阵,则A 是一个n×n 的矩阵,其中A[i][j] 表示顶点i 到顶点j 的边的权值。
如果顶点i 到顶点j 没有边相连,则A[i][j] 为无穷大或一个很大的数。
【3.最短距离矩阵的计算方法】最短距离矩阵是用于表示图中所有顶点之间最短路径长度的矩阵。
设D 为最短距离矩阵,则D[i][j] 表示顶点i 到顶点j 的最短路径长度。
通过Floyd 算法,可以计算出邻接矩阵A 的最短距离矩阵D,计算方法如下:1.初始化D 为单位矩阵,即D[i][j]=1(i≠j);2.遍历所有顶点k,对于每条边(i, k) 和(k, j),更新D[i][j] =min(D[i][j], D[i][k] + D[k][j]);3.当遍历完所有顶点后,D[i][j] 即为顶点i 到顶点j 的最短路径长度。
【4.Floyd 算法的应用实例】假设有一个无向图,共有4 个顶点A、B、C、D,边的权值如下:- A 到B 的权值为1;- A 到C 的权值为4;- B 到C 的权值为2;- B 到D 的权值为5;- C 到D 的权值为1。
通过Floyd 算法计算最短距离矩阵,结果如下:- D[A][B] = 1;- D[A][C] = 5;- D[A][D] = 6;- D[B][C] = 3;- D[B][D] = 6;- D[C][D] = 2。
Floyd最短路算法的MATLAB程序

Floyd最短路算法的MATLAB程序Floyd最短路算法的MATLAB程序%floyd.m%采用floyd算法计算图a中每对顶点最短路%d是矩离矩阵%r是路由矩阵function [d,r]=floyd(a)n=size(a,1);d=a;for i=1:nfor j=1:nr(i,j)=j;endendrfor 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)endendendkdrend数学算法(2)实例2:三角函数曲线(2)function shili02h0=figure('toolbar','none',... 'position',[200 150 450 350],... 'name','实例02');x=-pi:0.05:pi;y=sin(x)+cos(x);plot(x,y,'-*r','linewidth',1); grid onxlabel('自变量X');ylabel('函数值Y');title('三角函数');实例3:图形的叠加function shili03h0=figure('toolbar','none',... 'position',[200 150 450 350],... 'name','实例03');x=-pi:0.05:pi;y1=sin(x);y2=cos(x);plot(x,y1,...'-*r',...x,y2,...'--og');grid onxlabel('自变量X');ylabel('函数值Y');title('三角函数');实例4:双y轴图形的绘制function shili04h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例04');x=0:900;a=1000;b=0.005;y1=2*x;y2=cos(b*x);[haxes,hline1,hline2]=plotyy(x,y1,x,y2,'semilogy','plot'); axes(haxes(1))ylabel('semilog plot');axes(haxes(2))ylabel('linear plot');实例6:图形标注function shili06h0=figure('toolbar','none',...'position',[200 150 450 400],...'name','实例06');t=0:pi/10:2*pi;h=plot(t,sin(t));xlabel('t=0到2\pi','fontsize',16);ylabel('sin(t)','fontsize',16);title('\it{从 0to2\pi 的正弦曲线}','fontsize',16)x=get(h,'xdata');y=get(h,'ydata');imin=find(min(y)==y);imax=find(max(y)==y);text(x(imin),y(imin),...['\leftarrow最小值=',num2str(y(imin))],...'fontsize',16)text(x(imax),y(imax),...['\leftarrow最大值=',num2str(y(imax))],...'fontsize',16)实例7:条形图形function shili07h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例07');tiao1=[562 548 224 545 41 445 745 512];tiao2=[47 48 57 58 54 52 65 48];t=0:7;bar(t,tiao1)xlabel('X轴');ylabel('TIAO1值');h1=gca;h2=axes('position',get(h1,'position'));plot(t,tiao2,'linewidth',3)set(h2,'yaxislocation','right','color','none','xticklabel',[]) 实例8:区域图形function shili08h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例08');x=91:95;profits1=[88 75 84 93 77];profits2=[51 64 54 56 68];profits3=[42 54 34 25 24];profits4=[26 38 18 15 4];area(x,profits1,'facecolor',[0.5 0.9 0.6],...'edgecolor','b',...'linewidth',3)hold onarea(x,profits2,'facecolor',[0.9 0.85 0.7],... 'edgecolor','y',...'linewidth',3)hold onarea(x,profits3,'facecolor',[0.3 0.6 0.7],... 'edgecolor','r',...'linewidth',3)hold onarea(x,profits4,'facecolor',[0.6 0.5 0.9],... 'edgecolor','m',...'linewidth',3)hold offset(gca,'xtick',[91:95])set(gca,'layer','top')gtext('\leftarrow第一季度销量')gtext('\leftarrow第二季度销量')gtext('\leftarrow第三季度销量')gtext('\leftarrow第四季度销量')xlabel('年','fontsize',16);ylabel('销售量','fontsize',16);实例9:饼图的绘制function shili09h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例09');t=[54 21 35;68 54 35;45 25 12;48 68 45;68 54 69];x=sum(t);h=pie(x);textobjs=findobj(h,'type','text');str1=get(textobjs,{'string'});val1=get(textobjs,{'extent'});oldext=cat(1,val1{:});names={'商品一:';'商品二:';'商品三:'};str2=strcat(names,str1);set(textobjs,{'string'},str2)val2=get(textobjs,{'extent'});newext=cat(1,val2{:});offset=sign(oldext(:,1)).*(newext(:,3)-oldext(:,3))/2; pos=get(textobjs,{'position'});textpos=cat(1,pos{:});textpos(:,1)=textpos(:,1)+offset;set(textobjs,{'position'},num2cell(textpos,[3,2])实例10:阶梯图function shili10h0=figure('toolbar','none',...'position',[200 150 450 400],...'name','实例10');a=0.01;b=0.5;t=0:10;f=exp(-a*t).*sin(b*t);stairs(t,f)hold onplot(t,f,':*')hold offglabel='函数e^{-(\alpha*t)}sin\beta*t的阶梯图';gtext(glabel,'fontsize',16)xlabel('t=0:10','fontsize',16)axis([0 10 -1.2 1.2])实例11:枝干图function shili11h0=figure('toolbar','none',...'position',[200 150 450 350],...'name','实例11');x=0:pi/20:2*pi;y1=sin(x);y2=cos(x);h1=stem(x,y1+y2);hold onh2=plot(x,y1,'^r',x,y2,'*g');hold offh3=[h1(1);h2];legend(h3,'y1+y2','y1=sin(x)','y2=cos(x)') xlabel('自变量X');ylabel('函数值Y');title('正弦函数与余弦函数的线性组合');实例12:罗盘图function shili12h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例12');winddirection=[54 24 65 84256 12 235 62125 324 34 254];windpower=[2 5 5 36 8 12 76 14 10 8];rdirection=winddirection*pi/180;[x,y]=pol2cart(rdirection,windpower); compass(x,y);desc={'风向和风力','北京气象台','10月1日0:00到','10月1日12:00'};gtext(desc)实例13:轮廓图function shili13h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例13');[th,r]=meshgrid((0:10:360)*pi/180,0:0.05:1); [x,y]=pol2cart(th,r);z=x+i*y;f=(z.^4-1).^(0.25);contour(x,y,abs(f),20)axis equalxlabel('实部','fontsize',16);ylabel('虚部','fontsize',16);h=polar([0 2*pi],[0 1]);delete(h)hold oncontour(x,y,abs(f),20)实例14:交互式图形function shili14h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例14');axis([0 10 0 10]);hold onx=[];y=[];n=0;disp('单击鼠标左键点取需要的点'); disp('单击鼠标右键点取最后一个点'); but=1;while but==1[xi,yi,but]=ginput(1);plot(xi,yi,'bo')n=n+1;disp('单击鼠标左键点取下一个点'); x(n,1)=xi;y(n,1)=yi;endt=1:n;ts=1:0.1:n;xs=spline(t,x,ts);ys=spline(t,y,ts);plot(xs,ys,'r-');hold off实例15:变换的傅立叶函数曲线function shili15h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例15');axis equalm=moviein(20,gcf);set(gca,'nextplot','replacechildren') h=uicontrol('style','slider','position',... [100 10 500 20],'min',1,'max',20)for j=1:20plot(fft(eye(j+16)))set(h,'value',j)m(:,j)=getframe(gcf);endclf;axes('position',[0 0 1 1]);movie(m,30)实例16:劳伦兹非线形方程的无序活动function shili15h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例15');axis equalm=moviein(20,gcf);set(gca,'nextplot','replacechildren') h=uicontrol('style','slider','position',... [100 10 500 20],'min',1,'max',20)for j=1:20plot(fft(eye(j+16)))set(h,'value',j)m(:,j)=getframe(gcf);endclf;axes('position',[0 0 1 1]);movie(m,30)实例17:填充图function shili17h0=figure('toolbar','none',... 'position',[200 150 450 250],... 'name','实例17');t=(1:2:15)*pi/8;x=sin(t);y=cos(t);fill(x,y,'r')axis square offtext(0,0,'STOP',...'color',[1 1 1],...'fontsize',50,...'horizontalalignment','center') 实例18:条形图和阶梯形图function shili18h0=figure('toolbar','none',... 'position',[200 150 450 250],... 'name','实例18');subplot(2,2,1)x=-3:0.2:3;y=exp(-x.*x);bar(x,y)title('2-D Bar Chart') subplot(2,2,2)x=-3:0.2:3;y=exp(-x.*x);bar3(x,y,'r')title('3-D Bar Chart') subplot(2,2,3)x=-3:0.2:3;y=exp(-x.*x);stairs(x,y)title('Stair Chart')subplot(2,2,4)x=-3:0.2:3;y=exp(-x.*x);barh(x,y)title('Horizontal Bar Chart') 实例19:三维曲线图function shili19h0=figure('toolbar','none',... 'position',[200 150 450 400],... 'name','实例19');subplot(2,1,1)x=linspace(0,2*pi);y1=sin(x);y2=cos(x);y3=sin(x)+cos(x);z1=zeros(size(x));z2=0.5*z1;z3=z1;plot3(x,y1,z1,x,y2,z2,x,y3,z3) grid onxlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('Figure1:3-D Plot') subplot(2,1,2)x=linspace(0,2*pi);y1=sin(x);y3=sin(x)+cos(x);z1=zeros(size(x));z2=0.5*z1;z3=z1;plot3(x,z1,y1,x,z2,y2,x,z3,y3)grid onxlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('Figure2:3-D Plot')实例21:PEAKS函数曲线function shili21h0=figure('toolbar','none',...'position',[200 100 450 450],...'name','实例21');[x,y,z]=peaks(30);subplot(2,1,1)x=x(1,:);y=y(:,1);i=find(y>0.8&y<1.2);j=find(x>-0.6&x<0.5);z(i,j)=nan*z(i,j);surfc(x,y,z)xlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('Figure1:surfc函数形成的曲面') subplot(2,1,2)x=x(1,:);i=find(y>0.8&y<1.2);j=find(x>-0.6&x<0.5);z(i,j)=nan*z(i,j);surfl(x,y,z)xlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('Figure2:surfl函数形成的曲面')实例22:片状图function shili22h0=figure('toolbar','none',...'position',[200 150 550 350],...'name','实例22');subplot(1,2,1)x=rand(1,20);y=rand(1,20);z=peaks(x,y*pi);t=delaunay(x,y);trimesh(t,x,y,z)hidden offtitle('Figure1:Triangular Surface Plot'); subplot(1,2,2)x=rand(1,20);y=rand(1,20);z=peaks(x,y*pi);t=delaunay(x,y);trisurf(t,x,y,z)title('Figure1:Triangular Surface Plot'); 实例23:视角的调整function shili23h0=figure('toolbar','none',... 'position',[200 150 450 350],... 'name','实例23');x=-5:0.5:5;[x,y]=meshgrid(x);r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;subplot(2,2,1)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure1')view(-37.5,30)subplot(2,2,2)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure2')view(-37.5+90,30)subplot(2,2,3)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure3')view(-37.5,60)subplot(2,2,4)surf(x,y,z)xlabel('X-axis')ylabel('Y-axis')zlabel('Z-axis')title('Figure4')view(180,0)实例24:向量场的绘制function shili24h0=figure('toolbar','none',... 'position',[200 150 450 350],... 'name','实例24');subplot(2,2,1)z=peaks;ribbon(z)title('Figure1')subplot(2,2,2)[x,y,z]=peaks(15);[dx,dy]=gradient(z,0.5,0.5); contour(x,y,z,10)hold onquiver(x,y,dx,dy)hold offtitle('Figure2')subplot(2,2,3)[x,y,z]=peaks(15);[nx,ny,nz]=surfnorm(x,y,z); surf(x,y,z)hold onquiver3(x,y,z,nx,ny,nz)hold offtitle('Figure3')subplot(2,2,4)x=rand(3,5);y=rand(3,5);z=rand(3,5);c=rand(3,5);fill3(x,y,z,c)grid ontitle('Figure4')实例26:柱状图function shili26h0=figure('toolbar','none',... 'position',[200 50 450 450],... 'name','实例26');subplot(2,1,1)x=[5 2 18 7 39 8 65 5 54 3 2];bar(x)xlabel('X轴');ylabel('Y轴');title('第一子图');subplot(2,1,2)y=[5 2 18 7 39 8 65 5 54 3 2];xlabel('X轴');ylabel('Y轴');title('第二子图');实例28:羽状图function shili28h0=figure('toolbar','none',... 'position',[200 150 450 350],... 'name','实例28');subplot(2,1,1)alpha=90:-10:0;r=ones(size(alpha));m=alpha*pi/180;n=r*10;[u,v]=pol2cart(m,n);feather(u,v)title('羽状图')axis([0 20 0 10])subplot(2,1,2)t=0:0.5:10;x=0.05+i;y=exp(-x*t);feather(y)title('复数矩阵的羽状图')实例29:立体透视(1)function shili29h0=figure('toolbar','none',... 'position',[200 150 450 250],... 'name','实例29');[x,y,z]=meshgrid(-2:0.1:2,...-2:0.1:2);v=x.*exp(-x.^2-y.^2-z.^2); grid onfor i=-2:0.5:2;h1=surf(linspace(-2,2,20),... linspace(-2,2,20),...zeros(20)+i);rotate(h1,[1 -1 1],30)dx=get(h1,'xdata');dy=get(h1,'ydata');dz=get(h1,'zdata');delete(h1)slice(x,y,z,v,[-2 2],2,-2)hold onslice(x,y,z,v,dx,dy,dz)hold offaxis tightview(-5,10)drawnowend实例30:立体透视(2)function shili30h0=figure('toolbar','none',... 'position',[200 150 450 250],... 'name','实例30');[x,y,z]=meshgrid(-2:0.1:2,...-2:0.1:2,...-2:0.1:2);v=x.*exp(-x.^2-y.^2-z.^2);[dx,dy,dz]=cylinder;slice(x,y,z,v,[-2 2],2,-2)for i=-2:0.2:2h=surface(dx+i,dy,dz);rotate(h,[1 0 0],90)xp=get(h,'xdata');yp=get(h,'ydata');zp=get(h,'zdata');delete(h)hold onhs=slice(x,y,z,v,xp,yp,zp);axis tightxlim([-3 3])view(-10,35)drawnowdelete(hs)hold offend实例31:表面图形function shili31h0=figure('toolbar','none',...'position',[200 150 550 250],... 'name','实例31');subplot(1,2,1)x=rand(100,1)*16-8;y=rand(100,1)*16-8;r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;xlin=linspace(min(x),max(x),33); ylin=linspace(min(y),max(y),33);[X,Y]=meshgrid(xlin,ylin);Z=griddata(x,y,z,X,Y,'cubic'); mesh(X,Y,Z)axis tighthold onplot3(x,y,z,'.','Markersize',20) subplot(1,2,2)k=5;n=2^k-1;theta=pi*(-n:2:n)/n;phi=(pi/2)*(-n:2:n)'/n;X=cos(phi)*cos(theta);Y=cos(phi)*sin(theta);Z=sin(phi)*ones(size(theta)); colormap([0 0 0;1 1 1])C=hadamard(2^k);surf(X,Y,Z,C)axis square实例33:曲线转换按钮h0=figure('toolbar','none',... 'position',[200 150 450 250],... 'name','实例33');x=0:0.5:2*pi;y=sin(x);h=plot(x,y);grid onhuidiao=[...'if i==1,',...'i=0;,',...'y=cos(x);,',...'set(hm,''string'',''正弦函数''),',...'h=plot(x,y);,',...'grid on,',...'else if i==0,',...'i=1;,',...'y=sin(x);,',...'set(hm,''string'',''余弦函数''),',...'delete(h),',...'h=plot(x,y);,',...'grid on,',...'end,',...'end'];hm=uicontrol(gcf,'style','pushbutton',... 'string','余弦函数',...'callback',huidiao);i=1;set(hm,'position',[250 20 60 20]);set(gca,'position',[0.2 0.2 0.6 0.6])title('按钮的使用')hold on实例34:栅格控制按钮h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例34');x=0:0.5:2*pi;y=sin(x);plot(x,y)huidiao1=[...'set(h_toggle2,''value'',0),',...];huidiao2=[...'set(h_toggle1,''value'',0),',...'grid off,',...];h_toggle1=uicontrol(gcf,'style','togglebutton',... 'string','grid on',...'value',0,...'position',[20 45 50 20],...'callback',huidiao1);h_toggle2=uicontrol(gcf,'style','togglebutton',... 'string','grid off',...'value',0,...'position',[20 20 50 20],...'callback',huidiao2);set(gca,'position',[0.2 0.2 0.6 0.6])title('开关按钮的使用')实例35:编辑框的使用h0=figure('toolbar','none',...'position',[200 150 350 250],...'name','实例35');f='Please input the letter';huidiao1=[...'g=upper(f);,',...'set(h2_edit,''string'',g),',...];huidiao2=[...'g=lower(f);,',...'set(h2_edit,''string'',g),',...];h1_edit=uicontrol(gcf,'style','edit',...'position',[100 200 100 50],...'HorizontalAlignment','left',...'string','Please input the letter',...'callback','f=get(h1_edit,''string'');',...'background','w',...'max',5,...'min',1);h2_edit=uicontrol(gcf,'style','edit',...'HorizontalAlignment','left',...'position',[100 100 100 50],...'background','w',...'max',5,...'min',1);h1_button=uicontrol(gcf,'style','pushbutton',... 'string','小写变大写',...'position',[100 45 100 20],...'callback',huidiao1);h2_button=uicontrol(gcf,'style','pushbutton',... 'string','大写变小写',...'position',[100 20 100 20],...'callback',huidiao2);实例36:弹出式菜单h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例36');x=0:0.5:2*pi;y=sin(x);h=plot(x,y);grid onhm=uicontrol(gcf,'style','popupmenu',... 'string',...'sin(x)|cos(x)|sin(x)+cos(x)|exp(-sin(x))',... 'position',[250 20 50 20]);set(hm,'value',1)huidiao=[...'v=get(hm,''value'');,',...'switch v,',...'case 1,',...'delete(h),',...'y=sin(x);,',...'h=plot(x,y);,',...'grid on,',...'case 2,',...'delete(h),',...'y=cos(x);,',...'h=plot(x,y);,',...'grid on,',...'case 3,',...'delete(h),',...'y=sin(x)+cos(x);,',...'h=plot(x,y);,',...'grid on,',...'case 4,',...'delete(h),',...'y=exp(-sin(x));,',...'h=plot(x,y);,',...'grid on,',...'end'];set(hm,'callback',huidiao)set(gca,'position',[0.2 0.2 0.6 0.6]) title('弹出式菜单的使用')hold on实例37:滑标的使用h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例37');[x,y]=meshgrid(-8:0.5:8);r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;h0=mesh(x,y,z);h1=axes('position',...[0.2 0.2 0.5 0.5],...'visible','off');htext=uicontrol(gcf,...'units','points',...'position',[20 30 45 15],...'string','brightness',...'style','text');hslider=uicontrol(gcf,...'units','points',...'position',[10 10 300 15],...'min',-1,...'max',1,...'style','slider',...'callback',...'brighten(get(hslider,''value''))'); 实例38:多选菜单h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例38');[x,y]=meshgrid(-8:0.5:8);r=sqrt(x.^2+y.^2)+eps;z=sin(r)./r;h0=mesh(x,y,z);hlist=uicontrol(gcf,'style','listbox',...'string','default|spring|summer|autumn|winter',... 'max',5,...'min',1,...'position',[20 20 80 100],...'callback',[...'k=get(hlist,''value'');,',...'switch k,',...'case 1,',...'colormap default,',...'case 2,',...'colormap spring,',...'case 3,',...'colormap summer,',...'case 4,',...'colormap autumn,',...'case 5,',...'colormap winter,',...'end']);实例39:菜单控制的使用h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例39');x=0:0.5:2*pi;y=cos(x);h=plot(x,y);grid onset(gcf,'toolbar','none')hm=uimenu('label','example');huidiao1=[...'set(hm_gridon,''checked'',''on''),',...'set(hm_gridoff,''checked'',''off''),',...'grid on'];huidiao2=[...'set(hm_gridoff,''checked'',''on''),',...'set(hm_gridon,''checked'',''off''),',...'grid off'];hm_gridon=uimenu(hm,'label','grid on',... 'checked','on',...'callback',huidiao1);hm_gridoff=uimenu(hm,'label','grid off',... 'checked','off',...'callback',huidiao2);实例40:UIMENU菜单的应用h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例40');h1=uimenu(gcf,'label','函数');h11=uimenu(h1,'label','轮廓图',...'callback',[...'set(h31,''checked'',''on''),',...'set(h32,''checked'',''off''),',...'[x,y,z]=peaks;,',...'contour3(x,y,z,30)']);h12=uimenu(h1,'label','高斯分布',... 'callback',[...'set(h31,''checked'',''on''),',...'set(h32,''checked'',''off''),',...'mesh(peaks);,',...'axis tight']);h13=uimenu(h1,'label','Sinc函数',... 'callback',[...'set(h31,''checked'',''on''),',...'set(h32,''checked'',''off''),',...'[x,y]=meshgrid(-8:0.5:8);,',...'r=sqrt(x.^2+y.^2)+eps;,',...'z=sin(r)./r;,',...'mesh(x,y,z)']);h2=uimenu(gcf,'label','色彩');hl2(1)=uimenu(h2,'label','Default',... 'checked','on',...'callback',...[...'set(hl2,''checked'',''off''),',...'set(hl2(1),''checked'',''on''),',...'colormap(''default'')']);hl2(2)=uimenu(h2,'label','spring',... 'callback',...[...'set(hl2,''checked'',''off''),',...'set(hl2(2),''checked'',''on''),',...'colormap(spring)']);hl2(3)=uimenu(h2,'label','Summer',... 'callback',...[...'set(hl2,''checked'',''off''),',...'set(hl2(3),''checked'',''on''),',...'colormap(summer)']);hl2(4)=uimenu(h2,'label','Autumn',... 'callback',...[...'set(hl2,''checked'',''off''),',...'set(hl2(4),''checked'',''on''),',...'colormap(autumn)']);hl2(5)=uimenu(h2,'label','Winter',... 'callback',...[...'set(hl2,''checked'',''off''),',...'set(hl2(5),''checked'',''on''),',...'colormap(winter)']);h3=uimenu(gcf,'label','坐标选项');h31=uimenu(h3,'label','Axis on',... 'callback',...[...'axis on,',...'set(h31,''checked'',''on''),',...'set(h32,''checked'',''off'')']);h32=uimenu(h3,'label','Axis off',... 'callback',...[...'axis off,',...'set(h32,''checked'',''on''),',...'set(h31,''checked'',''off'')']);实例41:除法计算器h=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例41');h1=uicontrol(gcf,'style','edit',...'position',[80 200 100 20],...'HorizontalAlignment','right',...'callback',['m=get(h1,''string'');,',...'a=str2num(m);']);h2=uicontrol(gcf,'style','edit',...'HorizontalAlignment','right',...'position',[80 150 100 20],...'callback',['n=get(h2,''string'');,',...'b=str2num(n);']);h3=uicontrol(gcf,'style','text',...'string','被除数',...'position',[80 230 100 20]);h4=uicontrol(gcf,'style','edit',...'position',[80 50 100 20]);h5=uicontrol(gcf,'style','pushbutton',...'position',[80 100 100 20],...'string','=',...'callback',[...'if b==0,',...'h7=errordlg(''除数不能为0!'',''error'',''on'');,',... 'else,',...'k=a/b;,',...'c=num2str(k);,',...'set(h4,''string'',c),',...'end']);h8=uicontrol(gcf,'style','text',...'string','除数',...'position',[80 175 100 20]);h9=uicontrol(gcf,'style','text',...'string','商',...'position',[80 75 100 20]);实例42:单选框的使用h0=figure('toolbar','none',...'position',[200 150 450 250],...'name','实例42');x=0:0.5:2*pi;y=sin(x);plot(x,y)grid onset(gcf,'toolbar','none')g=set(gca,'position',[0.2 0.2 0.6 0.6]); huidiao1=[...'grid on,',...'set(box_on,''value'',1),',...'set(box_off,''value'',0),'];huidiao2=[...'grid off,',...'set(box_off,''value'',1),',...'set(box_on,''value'',0),'];box_on=uicontrol(gcf,'style','radio',... 'position',[5 50 50 20],...'string','grid on',...'value',1,...'callback',huidiao1);box_off=uicontrol(gcf,'style','radio',... 'position',[5 20 50 20],...。
2011高教社杯全国大学生数学建模竞赛B题参考答案

交巡警服务平台的设置与调度优化分析摘要本文以实现警察的刑事执法、治安管理、交通管理、服务群众四大职能为宗旨,利用有限的警务资源,根据城市的实际情况与需求合理地设置了交巡警服务平台、分配各平台的管辖范围及调度警务资源。
并分别对题目的各问,作了合理的解答。
问题一:(1)、根据题目所给数据,确定各节点之间的相邻关系和距离,利用Floyd 算法及matlab编程求出两点之间的最短距离,使其尽量满足能在3分钟内有交巡警平台警力到达案发结点的原则,节点去选择平台,把节点分配给离节点距离最近的平台管辖,据此,我们得到了平台的管辖区域划分。
(2)、我们对进出该区的13条交通要道实现快速全封锁的问题,我们认定在所有调度方案中,某种方案中耗时最长的的围堵时间最短即最佳方案,利用0-1变量确定平台的去向,并利用线性规划知识来求解指派问题,求得了最优的调度方案。
(3)、在确定增添平台的个数和具体位置的问题中,我们将尽量保证每个节点都有一个平台可以在三分钟内到达作为主要原则来求解。
我们先找出到达每个平台的时间都超过三分钟的节点,并尝试在这些节点中选取若干个作为新的平台,求出合理的添加方案。
问题二:(1)、按照设置交巡警服务平台的原则和任务,分析现有的服务平台的设置是否合理,我们以各区覆盖率作为服务平台分布合不合理的评价标准,得到C、D、E、F区域平台设置不合理。
并尝试一些新的设置方案使得设置更为合理,最后以覆盖率最低的E区为例,使用一种修改方案得到一个比原方案更合理的交巡警服务平台的设置方案。
(2)、追捕问题要求在最快的时间内抓到围堵罪犯,在罪犯和警察的行动速度一致的前提假设下,我们先设定一个具体较小的时间,编写程序检验在这个时间内是否可以成功抓捕罪犯,不行则以微小时间间隔增加时间,当第一次成功围堵时,这个时间即为最佳围堵方案。
关健字: MATLAB软件,0-1规划,最短路,Floyd算法,指派问题一、问题重述“有困难找警察”,是家喻户晓的一句流行语。
数学建模floyd算法最短路算法详解

最短路算法
任意一对顶点之间的最短路算法:Floyd算法
(一)算法的基本思想
(二)算法原理 1、求距离矩阵的方法 2、求路径矩阵的方法 3、查找最短路路径的方法
选址问题--中心问题
例 2 某城市要建立一个消防站,为该市所属的七个区服务, 如图所示.问应设在那个区,才能使它至最远区的路径最短.
(1)用 Floyd 算法求出距离矩阵 D= (dij ) .
(2) 计算在各点vi 设立服务设施的
最大服务距离S (vi ) .
S (vi
)
max{d
1 j
算法原理—— 查找最短路路径的方法
若 rij( ) p1,则点 p1 是点 i 到点 j 的最短路的中间点.
然后用同样的方法再分头查找.若:
(1)向点 i 追朔得:rip(1 )
p2
r,
( ) ip 2
p3 ,…,rip(k )
pk
(2) 向点
j
追朔得:
r ( ) p1 j
q1
1 4 4 4 4 4 2 3 3 3
D
5
2
0
2
4 ,
R
4
2
3
4
5
3 4 2 0 6
1 3 3 4 3
9
6
4
6
0
4
3
3
3
5
floyd算法求解邻接矩阵的最短距离矩阵

floyd算法求解邻接矩阵的最短距离矩阵(原创实用版)目录1.Floyd 算法简介2.邻接矩阵的概念及其与图的关系3.最短距离矩阵的定义及计算方法4.Floyd 算法的应用实例5.Floyd 算法的优缺点分析正文【1.Floyd 算法简介】Floyd 算法是一种用于寻找加权图中所有顶点之间最短路径的算法,由 Robert C.Floyd 于 1968 年提出。
该算法适用于存在负权边的图,并且可以处理有权重为 0 的边但无权值为 0 的边的情况。
Floyd 算法的基本思想是动态规划,通过迭代计算每个顶点的最短路径,最终得到整个图的最短距离矩阵。
【2.邻接矩阵的概念及其与图的关系】邻接矩阵是用于表示有向图或无向图中顶点间关系的矩阵。
对于无向图来说,邻接矩阵是一个对称矩阵,其元素表示图中顶点 i 到顶点 j 的边的权值。
对于有向图来说,邻接矩阵可能不再是对称矩阵,但其元素仍然表示图中顶点 i 到顶点 j 的边的权值。
邻接矩阵与图之间存在一一对应关系,可以通过邻接矩阵来描述图的结构,反之亦然。
【3.最短距离矩阵的定义及计算方法】最短距离矩阵是用于表示图中所有顶点之间最短路径长度的矩阵。
对于无向图来说,最短距离矩阵是一个对称矩阵,其元素表示顶点 i 到顶点 j 的最短路径长度。
对于有向图来说,最短距离矩阵可能不再是对称矩阵,但其元素仍然表示顶点 i 到顶点 j 的最短路径长度。
计算最短距离矩阵的方法有很多,如 Dijkstra 算法、Floyd 算法等。
【4.Floyd 算法的应用实例】假设有一个 4 个顶点的无向图,邻接矩阵如下:```0 1 0 01 0 1 00 1 0 00 0 0 0```通过 Floyd 算法计算得到最短距离矩阵如下:```0 1 0 01 0 1 00 1 0 00 0 0 0```可以看到,顶点 1 到顶点 3 的最短距离为 1,而其他顶点之间的最短距离为 0。
【5.Floyd 算法的优缺点分析】优点:1.Floyd 算法可以处理负权边和权值为 0 的边;2.Floyd 算法适用于所有类型的图,无论是有向图还是无向图;3.Floyd 算法的时间复杂度较低,为 O(n^3)。
matlab 最短路径

matlab 最短路径
Matlab实现最短路径算法,包括Dijkstra算法和Floyd算法。
最短路径算法是一类经典的图论算法,它在计算图中两点之间的最短路径时,通过定义从起点到终点的路径长度,寻找最小路径的过程。
Dijkstra算法是一种贪心算法,依次选择起点到未确定最短路径的节点中距离最短的节点,并更新其他节点的距离;Floyd算法则是一种动态规划算法,通过递推求解任意两点间的最短路径。
本文将介绍这两种算法的原理和实现,并给出Matlab代码示例,帮助读者快速掌握最短路径算法的编程实现。
- 1 -。
Floyd算法_计算最短距离矩阵和路由矩阵_查询最短距离和路由_matlab实验报告材料

实验四:Floyd 算法一、实验目的利用MATLAB 实现Floyd 算法,可对输入的邻接距离矩阵计算图中任意两点间的最短距离矩阵和路由矩阵,且能查询任意两点间的最短距离和路由。
二、实验原理Floyd 算法适用于求解网络中的任意两点间的最短路径:通过图的权值矩阵求出任意两点间的最短距离矩阵和路由矩阵。
优点是容易理解,可以算出任意两个节点之间最短距离的算法,且程序容易实现,缺点是复杂度达到,不适合计算大量数据。
Floyd 算法可描述如下:给定图G 及其边(i , j )的权w(1≤i≤n ,1≤j≤n)i, jF0:初始化距离矩阵W(0)和路由矩阵R(0)。
其中:F1:已求得W(k-1)和R(k-1),依据下面的迭代求W(k)和R(k)F2:若k≤n,重复F1;若k>n,终止。
三、实验内容1、用MATLAB 仿真工具实现Floyd 算法:给定图G 及其边(i , j )的权(1≤i≤n ,1≤j≤n) ,求出其各个端点之间的最小距离以及路由。
wi , j(1)尽可能用M 函数分别实现算法的关键部分,用M 脚本来进行算法结果验证;(2)分别用以下两个初始距离矩阵表示的图进行算法验证:分别求出W(7)和R(7)。
2、根据最短路由矩阵查询任意两点间的最短距离和路由(1)最短距离可以从最短距离矩阵的ω(i,j)中直接得出;(2)相应的路由则可以通过在路由矩阵中查找得出。
由于该程序中使用的是前向矩阵,因此在查找的过程中,路由矩阵中r(i,j)对应的值为Vi 到Vj 路由上的下一个端点,这样再代入r(r(i,j),j),可得到下下个端点,由此不断循环下去,即可找到最终的路由。
(3)对图1,分别以端点对V4 和V6, V3 和V4 为例,求其最短距离和路由;对图2,分别以端点对V1 和V7,V3 和V5,V1 和V6 为例,求其最短距离和路由。
3、输入一邻接权值矩阵,求解最短距离和路由矩阵,及某些点间的最短路径。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
利用MATLAB实现Floyd算法,可对输入的邻接距离矩阵计算图中任意两点间的最短距离矩阵和路由矩阵,且能查询任意两点间的最短距离和路由。
二、实验原理
Floyd 算法适用于求解网络中的任意两点间的最短路径:通过图的权值矩阵求出任意两点间的最短距离矩阵和路由矩阵。
优点是容易理解,可以算出任意两个
节点之间最短距离的算法,且程序容易实现,缺点是复杂度达到,不适合计算大量数据。
Floyd 算法可描述如下:
给定图G及其边(i , j ) 的权w, j (1 < i < n ,1 <j < n)
FO:初始化距离矩阵W°)和路由矩阵R0)。
其中:
F1:已求得VF和R k-1),依据下面的迭代求W和R k)
F2:若k<n,重复F1 ;若k>n,终止。
??
三、实验内容
1、用MATLAB仿真工具实现Floyd算法:给定图G及其边(i , j ) 的权
w, j (1 < i < n ,1 < j < n),求出其各个端点之间的最小距离以及路由。
(1)尽可能用 M 函数分别实现算法的关键部分,用 M 脚本来进行算法结果验证;
(2)分别用以下两个初始距离矩阵表示的图进行算法验证:
分别求出WT和R7)。
2、根据最短路由矩阵查询任意两点间的最短距离和路由
(1)最短距离可以从最短距离矩阵的3 (i,j)中直接得出;
(2)相应的路由则可以通过在路由矩阵中查找得出。
由于该程序中使用的是前向矩阵,因此在查找的过程中,路由矩阵中r(i,j) 对应的值为Vi到Vj路由上的下一个端点,这样再代入r(r(i,j),j) ,可得到下下个端点,由此不断循环下去,即可找到最终的路由。
(3)对图1,分别以端点对V4 和V6, V3 和V4 为例,求其最短距离和路由;对图2,分别以端点对V1和V7, V3和V5, V1和V6为例,求其最短距离和路由。
3、输入一邻接权值矩阵,求解最短距离和路由矩阵,及某些点间的最短路径。
四、采用的语言
MatLab 源代码:【】 function [w r] = func1(w) n=length(w);
x = w;
r = zeros(n,1);% 路由矩阵的初始化 for i=1:1:n
for j=1:1:n if x(i,j)==inf r(i,j)=0;
else r(i,j)=j;
end, end end; %迭代求出 k 次 w 值 for k=1:n a=w; s = w;
for i=1:n for j=1:n w(i,j)=min(s(i,j),s(i,k)+s(k,j));
end end %根据k-1次值和k次w值求出k次r值 for i=1:n
for
j=1:n if
i==j
r(i,j)=0
;
elseif w(i,j)<a(i,j) r(i,j)=r(i,k);
else r(i,j)=r(i,j);
end end end end;
【】 function [P u]=func2(w,k1,k2) n = length(w);
U = w;
m = 1;
while m <= n
for i = 1:n;
for j = 1:n;
if U(i,j)>U(i,m) + U(m,j) U(i,j) = U(i,m) + U(m,j);
end
end
end
m = m + 1;
end
u = U(k1,k2);
P1=zeros(1,n);
k = 1;
P1(k) = k2;
V = ones(1,n) * 100; kk = k2;
while kk~=k1
for i = 1:n
V(1,i) = U(k1,kk) - w(i,kk); if V(1,i) == U(k1,i) P1(k+1)=i;
kk=i; k=k+1;
end
end
end k=1;
wrow = find(P1~=0); for j=length(wrow):(-1):1
P(k) = P1(wrow(j)); k=k+1;
P;
【】
w1=[0 100 100 100 ;
100 0 100 5 100 2;
100 100 0 100 100 4 ; 5 100 0 100 100;
100 100 0 100;
100 4 100 0 100;
2 100 100 100 0]; w2=[0 2 100 100 100;
0 100 100 100;
2 100 0 100 5 100 ;
100 100 0 100 100 4;
100 5 100 0 100;
100 100 100 0 ;
100 100 4 100 0]; [W1 R1] = func1(w1) [W2 R2] = func1(w2)
【】 w=input(' 输入权值矩阵 w=');
k1=input(' 输入端点 1:k1=');
k2=input(' 输入端点 2:k2=');
w
[W R] = func1(w)
[P u]=func2(w,k1,k2);
disp(['k1 、k2 间最短路: ',num2str(P)]);
disp(['k1 、k2 间最短距离: ',num2str(u)]);
五、数据结构
1. 主要函数最短距离、路由函数:function [w r] = func1(w) n=length(w); x = w;
r = zeros(n,1);% 路由矩阵的初始化
for i=1:1:n
for j=1:1:n if x(i,j)==100 r(i,j)=0;
else
r(i,j)=j;
end,
end
end;
%迭代求岀k次W直
for k=1:n
a=w;
s = w;
for i=1:n
for j=1:n w(i,j)=min(s(i,j),s(i,k)+s(k,j));
end
% 根据k-1次值和k次w值求岀k次r值for i=1:n
for j=1:n
if i==j
r(i,j)=0;
elseif w(i,j)<a(i,j) r(i,j)=r(i,k);
else
r(i,
j)=r
(i,j
);
end end end end; 最短路径函数:function [P u]=func2(w,k1,k2) n = length(w); U = w; m = 1; while m <= n for i = 1:n;
for j = 1:n;
if U(i,j)>U(i,m) + U(m,j) U(i,j) = U(i,m) + U(m,j);
end end end m = m + 1; end u = U(k1,k2); P1=zeros(1,n); k = 1; P1(k) = k2; V = ones(1,n) * 100; kk = k2; while kk~=k1 for i = 1:n
V(1,i) = U(k1,kk) - w(i,kk); if V(1,i) == U(k1,i)
P1(k+1)=i; kk=i; k=k+1;
end end end
k=1;
wrow = fin d(P1 〜=0);
for j=le ngth(wrow):(-1):1 P(k) = P1(wrow(j)); k=k+1;
end
P;
2.算法的流程图
Floyd算法:
六、实验结论与分析通过上图可知,V4和V6之间最短距离是,最短路由是
V4->V1—>V7->V2— >V6, 3和V4之间最短距离是,最短路由是 V3->V7— >V1->V4
通过上图可知,,点对V1和V7之间最短距离是,最短路由是 V1—>V3->V7 端点对
V3和V5之间最短距离是,最短路由是 V — >V1 — >V2 — >V5 端点对V1和V6之
间最短距离是,最短路由是 V1 — >V — >V5 — >V6
七、遇到的问题及解决方法
(1)图的等价表示方法;
(2)两点间的最短路径查询算法。
八、实验心得
通过本次实验实现了用计算机语言编写 Floys 本掌握了算法的实现方法,对MatLab 编程语言更加熟悉,培养了算法设计与优化能力。
此次实验我受益匪浅。