图论最短路径求解——手把手教你数学建模

这篇具有很好参考价值的文章主要介绍了图论最短路径求解——手把手教你数学建模。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


很多朋友在学习图论,或是数学建模的时候都会碰到最短路径问题。本讲将从如何作图开始,手把手教你图论中的最短路径问题。根据图的不同,我们将介绍两种不同的算法:迪杰斯特拉Dijkstra算法和Bellman‐Ford(贝尔曼‐福特)算法。

如何作图?

  1. 在线作图:https://csacademy.com/app/graph_editor/

  2. MatLab作图:

    % 函数graph(s,t):可在 s 和 t 中的对应节点之间创建边,并生成一个图
    G1 = graph(s1, t1);
    plot(G1)  % plot函数用于MatLab中图的展示
    
    % 函数graph(s,t,w):可在 s 和 t 中的对应节点之间以w的权重创建边,并生成一个图
    G2 = graph(s2, t2);
    plot(G2, 'linewidth', 2)  % 设置线的宽度
    
    % 下面的命令是在画图后不显示坐标
    set( gca, 'XTick', [], 'YTick', [] ); 
    
    % 有权重的图(如 s = [1,2,3,4]; t = [2,3,1,1]; w = [3,8,9,2]; )
    G3 = graph(s3, t3, w)
    plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2)  % 同时展示权重
    set( gca, 'XTick', [], 'YTick', [] );  
    

上面都是无向图,要做出有向图,只需要将graph改为digraph就行了。

注:Matlab做出来的图不是很漂亮,要是节点比较少,还是推荐使用在线作图

最短路径算法

迪杰斯特拉算法——贪心算法

  • 原理:将节点分为是否访问的状态,每次增加 已访问节点 与 未访问节点 之间的最短路径。

  • 使用范围:有向图、无向图。

  • 缺点:不能处理负权重。

Bellman‐Ford(贝尔曼‐福特)算法

  • 原理:利用循环来进行更新权重,且每循环一次,贝尔曼福特算法都会更新所有的节点的信息。(不再将节点区分为是否已访问的状态)

  • 适用范围:支持带负权重的有向图,不支持含有负权回路的图。

  • 缺点:运行时间较慢

Matlab函数求解

计算最短路径

[P,d] = shortestpath(G,start,end [,'Method',algorithm] )  %注意:该函数matlab2015b之后才有哦

功能:返回图G中start节点到end节点的最短路径

输入参数:
(1)G ‐ 输入图(graph 对象——无向图 | digraph 对象——有向图)
(2)start 起始的节点
(3)end 目标的节点
(4)[,‘Method’,algorithm]是可选的参数,表示计算最短路径的算法。一般我们不用手动设置,默认使用的是“auto”。MatLab会自动为我们匹配相应算法

输出参数:
(1)P – 最短路径经过的节点
(2)d – 最短距离

注:Matlab中的图节点要从1开始编号,所以要把0全部改为9

返回任意两点的距离矩阵

d = distances(G [,'Method',algorithm])  %注意:该函数matlab2015b之后才有哦

找给定范围内所有的点

[nodeIDs,dist] = nearest(G,s,d [,'Method',algorithm])  %注意:该函数matlab2016a之后才有哦

返回图形 G 中与节点 s 的距离在 d 之内的所有节点。
nodeIDs是符合条件的节点
Dist是这些节点与s的距离

来道例题

题目

下图为单行线交通网,每弧旁的数字表示通过这条线所需的费用。现在某人要从v1出发,通过这个交通网到v8去,求使总费用最小的旅行路线。
求源节点s到目标节点t的最短路径,数学建模,图论,matlab,算法,线性代数文章来源地址https://www.toymoban.com/news/detail-599462.html

题解

  • 代码:
s = [1 1 1 2 3 3 4 5 5 5 5 6 6 7 9 9]; % 在 s 和 t 中的对应节点之间创建边
t = [2 3 4 5 2 4 6 4 6 7 8 5 7 8 5 8];
w = [6 3 1 1 2 2 10 6 4 3 6 10 2 4 2 3]; % 线路费用 —— 边的权重

G = digraph(s, t, w);  % 生成有向图
myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) % 通过MatLab画图
set( gca, 'XTick', [], 'YTick', [] );  % 画图后不显示坐标

[P,d] = shortestpath(G, 1, 8) % 求出最短路径(P)及其距离(d)
highlight(myplot, P, 'EdgeColor', 'r') % 高亮最短路径
  • 答案:
P 	=	1     3     2     5     8

