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

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


很多朋友在学习图论,或是数学建模的时候都会碰到最短路径问题。本讲将从如何作图开始,手把手教你图论中的最短路径问题。根据图的不同,我们将介绍两种不同的算法:迪杰斯特拉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模板网!

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

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

相关文章

  • 手把手教你暴力破解

    暴力破解是一种攻击手段,使用大量的认证信息在认证接口尝试登录,直到得到正确的结果。 2.1标题基于表单的暴力破解 2.1.1 第一步:打开burpsuite拦截 2.1.2 第二步:将拦截到的包右击发送到intruder模块 (其中简单介绍一下intruder模块) Target主要是设置暴力破解访问的host地址

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

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

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

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

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

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

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

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

    2024年04月14日
    浏览(45)
  • 手把手教你Linux的网络配置

    目录 网络连接测试 测试Linux虚拟机是否与主机连接 测试主机是否与虚拟机连接 网络连接模式 桥接模式 NAT模式 仅主机模式 修改静态IP 修改 IP 地址后可能会遇到的问题 配置主机名 测试Linux虚拟机是否与主机连接 首先可以在windows界面,windows + R键输出cmd打开命令行,输入  

    2024年02月03日
    浏览(52)
  • 手把手教你小程序反编译

    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日
    浏览(42)
  • 手把手教你怎么写顺序表

    目录 一、顺序表有什么功能? 二、实现顺序表的各个功能 1.前置准备 2.初始化顺序表 3.顺序表扩容 4.打印顺序表 5.增加顺序表成员 5.1尾增 5.2头增  6.删除顺序表中成员的内容 6.1尾删 6.2头删  7.查找成员  8.修改(替换) 9.插入(在目标位置插入成员) 10.定向删除(将目标位置的成

    2024年02月15日
    浏览(64)
  • 手把手教你如何使用SimiliarWeb

    在之前的“手把手教你如何使用Google Trends”文章中我们讲到从事跨境电商的卖家第一步遇到的问题是“客户在哪里?”该如何推广我的产品?因此若想自己的店铺做大做好,则需要工具来帮助分析市场行情,根据市场行情调整自己的业务状况。小编在上篇中已经讲解了三个特

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

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

    2024年02月10日
    浏览(66)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包