上一次我们讨论了如何进行图论可视化,这一次我们通过matlab来找出图论中距离最小路径

一、迪杰斯特拉算法(Dijkstra)

迪杰斯特拉算法是由荷兰计算机科学家在1956年发现的算法,此算法使用类似广度优先搜索的方法解决了带权图的单源最短路径问题。它是一个贪心算法。

核心思想:罗列出一个表,其行标题代表着(1)是否经历过(2)距离初始点的距离(3)父节点;列标题则为每个节点的标号

通过不断更新距离和父节点,用贪心算法的思想找到路径最短点

除了迪杰斯特拉算法外,比较著名的找最短路径的方法还有Floyd(弗洛伊德)算法,Bellman‐Ford(贝尔曼‐福特)算法。。

其中,贝尔曼‐福特算法不再将节点区分为是否已访问的状态,因为贝尔曼‐福特模型是利用循环来进行更新权重的,且每循环一次,贝尔曼福特算法都会更新所有的节点的信息。因此,后者解决了迪杰斯特拉算法无法处理但不能处理负权重的问题。

但是他们都解决不了负权回路的图

二、shortestpath函数用法

matlab中提供了上面三种算法的函数包,现在我们来介绍一下这个函数的语法

1.基本语法

2.参数设计

3.应用实例

(1)输入图论信息

信息的输入在上一讲已经详细叙述过,基本思想是将信息用graph函数储存的一个G中。这时G作为一个数据结构,可以用Plot画图,shortestpath寻优



(2)输入参数进行求解

此处,我们需要寻找节点9到节点4的最短路径

[P,d] = shortestpath(G, 9, 4)

得到的P是一个向量,表示节点9到节点4所经历的所有节点

得到的d是一个数,表示从9到4的所经历的距离

(3)最短路径可视化



首先将图赋给一个变量,此时的myplot即为一个包含着图论信息的一个数据结构,之后可以通过对这个数据结构进行处理

之后用Highlight函数对这个变量进行高亮处理(给边加上r红色),P为得到的路径点。而后面的参数则表示对图的边进行红色高亮处理。效果如图所示

三、distances函数————求出任意两点的最短路径矩阵

对于已经储存的图论信息的变量G来说,matlab中的distance函数可以输出其任意两点的最短路径矩阵

用法:D = distances(G)

效果:



另外,我们可以直接通过D(i,j),找到节点i到节点j的距离,他返回值不像矩阵一样返回的是第i行第j列的元素

四、nearest函数————找出给定范围内的所有点

nearest函数可以返回图形 G 中与节点 s 的距离在 d 之内的所有节点

[nodeIDs,dist] = nearest(G, 2, 10)

nodeIDs返回的是与节点2距离小于等于10的所有节点,是一个节点向量

而dist是一个向量,对应着节点2与每一个nodeIDs节点的距离