d 	=	12
  • MatLab输出图形结果:
    求源节点s到目标节点t的最短路径,数学建模,图论,matlab,算法,线性代数

到了这里,关于图论最短路径求解——手把手教你数学建模的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你SHA-256

    SHA-256是SHA-2协议簇的一部分,也是当前最流行的协议算法之一。在本篇文章中,我们会了解这个密码学算法的每一个步骤,并且通过实例演示。SHA-2因它的安全性(比SHA-1强很多)和速度为人所知。在没有键(keys)生成的情况下,例如挖掘比特币,像SHA-2这样的快速哈希算法很

    2024年02月13日
    浏览(79)
  • 手把手教你落地DDD

    一、前言 常见的DDD实现架构有很多种,如经典四层架构、六边形(适配器端口)架构、整洁架构(Clean Architecture)、CQRS架构等。架构无优劣高下之分,只要熟练掌握就都是合适的架构。本文不会逐个去讲解这些架构,感兴趣的读者可以自行去了解。 本文将带领大家从日常的

    2024年02月16日
    浏览(53)
  • 手把手教你做主成分分析

    主成分分析是一种降维处理的统计方法,实践中有三个应用场景: 信息浓缩:将多个分析项浓缩成几个关键概括性指标; 权重计算:利用方差解释率值计算各概括性指标的权重; 综合评价:基于主成分得分构造综合得分数据,用于综合评价。 接下来,以一个具体案例来学习

    2024年02月01日
    浏览(61)
  • 手把手教你实战TDD

    领域驱动设计,测试驱动开发。 我们在《手把手教你落地DDD》一文中介绍了领域驱动设计(DDD)的落地实战,本文将对测试驱动开发(TDD)进行探讨,主要内容有:TDD基本理解、TDD常见误区、TDD技术选型,以及案例实战。希望通过本文,读者能够理解掌握TDD并将其应用于实际

    2024年02月08日
    浏览(50)
  • 手把手教你彻底卸载MySQL

    ❤写在前面 ❤博客主页: 努力的小鳴人 ❤系列专栏: MySQL8.0基础学习 ❤欢迎小伙伴们, 点赞👍关注🔎收藏🍔 一起学习! ❤如有错误的地方,还请小伙伴们指正!🌹 ​ 目录 步骤1:停止MySQL服务 步骤2:软件的卸载 步骤3:残余文件的清理 步骤4:清理注册表 步骤5:删除

    2024年02月05日
    浏览(43)
  • 手把手教你写go单元测试

    ​ 在 Go 语言中,单元测试是一种测试方法,用于验证代码的某个独立单元是否按预期功能,它的目的是确保代码的每个组成部分都在独立测试的情况下运行正常。 ​ 在我们对项目新增一个新功能时,最好就要养成写单元测试的好习惯,这样可以有助于提高我们代码的质量、

    2024年04月14日
    浏览(46)
  • 手把手教你小程序反编译

    1.反编译工具unveilr :百度网盘链接:https://pan.baidu.com/s/10Wle8CwvBq54GPWcbEnxLQ 提取码:bivh   解压即可用。 2.微信开发者工具:https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html 1.获取小程序存储文件夹 (1)打开PC端微信设置,在文件管理中找到存储路径,选择打开文件夹。

    2024年04月12日
    浏览(44)
  • 手把手教你爬取网站信息

    如题,理解这一部分需要一定的Python基础,有些代码我不做详细解释了,但是用这个方法是确实可以爬到的。 1. 在抓包⼯具中先定位到和浏览器地址栏的⽹址⼀样的数据包 ①在页面中右击鼠标,点击检查,博主这里用的是Google浏览器 ②在弹出来的页面中点击Network,然后再重

    2024年02月02日
    浏览(42)
  • 手把手教你如何使用Docker

    我们在公司开发中,会有开发环境,测试环境,上线环境, 比如我们开发人员开发好了一个项目,在开发环境中运行正常,但测试人员拉到测试环境就跑不起来【jdk版本等】,或者上线的时候运行不起来,这时候就要为每个机器配置一个环境,那运维人员不得累死?【哈哈,

    2024年02月10日
    浏览(71)
  • 手把手教你绘制小程序海报

    海报分享功能在许多应用中应该是很常见的,因为它作为一种常用的应用推广和拉新的方式。 接下来看个实际的案例,如下: 把任务拆解下: 如何绘制海报 如何把绘制后的海报保存到相册 用 canvas 来绘制海报。 这里需要了解基本的 canvas api ,不熟悉可以先去了解下相关

    2024年02月04日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包