首页 > 编程语言 >求两点间最短路的Dijkstra算法及其matlab程序详解

求两点间最短路的Dijkstra算法及其matlab程序详解

时间:2024-08-30 10:54:10浏览次数:13  
标签:标号 temp 短路 pb Dijkstra matlab 顶点 index1 tb

#################本文为学习《图论算法及其MATLAB实现》的学习笔记#################

设源点为 u 0 u_{0} u0​,目标点为 v 0 v_{0} v0​。

Dijkstra算法的基本思想

按距离 u 0 u_{0} u0​ 由近及远为顺序,依次求得 u 0 u_{0} u0​ 到 G 的各顶点的最短路和距离,直至 v 0 v_{0} v0​ (或直至 G 的所有顶点),算法结束。

为避免重复并保留每一步的计算信息,采用了标号算法

Dijkstra算法

在这里插入图片描述

程序参数说明

A: 图的权值矩阵
d: 所求最短路的权和
index1: 标号顶点顺序
index2: 标号顶点索引

算法的matlab程序详解
function [ d ,index1 ,index2 ] = Dijkf( A )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%% 两点间最短路的Dijkstra算法 %%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%% 输入:     A: 图的权值矩阵 
%%%%%%%%% 输出:     d: 所求最短路的权和
%%%%%%%%%       index1: 标号顶点顺序
%%%%%%%%%       index2: 标号顶点索引
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%% 参数初始化 %%%%%%%%%%%%
M = max(max(A));        % 返回 A 中最大值,即图中权值最大的边
pb(1:length(A)) = 0;    % pb 为维度为 a 顶点数的全零数组
pb(1) = 1;
index1 = 1;
index2 = ones(1,length(A));     % index2 为维度为图顶点数的全1数组
d(1:length(A)) = M;     % d 为维度为图顶点数,值全为最大边权值的数组
d(1) = 0;
temp = 1;

%%%%%%%%%%% 更新l(v)同时记录顶点索引和顺序 %%%%%%%%%%%
% 重复步骤2,直到满足条件
while sum(pb) < length(A)       % 检验 pb 元素和(即已标号顶点数)是否小于顶点数
    tb = find(pb == 0);         % tb 为 pb 中零元素的索引值,即未标号的顶点
    d(tb) = min(d(tb),d(temp) + A(temp,tb));    % 更新l(v),即与当前顶点相邻的顶点的标号{标号取(当前顶点标号值与相邻顶点之间的边权值的和,相邻顶点标号值)的最小值}
    tmpb = find(d(tb) == min(d(tb)));           % 返回与当前顶点最近的顶点在 tb 中的索引值
    temp = tb(tmpb(1));         % 返回与当前顶点最近的顶点(未访问过)
    pb(temp) = 1;               % 将新的顶点写入访问队列
    index1 = [index1,temp];     % 将新顶点写入最短路路径中,即记录标号顺序
    index = index1(find(d(index1) == d(temp) - A(temp,index1)));
    if length(index) >= 2       % 判断 index 元素个数是否大于2
        index = index(1);
    end
    index2(temp) = index;       % 记录标号索引
end

d;
index1;
index2;

标签:标号,temp,短路,pb,Dijkstra,matlab,顶点,index1,tb
From: https://blog.csdn.net/weixin_72217561/article/details/141711904

相关文章

  • 基于奇异值分解的MVDR算法功率谱估计附Matlab代码
    MVDR(MinimumVarianceDistortionlessResponse)算法是一种常用于信号处理领域的功率谱估计方法,该算法利用奇异值分解(SingularValueDecomposition,SVD)来实现对信号的空间滤波,从而提高功率谱估计的准确性和可靠性,本文将介绍MVDR算法的原理并提供使用Matlab编写的源代码示例。MV......
  • FSK调制的MATLAB源码程序
    以下是一个用MATLAB编写的FSK调制源码程序示例:%清空工作区和命令窗口clear;clc;%定义基本参数fs=1000;%采样率T=1;%总传输时间t=0:1/fs:T-1/fs;%时间向量f1=100;%第一个频率f2=200;%第二个频率%定义消息信号message=[01011......
  • 【机器人学】7-3.六自由度机器人自干涉检测-圆柱体的旋转变换【附MATLAB代码】
        前言        上一章确定了机械臂等效的圆柱体的上下圆心坐标,这篇文章将解决算法三个核心中的第二个核心:        一 根据机械臂的几何数据以及DH参数,确定机械臂等效的圆柱体的上下圆心坐标。        二 将一个圆柱......
  • Comsol&Matlab 扩张式消声器理论解及仿真解
    简单扩张式消声器是工业中广泛采用的一类抗性消声器。扩张式消声器是一种常见的声学装置,用于减少噪音和消除声音的回声。它通常由一系列管道和腔体组成,通过利用声波的传播特性来实现消声效果。扩张式消声器的工作原理基于声波的干涉和相消干涉。当声波进入消声器的管道时,管道......
  • Comsol&Matlab 两级串联扩张式消声器仿真解与解析解
        消声器的声学性能通常要求消声器在工作频率范围内有较大的消声量以及较宽的消声频带。常用的消声器声学性能评价指标通常有传递损失、插入损失、减噪量三种。其中插入损失只能反映整个系统在安装消声器前后声学特性的变化,并不能直接反映消声器本身单独具有的属性。减......
  • 【路径规划】模糊神经车辆路径规划控制【含Matlab源码 7366期】
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • 【四旋翼】四旋翼无人机的几何跟踪控制(含速度和加速度误差)【含Matlab源码 7380期】
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • 基于PSO粒子群算法的三角形采集堆轨道优化matlab仿真
    1.程序功能描述假设一个收集轨道,上面有5个采集堆,这5个采集堆分别被看作一个4*20的矩阵(下面只有4*10),每个模块(比如:A31和A32的元素含量不同),为了达到采集物品数量和元素含量的要求(比如:需采集5吨和某元素单位质量在65与62之间),求出在每个4*20的矩阵中哪个模块被拿出可以达到要求......
  • 基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) 将usb摄像头对准一个播放不同水果图片的显示器,然后进行识别,识别结果如下:  本课题中,使用的USB摄像头为:   2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频) 程......
  • 信道编码——线性分组码(Hamming、BCH、RS)Matlab编译码实现与性能分析
    目录第六篇博客感言编译码原理Hamming码BCH码RS码Matlab源码和运行结果源码结果Hamming码BCH码RS码 总结第六篇博客感言坚持写,及时写。编译码原理Hamming码参考汉明码——计算机网络——全网最通俗的讲解-CSDN博客。BCH码参考【举例子详细分析】BCH码(BC......