图论最短路径问题与matlab实现的更多相关文章

  1. 图论-最短路径<Dijkstra,Floyd>

    昨天: 图论-概念与记录图的方法 以上是昨天的Blog,有需要者请先阅读完以上再阅读今天的Blog. 可能今天的有点乱,好好理理,认真看完相信你会懂得 分割线 第二天 引子:昨天我们简单讲了讲图的概念 ...

  2. 第16次CCF CSP认证-第5题-317 号子任务(subtask317)-图论最短路径

    [题目背景]“你在平原上走着走着,突然迎面遇到一堵墙,这墙向上无限高,向下无限深,向左无限远,向右无限远,这墙是什么?”——<流浪地球>原著我们带着地球去流浪了,为了处理流浪过程中可能会发 ...

  3. 图论最短路径算法总结(Bellman-Ford + SPFA + DAGSP + Dijkstra + Floyd-Warshall)

    这里感谢百度文库,百度百科,维基百科,还有算法导论的作者以及他的小伙伴们...... 最短路是现实生活中很常见的一个问题,之前练习了很多BFS的题目,BFS可以暴力解决很多最短路的问题,但是他有一定的 ...

  4. 图论——最短路径 Dijkstra算法、Floyd算法

    1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...

  5. 图论-最短路径--3、SPFA算法O(kE)

    SPFA算法O(kE) 主要思想是:     初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队.直到队列为空时算法结束.     这个算 ...

  6. 图论-最短路径 2.Dijkstra算法O (N2)

    2.Dijkstra算法O (N2) 用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法.也就是说,只能计算起点只有一个的情况. Dijkstra的时间复杂度是O (N2),它不能处 ...

  7. 图论最短路径算法——Dijkstra

    说实在的,这算法很简单,很简单,很简单--因为它是贪心的,而且码量也小,常数比起SPFA也小. 主要思想 先初始化,dis[起点]=0,其它皆为无限大. 还要有一个bz数组,bz[i]表示i是否确定为 ...

  8. [图论]最短路径问题 :Floyed-Warshall

    最短路径问题 目录 最短路径问题 Description Input Output Sample Input Sample Output 解析 了解Floyed算法 Floyed算法的核心思想: 代码 ...

  9. 图论最短路径算法——SPFA

    为了不要让太多人被害,我还是说一下这种算法,它实际上很简单,但被人讲着讲着绕晕了. 主要思想 有人说,SPFA是Bellman-Ford的队列优化.这个算法我也懂了,但是还没试过.我不管是什么算法的优 ...

  10. 图论-最短路径 floyd/dijkstra-Find the City With the Smallest Number of Neighbors at a Threshold Distance

    2020-01-30 22:22:58 问题描述: 问题求解: 解法一:floyd 这个题目一看就是floyd解最合适,因为是要求多源最短路,floyd算法是最合适的,时间复杂度为O(n ^ 3). ...

随机推荐

  1. Typora最后的免费版本0.11.18

    Typora最后的免费版本为0.11.18. 之后的1.x开始收费. 免费版本0.11.18的百度网盘链接如下(永久链接): 链接:https://pan.baidu.com/s/1XizAD0SFp ...

  2. 简述 js 的代码整洁之道

    文章参考出自:https://juejin.cn/post/7224382896626778172 前言 为什么代码要整洁? 代码质量与整洁度成正比.有的团队在赶工期的时候,不注重代码的整洁,代码写的 ...

  3. apisix~jwt-auth插件

    在网关开启jwt-auth插件之后,你的网关就具有了jwt解析和校验的功能,主要是校验jwt token的有效性,包含过期时间和签名等. https://apisix.apache.org/docs/ ...

  4. pageoffice6 在线编辑 word 文件时禁止拷贝到外部

    有些特殊情况下,希望用户可以在线编辑Word文档,也允许用户拷贝本地电脑或网络上的资料到Word文档中进行编辑,但是不希望用户把在线Word文档中的内容另存到本地或选择并拷贝出去,此时只是禁用另存.禁 ...

  5. Machine Learning - 笔记1

    一.监督学习(supervised learning) 1.回归(regression)         ①按我的理解来说,就是对于训练模型所用到的数据集,能够知道Input和Output的特征.比如 ...

  6. Debian中配置NIS:用户账号管理

    1.添加指定gid的组 groupadd -g 1001 upload # 添加了一个指定gid为1001的upload用户 2.添加指定uid的用户,并加入到指定组 useradd -u 1001 ...

  7. 用tkinter编写一个简单的登录注册界面

    代码: from tkinter import * window = Tk() window.geometry('400x300+500+150') window.title('xxx系统') Can ...

  8. golang sync.once done 热路径

    sync.once 为什么会将done放在结构体第一个字段,就能够提升性能了? 我们先来看看sync.once的结构体: // Once is an object that will perform ...

  9. 地图坐标转换 WGS84、BD09与GCJ02的相互转换

    高德地图 WGS84转GCJ02 export function wgs84ToGcj02(lng, lat) { if (out_of_china(lng, lat)) { return [lng, ...

  10. linux下 IPv6组播(C++)

      Server #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <s ...