graphshortestpath 函数是用来解决最短路径问题的。

语法为:

  [dist, path, pred]=graphshortestpath(G,S)
  [dist, path, pred]=graphshortestpath(G,S,T)

  G是稀疏矩阵,S是起点,T是终点。dist表示最短距离,path表示最短距离经过的路径节点,pred表示从S到每个节点的最短路径中,目标节点的先驱,即目标节点的前面一个节点。比如一共有6个点,S=1,那么运行这个函数后pred存的就是S=1这个节点到其它节点T'最短路径上T'的前一个节点。这个函数也就是求出图G上S到T的[distpathpred],当不写T时表示求S到其它所有点的[distpathpred]。

  G是个稀疏矩阵,我的理解是稀疏矩阵就是含有大量0的矩阵,可能为了便于存储和加快计算,才采用这种矩阵。G并不是图的路径权值矩阵,它由s[]向量和t[]向量和路径权值向量w[]构成:G=spares(s,t,w)。也就是说G应该是个N*3的矩阵,第一行表示节点起点,第二行表示节点终点,第三行是权值。而且同一条无向边不用重复写,因为先这样构造的是个有向图。无向图需要这样操作:UG=tril(G+G');就是把G和自己的转置G'加起来再求下三角矩阵。

  对于无向图、有向图搞明白了其它的就是一些参数、属性的调整了。

  附上文档中的代码,有改动:

clc;
W = [.41 .99 .51 .32 .15 .45 .38 .32 .36 .29 .21];
DG = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],W);
h=view(biograph(DG,[],'ShowWeights','on'))
[dist,path,pred]=graphshortestpath(DG,1,6,'Directed','true')
set(h.Nodes(path),'Color',[1 0.4 0.4])
edges=getedgesbynodeid(h,get(h.Nodes(path),'ID'));%我觉得这里就是获得最短路径的边和ID
set(edges,'LineColor',[1 0 0])
set(edges,'LineWidth',1.5)
UG=tril(DG+DG');
bg=biograph(UG,[],'ShowArrows','off','ShowWeights','on');
h=view(bg)
set(bg.nodes,'shape','circle');
[dist,path,pred]=graphshortestpath(UG,1,6,'Directed','false')
set(h.Nodes(path),'Color',[1 0.4 0.4])
fowEdges=getedgesbynodeid(h,get(h.Nodes(path),'ID'));
revEdges=getedgesbynodeid(h,get(h.Nodes(fliplr(path)),'ID'));%这里fliplr是反转操作,比如把[1 2 3]变成[3 2 1]。由于是无向图,所以正反都要求。
edges=[fowEdges;revEdges];
set(edges,'LineColor',[0.6 0.4 0.1])
set(edges,'LineWidth',1.5)

  

  

而对于graphallshortestpaths函数则是求所有点之间的最短距离:[dist] = graphallshortestpaths(G)

道理和上面那个函数很相似,当然内部实现的算法是不一样的。

这还是文档里的例程:

W = [.41 .99 .51 .32 .15 .45 .38 .32 .36 .29 .21];
DG = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],W);
view(biograph(DG,[],'ShowWeights','on'))
graphallshortestpaths(DG)
UG = tril(DG + DG')
view(biograph(UG,[],'ShowArrows','off','ShowWeights','on'))

  

【7.19 graphshortestpath graphallshortestpaths函数】matlab 求最短路径函数总结的更多相关文章

  1. python常用函数之--求绝对值函数:abs(x)

    python中的求绝对值函数:abs(X) 1. 参数 x 可以是整形也可以是复数,假如是复数的话,就求复数的模. >>> # 整形数字 ... >>> a = 1 ...

  2. O(n)求素数,求欧拉函数,求莫比乌斯函数,求对mod的逆元,各种求

    筛素数 void shai() { no[1]=true;no[0]=true; for(int i=2;i<=r;i++) { if(!no[i]) p[++p[0]]=i; int j=1, ...

  3. matlab求取积分

    声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 对于Matlab的使用情况常常是这样子的,很多零碎的函数名字很难记忆,经常用过后过一段时间就又忘记了,又得去网 ...

  4. matlab求方差,均值,均方差,协方差的函数

    1. 均值 数学定义: Matlab函数:mean >>X=[1,2,3] >>mean(X)=2 如果X是一个矩阵,则其均值是一个向量组.mean(X,1)为列向量的均值,m ...

  5. [MATLAB] 利用遗传算法函数求目标函数的最优解

    最近接触到了遗传算法以及利用遗传算法求最优解,所以就把这些相关的内容整理记录一下. 一.遗传算法简介(摘自维基百科) 遗传算法(英语:genetic algorithm (GA))是计算数学中用于解决 ...

  6. MATLAB 单变量函数一阶及N阶求导

    1 对一维函数的求导及求特定函数处的变量值 %%最简单的一阶单变量函数进行求导 function usemyfunArray() %主函数必须位于最上方 clc clear syms x %syms ...

  7. MATLAB PCHIP函数一阶求导分析

    MATLAB PCHIP函数一阶求导分析 摘要:本文首先根据三次立方插值的一般表达式,得出分段三次立方插值时,每个小区间上的各次项系数.分析发现,三次项.二次项.一次项系数都与小区间端点处的一阶导数值 ...

  8. Matlab学习记录(函数)

    Matlab中的内建函数 Matlab自定义函数 用function构造函数 用inline构造函数 用syms构造符号函数 多项式相关函数 polyvalx convx 向量和矩阵运算函数 向量运算 ...

  9. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

随机推荐

  1. 伸缩布局flex

    一.伸缩布局的起源 1.之前我们想要适应不同的浏览器,一般采用的是设置宽度.高度为父级元素的百分比,但是有时候百分比的计算是相当复杂的,加上有时候还有规定的宽度要设置,所以,伸缩布局的出现是我们所急需 ...

  2. redhat linux卸载自带的Java1.4.2安装JDK6

    一.卸载jdk1.4 由于Redhat Enterprise Linux 5.6 中自带安装了jdk1.4.2的,所以在安装jdk1.6前我把jdk1.4.2的卸了,步骤如下: 1.打开终端输入 yu ...

  3. mysql基础教程(三)-----增删改、子查询、创建管理表、约束和分页

    插入 INSERT语句语法 从其它表中拷贝数据 • 不必书写 VALUES 子句. • 子查询中的值列表应与 INSERT 子句中的列名对应 update语句 • 可以一次更新多条数据. • 如果需要 ...

  4. 【JSOI2018】绝地反击

    题面 50pts 首先当然是二分答案\(mid\), 对于每一个点,以它为圆心的圆,交上攻击轨道: 那么这个点到攻击轨迹的可达范围就是一段圆弧. 怎么求这段圆弧呢? 我们知道圆弧可以用其两端点对于圆心 ...

  5. MyBatis配置文件(三)--typeAliases别名

    因为类的全限定名一般包括包名,显得很长,在使用过程中不是很方便,所以MyBatis中允许我们使用一种简写的方式来代替全限定名,这就是别名.这就相当于我们在玩微信的时候,有些人的昵称很长很难记,怎么办? ...

  6. Django之数据库连接与建模

    Django数据库链接(这里以Mysql为例) 需要准备 Django1.10 pip install django==1.10 -i https://pypi.tuna.tsinghua.edu.c ...

  7. gulp入门之常见处理方式(三)

    整合 streams 来处理错误 默认情况下,在 stream 中发生一个错误的话,它会被直接抛出,除非已经有一个时间监听器监听着 error时间. 这在处理一个比较长的管道操作的时候会显得比较棘手. ...

  8. umask权限使用

    很显然,系统中各种文件的权限设置对特定用户的数据安全有很大影响.但是要求用户逐一明确设置系统中每个文件的权限也是不现实的,为此,需要使用umask命令,该命令可以为用户账号中新文件的创建进行缺省设置. ...

  9. 四种基本组合博弈POJ1067/HDU1846

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43466   Accepted: 14760 Descripti ...

  10. 开发者说 | 分布式事务中间件 Seata 的设计原理

    导读 微服务架构体系下,我们可以按照业务模块分层设计,单独部署,减轻了服务部署压力,也解耦了业务的耦合,避免了应用逐渐变成一个庞然怪物,从而可以轻松扩展,在某些服务出现故障时也不会影响其它服务的正常运 ...