【数模】图论最短路径问题

一、图的基本概念

  • 图的数学语言描述G(V(G),E(G))
    • V(vertex)指图的顶点集
    • E(edge)指图的边集。
  • 图的分类:根据边是否有方向,分为有向图和无向图。
    • 无向图属于特殊的有向图(一个无向边可看作两个有向边)
    • 边若有权值:有权图

在这里插入图片描述


二、作图

2.1 在线网站(节点少时使用)

在这里插入图片描述

2.2 Matlab作图(节点多时使用)

  • △注意:

    • Matlab只能从1开始编号,若强制从0开始,会报错
    • 该函数在2015b之后的版本才支持,如果运行出错请下载新版本Matlab。在这里插入图片描述
  • 具体看第八节代码文件code_graph.m

  • 制图

    • 无向图:
      % 函数graph(s,t):可在 s 和 t 中的对应节点之间创建边,并生成一个图
      G1 = graph(s1, t1);
      plot(G1)
      
      % 函数graph(s,t,w):可在 s 和 t 中的对应节点之间以w的权重创建边,并生成一个图
      G2 = graph(s2, t2);
      plot(G2, 'linewidth', 2) % 设置线的宽度
      
      % 下面的命令是在画图后不显示坐标
      set( gca, 'XTick', [], 'YTick', [] );
      
    • 有向图:只需将graph改为digraph即可。

三、权重邻接矩阵

1. 无向图的权重邻接矩阵

  • 结论:
    • (1)无向图对应的权重邻接矩阵D是一个对称矩阵;
    • (2)其主对角线上元素为0.
    • (3)Dij表示第i个节点到第j个节点的权重

在这里插入图片描述

2. 有向图的权重邻接矩阵

  • 结论:
    • (1)有向图对应的权重邻接矩阵D是一般不再是对称矩阵
    • (2)其主对角线上元素为0.
    • (3)Dij表示第i个节点到第j个节点的权重

在这里插入图片描述


四、迪杰斯特拉

  • 用途:求解最短路径(有向图和无向图均可处理,但实际问题中无向图更常见)
  • 缺点:无法处理负权重的图
    • 能处理负权重的算法:贝尔曼-福特算法
    • 贝尔曼-福特算法和dj算法区别:不再将节点区分为是否已访问的状态,因为贝尔曼‐福特模型是利用循环来进行更新权重的,且每循环一次,贝尔曼福特算法都会更新所有的节点的信息。
      • 贝尔曼‐福特算法实际上处理的是具有负权重的有向图。(且该有向图也不能含有负权回路)
      • 缺点:贝尔曼‐福特算法不支持含有负权回路的图。(Floyd弗洛伊德算法也不可以)

4.1 负权回路

  • 图中存在绕一圈权值之和为负数的回路
  • 含有负权重的无向图都是负权回路,如下图中(可以在2和3之间无限循环)
    在这里插入图片描述
  • 不必太担心算法求解不出的问题:因为含有负权重的图特别少见,且一旦出现负权重,也往往是在有向图中。

4.2 Matlab计算最短路径

4.2.1 返回起点到终点的最短距离
  • 代码:[P,d] = shortestpath(G,start,end [,'Method',algorithm] )

    • 注意:该函数matlab2015b之后才有

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

    • 输入参数:

      • ① G ‐ 输入图(graph 对象 | digraph 对象)
      • ② start 起始的节点
      • ③ end 目标的节点
      • ④ [,‘Method’,algorithm]是可选的参数,表示计算最短路径的算法。一般不用手动设置,默认使用的是“auto”, 具体可设置的参数如下图。
        在这里插入图片描述
    • 输出参数:

      • ① P – 最短路径经过的节点
      • ② d – 最短距离
  • Matlab演示

    • 具体代码部分见第八节代码文件code.m
      在这里插入图片描述
    • △注意:
      • Matlab中的图节点要从1开始编号,故上图中把0全部改为了9
      • 编号最好是从1开始连续编号,不要随便定义编号
  • Matlab返回起点至终点最短路径结果:在这里插入图片描述

4.2.2 Matlab返回任意两点间最短路径
  • 代码: d = distances(G [,'Method',algorithm])

在这里插入图片描述

4.2.3 找给定范围内所有的点
  • 代码:[nodeIDs,dist] = nearest(G,s,d [,'Method',algorithm])
    • 返回图形 G 中与节点 s 的距离在 d 之内的所有节点。
    • nodeIDs是符合条件的节点
    • Dist是这些节点与s的距离
      在这里插入图片描述

五、课后论文作业

在这里插入图片描述


附言

  • 参考课程可见 B站清风数模,如上仅作个人学习后笔记整理。

猜你喜欢

转载自blog.csdn.net/SHIE_Ww/article/details/131968309