最短路径算法dijkstra的matlab实现

   2023-02-09 学习力0
核心提示:function Dijkstra(Graph, source): 2 3      create vertex set Q 4 5      for each vertex v in Graph:             // Initialization 6          dist[v] ← INFINITY                  // Unknown distance from source
  1. function Dijkstra(Graph, source):

     2

     3      create vertex set Q

     4

     5      for each vertex v in Graph:             // Initialization

     6          dist[v] ← INFINITY                  // Unknown distance from source to v

     7          prev[v] ← UNDEFINED                 // Previous node in optimal path from source

     8          add v to Q                          // All nodes initially in Q (unvisited nodes)

     9

    10      dist[source] ← 0                        // Distance from source to source

    11      

    12      while Q is not empty:

    13          u ← vertex in Q with min dist[u]    // Source node will be selected first

    14          remove u from Q 

    15          

    16          for each neighbor v of u:           // where v is still in Q.

    17              alt ← dist[u] + length(u, v)

    18              if alt < dist[v]:               // A shorter path to v has been found

    19                  dist[v] ← alt 

    20                  prev[v] ← u 

    21

    22      return dist[], prev[]

  2.  

    程序运行在matlab 7.0正常,1为出发节点,有向图的结构如下:

    最短路径算法dijkstra的matlab实现
  3.  

    这里是我写的matlab程序。

    %初始化

    MAXNUM=5;

    MAXINT=32767;

    dij=MAXINT*ones(MAXNUM,MAXNUM);

    dij(1,2)=10;

    dij(1,4)=30;

    dij(1,5)=100;

    dij(2,3)=50;

    dij(3,5)=10;

    dij(4,3)=20;

    dij(4,5)=60;

    dij(1,1)=0;

    dij(2,2)=0;

    dij(3,3)=0;

    dij(4,4)=0;

    dij(5,5)=0;

     

    V=1:MAXNUM;%全部节点

    S=[1];%已分配节点

    m=1;%过渡节点

    ite=2;

    U=2:MAXNUM;%未分配的节点

    %重复,直到U为空

    %将U中的节点不断添加到S中,同时记录过渡节点和最短路径

    dist=dij(1,:);%节点1到其它节点的初始距离值,每次迭代更新一次

    dist1=dist;

    while(length(U)>0)

    dist1(dist1==min(dist1))=[]; %已分配的节点对应的距离从dist1中删除

    m=find(dist==min(dist1));%记录dist1当前的最小值在dist中的下标

    S(ite)=m;%将过渡节点加入S

    U(find(U==m))=[];%将过渡节点从U中删除

    %比较1经过m与不经过m到未分配节点的距离,dist中的距离更新为较小者

    for u=1:length(U)

        if(dist(m)+dij(m,U(u))<dist(U(u)))

            dist1(find(dist1==dist(U(u))))=dist(m)+dij(m,U(u));%dist1中的值同步更新

            dist(U(u))=dist(m)+dij(m,U(u));

        end

    end

    ite=ite+1;

    end

    %保存到每个节点的最短路径,每行对应每个节点的路径和最短距离,其实就是将S逆序输出

     path(1,1)=1;

    for node=2:MAXNUM

        location=find(S==node);

        path(node,1)=node;

        i=2;

        for s=location:-1:2

            if(dij(S(s-1),S(s))~=MAXINT)

             path(node,i)=S(s-1);

             i=i+1;

            end

        end

        path(node,i)=dist(node);

    end

    %TODO:程序中用到了find()方法,这是一个bug,find可能会返回不止一个值,取其中任意一个就行。      

     

    参考----http://www.wutianqi.com/?p=1890

    或者

    https://blog.csdn.net/cxllyg/article/details/7604812 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何在Abaqus的python中调用Matlab程序
    目录1. 确定版本信息2. 备份python3. 设置环境变量4. 安装程序5. 调试运行参考资料Abaqus2018操作系统Win10 64位Python版本2.7(路径C:\SIMULIA\CAE\2018\win_b64\tools\SMApy\python2.7)2. 备份python将上述的“python2.7”文件夹复制出来,避免因操作错误
    03-16
  • 如何将极坐标数据转换为笛卡尔坐标系并绘制[MATLAB]
    如何将极坐标数据转换为笛卡尔坐标系并绘制[MAT
    你想做的事考虑根据与原点的距离 $r$ 和 $xy$ 平面上的角度 $heta$ 绘制数据 $P(r, heta)$。例如,雷达获取的信号包含有关目标范围 $r$ 和方位角 $heta$ 的信息。就是下图。在本文中,$heta$ 是从 $x$ 轴测量的角度。显示示例考虑创建依赖于 $r, heta$ 的虚拟
    03-16
  • 【MATLAB与机械设计】一维优化进退法确定初始区间
    【MATLAB与机械设计】一维优化进退法确定初始区
    在讨论一维搜索时,首先保证搜索区间函数具有单峰性,也就是在区间[a,b]中函数是凸函数,对于求极小值问题,函数值具有高—低—高的特性,在区间[a,b]上有唯一的最小值。1,方法的建立2.进退法确定搜索区间的程序框图3,根据上述的程序框图,编写的MATLAB程序
    03-08
  • 用于微型四轮驱动的 6T 小齿轮原型和使用 MATLAB 的 FEM 结构分析
    用于微型四轮驱动的 6T 小齿轮原型和使用 MATLA
    介绍我使用迷你 4WD 套件使用 Raspberry Pi 制作机器人汽车。定制零件丰富且方便,因为它们在附近的商店很容易买到。但是,由于Mini 4WD的速度非常快,因此在低速时很难控制速度。因此,我使用 3D 打印机制作了自己的 6T 小齿轮,并尝试改变齿轮比。 成型小齿
    03-08
  • ROS与Matlab系列:一个简单的运动控制 基于matl
    转自:http://blog.exbot.net/archives/2594Matlab拥有强大的数据处理、可视化绘图能力以及众多成熟的算法函数,非常适合算法开发;在控制系统设计中,Simulink也是普遍使用的设计和仿真工具。而ROS系统,则是一种新的标准化机器人系统软件框架。通过ROS,你
    02-10
  • matlab 遍历结构体struc的成员
    MATLAB中专门用于对结构数组的操作的函数并不多,通过 help datatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要如表4.3.1所示。表4.3.1 结构数组的操作函数函数名             功能描述 deal                 把输入处
    02-09
  • 02-09
  • schroeder reverb matlab实现
    schroeder reverb matlab实现
    原理参考:Natural sounding artificial reverberation combFilter.m:function output = combFilter(delay, gain, input)fs = 48000;delaySample = int32(delayTime * fs / 1000);B = [1 zeros(1, delaySample - 1)];A=[1 zeros(1, delaySample - 2) -gain];
    02-09
  • C/C++中调用matlab引擎计算 matlab转c
    原帖地址:http://blog.sina.com.cn/s/blog_6adcb3530101cvot.html一,在linux环境使用matlab引擎必须先进行一些必要的配置1,matlab引擎依赖/bin/csh启动,所以不管你使用何种shell,都必须安装csh。**2,matlab引擎依赖的动态库文件目录必须在系统当前的
    02-09
  • MATLAB 图像放大/缩小,双线性插值
    MATLAB 图像放大/缩小,双线性插值
    半年前写过matlab最邻近插值的图像缩放,没怎么考虑边界问题。更早之前用Opencv写过双线性插值图像放大,不过写的比较混乱。所以这里用matlab重新再清楚的写一遍。 1 close all; 2 clear all; 3 clc; 45 m=1.8;%放大或缩小的高度 6 n=2.3;%放大或缩小的宽度 7
    02-09
点击排行