最短路问题的基本内容

最短路问题研究的是,在一个点与点之间连接形成的网络图中,对应路径赋予一定的权重(可以理解为两点之间的距离),计算任意两点之间如何和走,路径最短的问题。在这里的距离可以理解成各种两点之间某种任务的开销。

网络图

模型调用

解决最短路问题,一般可采取 dijkstra 或者floyd 这两种模型,模型调用形式如下:

  1. [mydist,mypath]=mydijkstra(a,sb,db) % dijkstra模型
  2. [mydist,mypath]=myfloyd(a,sb,db) % floyd模型

其中,

  • a 为邻接矩阵
  • sb 为起点标号
  • db 为终点标号
  • mydist 为最短路径长度
  • mypath 为最短路径

模型完整代码

Dijkstra 模型代码

  1. function [mydistance,mypath]=mydijkstra(a,sb,db);
  2. % 输入:a—邻接矩阵,aij)是指ij之间的距离,可以是有向的
  3. % sb—起点的标号, db—终点的标号
  4. % 输出:mydistance—最短路的距离, mypath—最短路的路径
  5. n=size(a,1); visited(1:n) = 0;
  6. distance(1:n) = inf; distance(sb) = 0; %起点到各顶点距离的初始化
  7. visited(sb)=1; u=sb; %u为最新的P标号顶点
  8. parent(1:n) = 0; %前驱顶点的初始化
  9. for i = 1: n-1
  10. id=find(visited==0); %查找未标号的顶点
  11. for v = id
  12. if a(u, v) + distance(u) < distance(v)
  13. distance(v) = distance(u) + a(u, v); %修改标号值
  14. parent(v) = u;
  15. end
  16. end
  17. temp=distance;
  18. temp(visited==1)=inf; %已标号点的距离换成无穷
  19. [t, u] = min(temp); %找标号值最小的顶点
  20. visited(u) = 1; %标记已经标号的顶点
  21. end
  22. mypath = [];
  23. if parent(db) ~= 0 %如果存在路!
  24. t = db; mypath = [db];
  25. while t ~= sb
  26. p = parent(t);
  27. mypath = [p mypath];
  28. t = p;
  29. end
  30. end
  31. mydistance = distance(db);

Floyd 模型代码

  1. function [dist,mypath]=myfloyd(a,sb,db);
  2. % 输入:a—邻接矩阵,元素(aij)是顶点ij之间的直达距离,可以是有向的
  3. % sb—起点的标号;db—终点的标号
  4. % 输出:dist—最短路的距离;% mypath—最短路的路径
  5. n=size(a,1); path=zeros(n);
  6. for k=1:n
  7. for i=1:n
  8. for j=1:n
  9. if a(i,j)>a(i,k)+a(k,j)
  10. a(i,j)=a(i,k)+a(k,j);
  11. path(i,j)=k;
  12. end
  13. end
  14. end
  15. end
  16. dist=a(sb,db);
  17. parent=path(sb,:); %从起点sb到终点db的最短路上各顶点的前驱顶点
  18. parent(parent==0)=sb; %path中的分量为0,表示该顶点的前驱是起点
  19. mypath=db; t=db;
  20. while t~=sb
  21. p=parent(t); mypath=[p,mypath];
  22. t=p;
  23. end

案例演示

对于上面的网络图,求解从 A 到 D 的最短路径。

整理邻接矩阵

首先整理出点与点之间连接关系,得出邻接矩阵。

假设点的排序为:

点位 A B1 B2 C1 C2 C3 D
序号 1 2 3 4 5 6 7

整理出 7*7 邻接矩阵:

完整代码

  1. % 构造邻接矩阵
  2. a = zeros(7);
  3. a(1,2) = 2; a(1,3) = 4;
  4. a(2,4) = 3; a(2,5) = 3; a(2,6) = 1;
  5. a(3,4) = 2; a(3,5) = 3; a(3,6) = 1;
  6. a(4,7) = 1;
  7. a(5,7) = 3;
  8. a(6,7) = 4;
  9. a = a + a';
  10. a(a==0) = inf; % 零元素换成inf
  11. a(eye(7,7)==1)=0; % 对角线换成 0
  12. [mydist1,mypath1]=mydijkstra(a,1,7) % dijkstra模型求解
  13. [mydist2,mypath2]=myfloyd(a,1,7) % floyd 模型求解

运行结果

  1. mydist1 =
  2. 6
  3. mypath1 =
  4. 1 2 4 7
  5. mydist2 =
  6. 6
  7. mypath2 =
  8. 1 2 4 7

将序号还原成点位,即最短路径为 A → B1 → C1 → D

Matlab 图论最短路问题模型代码的更多相关文章

  1. Matlab 非线性规划问题模型代码

    非线性规划问题的基本内容 非线性规划解决的是自变量在一定的非线性约束或线性约束组合条件下,使得非线性目标函数求得最大值或者最小值的问题. 当目标函数为最小值时,上述问题可以写成如下形式: \[ \mi ...

  2. Matlab 线性规划问题模型代码

    线性规划问题的基本内容 线性规划解决的是自变量在一定的线性约束条件下,使得线性目标函数求得最大值或者最小值的问题. \[ \min z=\sum_{j=1}^{n} f_{j} x_{j} \] \[ ...

  3. Matlab 模拟退火算法模型代码

    function [best_solution,best_fit,iter] = mySa(solution,a,t0,tf,Markov) % 模拟退化算法 % ===== 输入 ======% % ...

  4. Matlab 整数线性规划问题模型代码

    整数线性规划问题的基本内容 整数线性规划解决的是自变量在一定的线性约束条件下,使得线性目标函数求得最大值或者最小值的问题.其中自变量只能取整数.特别地,当自变量只能取0或者1时,称之为 0-1 整数规 ...

  5. [原创] Matlab 指派问题模型代码

    指派问题的基本内容 一般来说指派问题解决的是如何将任务分配到人,使得任务完成的效益最大化(成本型效益则求最小值,利润型效益则求最大值).上述问题一个 0 - 1 整数规划问题. 问题围绕着任务和人展开 ...

  6. MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. 使用MATLAB Coder产生代码的3个步骤: 准备用于产生代码的MATLAB算法: 检查MATLAB代 ...

  7. 转 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. http://www.mathworks.cn/products/matlab-coder/ 使用MATL ...

  8. 多路复用I/O模型poll() 模型 代码实现

    多路复用I/O模型poll() 模型 代码实现 poll()机制和select()机制是相似的,都是对多个描述符进行轮询的方式. 不同的是poll()没有描述符数目的限制. 是通过struct pol ...

  9. Windows Socket五种I/O模型——代码全攻略(转)

    Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模式.可以通过多线程技术进行处理. 非阻塞模式:执行I/O操 ...

随机推荐

  1. JavaScript的垃圾回收机制与内存泄漏

    常用的两种算法: 引用计数(新版浏览器已弃用,弃用原因:会出现循环引用的情况,无法进行垃圾回收,导致内存泄漏) 标记清除 引用计数法 引用计数,顾名思义一个对象是否有指向它的引用,即看栈中是否有指向要 ...

  2. hbase rowkey 设计

    HBase中的rowkey是按字典顺序排序的,通过rowkey查询可以对千万级的数据实现毫秒级响应.然而,如果rowkey设计不合理的话经常会出现一个很普遍的问题----热点.当大量client的请求 ...

  3. MySQL隔离性及Spring事务

    一.数据库事务ACID特性 必须要掌握事务的4个特性,其中事务的隔离性之于MySQL,对应4级隔离级别. 原子性(Atomicity): 事务中的所有原子操作,要么都能成功完成,要么都不完成,不能停滞 ...

  4. random库的使用

    一.random库介绍 random库是使用随机数的Python标准库 伪随机数:采用梅森旋转算法生成的(伪)随机序列中元素 random库主要用于生成随机数 使用random库:import ran ...

  5. C#_HttpWebRequest保存cookies模拟登录的方法

    CookieContainer cookies = new CookieContainer(); string url = "http://www.google.com.hk/"; ...

  6. OpenCV学习笔记(一)、VS2015+OpenCV-4.1.1环境配置(Windows10)

    1.登陆OpenCV官网,点击打开Releases,会看到各个版本的OpenCV安装文件,选择自己想要的版本下载即可.下载网址:https://opencv.org/releases/ 2.配置环境变 ...

  7. 终于跑通分布式事务框架tcc-transaction的示例项目

    1.背景 前段时间在看项目代码的时候,发现有些接口的流程比较长,在各个服务里面都有通过数据库事务保证数据的一致性,但是在上游的controller层并没有对一致性做保证. 网上查了下,还没找到基于Go ...

  8. Angular Material 的设计之美

    前言 Angular Material 作为 Angular 的官方组件库,无论是设计交互还是易用性都有着极高的质量.正如官方所说其目的就是构建基于 Angular 和 Typescript 的高质量 ...

  9. HTML(一)简介,元素

    HTML简介 html实例: <!DOCTYPE html> 菜鸟教程 我的第一个标题 我的第一个段落 实例解析: <!DOCTYPE html> 声明为 HTML5 文档,不 ...

  10. CodeForces Educational Codeforces Round 51 (Rated for Div. 2)

    A:Vasya And Password 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen(&q ...