【基于MATLAB的dijkstra算法】

news2024/11/16 11:42:31

基于MATLAB的dijkstra算法

%姓名:马伟
%日期:20236月七号
%作业:通信网理论,最小路径树D算法
function [distances, paths, tree] = dijkstra(graph, startNode)
    numNodes = size(graph, 1);
    distances = inf(1, numNodes);
    visited = false(1, numNodes);
    previous = zeros(1, numNodes);

    distances(startNode) = 0;
    tree = cell(1, numNodes);

    while sum(visited) < numNodes
        minDistance = inf;
        currentNode = -1;

        for node = 1:numNodes
            if ~visited(node) && distances(node) < minDistance
                minDistance = distances(node);
                currentNode = node;
            end
        end

        if currentNode == -1
            break;
        end

        visited(currentNode) = true;

        for neighbor = 1:numNodes
            if graph(currentNode, neighbor) > 0 && graph(currentNode, neighbor) ~= inf
                newDistance = distances(currentNode) + graph(currentNode, neighbor);
                if newDistance < distances(neighbor)
                    distances(neighbor) = newDistance;
                    previous(neighbor) = currentNode;
                    % 记录树边
                    tree{neighbor} = [currentNode, neighbor];
                end
            end
        end
    end

    paths = cell(1, numNodes);
    for i = 1:numNodes
        paths{i} = reconstructPath(previous, i);
    end
end

function path = reconstructPath(previous, endNode)
    path = [];
    currentNode = endNode;
    while currentNode ~= 0
        path = [currentNode, path];
        currentNode = previous(currentNode);
    end
end

测试代码


clc;
clear all;
% 邻接矩阵
graph = [0 9 1 3 inf inf;
         1 0 4 inf 7 inf;
         2 inf 0 inf 1 inf;
         inf inf 5 0 2 7;
         inf 6 2 8 0 5;
         7 inf 2 inf 2 0];


numNodes = size(graph, 1);
startNode = 1;
% 运行 Dijkstra 算法
[distances, paths, tree] = dijkstra(graph, startNode);

% 构建边列表和权重列表
% 构建边列表和权重列表
edges = [];
weights = [];
for i = 1:numNodes
    if ~isempty(tree{i})
        edges = [edges; tree{i}];
        weights = [weights; graph(tree{i}(1), tree{i}(2))];
    end
end

% 创建有向图对象
g = digraph(edges(:, 1), edges(:, 2));

% 绘制图形
figure ;
h = plot(g, 'Layout', 'layered');
title("Shortest path using Dijkstra By 马伟")

% 设置节点和边的标签
nodeLabels = cellstr(num2str((1:numNodes)', 'V%d'));
h.NodeLabel = nodeLabels;
h.EdgeLabel = cellstr(num2str(weights, '%g'));

% 设置节点和边的颜色
h.NodeColor = 'r';
h.EdgeColor = 'b';

% 显示最短路径和迭代过程中的节点情况
disp('V1节点到各个节点的最短路径:');
disp('迭代过程中的节点情况如下所示:');
for i = 1:numNodes
    disp("------------------------------")
    disp(['{ V', num2str(startNode),' }', ' 到 { V', num2str(i), ' }',':']);
    disp(['路过的节点为: ', num2str(paths{i})]);
    disp(['总体权重: ', num2str(distances(i))]);
 

end
%系统画图(原图)-------------------------------------
% 创建有向图对象
G = digraph(graph, 'omitselfloops');

% 绘制连通图
figure;
h = plot(G, 'Layout', 'layered');
title("original graph having igonored 'inf' edges")
% 设置节点和边的标签
numNodes = size(graph, 1);
nodeLabels = cellstr(num2str((1:numNodes)', 'V%d'));
h.NodeLabel = nodeLabels;

% 设置节点和边的颜色
h.NodeColor = 'r';
h.EdgeColor = 'b';


%系统画图(最小路径树)-------------------------------------

% 创建有向图对象
G = digraph(graph, 'omitselfloops');

% 计算从 V1 节点到其他节点的最短路径
startNode = 1;
numNodes = size(graph, 1);
shortestPaths = cell(1, numNodes);
for i = 1:numNodes
    shortestPaths{i} = shortestpath(G, startNode, i);
end

% 构建最小路径树的边列表
edges = zeros(0, 2);
for i = 1:numNodes
    path = shortestPaths{i};
    for j = 1:length(path) - 1
        % 只添加从 V1 节点到其他节点的最短路径中的边
        if ~ismember([path(j), path(j + 1)], edges, 'rows')
            edges = [edges; path(j), path(j + 1)];
        end
    end
end

% 创建最小路径树的有向图对象
tree = digraph(edges(:, 1), edges(:, 2));

% 绘制最小路径树
figure;
h = plot(tree, 'Layout', 'layered');
title("Matlab bulit-in Dijkstra")
% 设置节点和边的标签
nodeLabels = cellstr(num2str((1:numNodes)', 'V%d'));
h.NodeLabel = nodeLabels;

% 设置节点和边的颜色
h.NodeColor = 'r';
h.EdgeColor = 'b';

V1节点到各个节点的最短路径:
迭代过程中的节点情况如下所示:

{ V1 } 到 { V1 }:
路过的节点为: 1
总体权重: 0

{ V1 } 到 { V2 }:
路过的节点为: 1 3 5 2
总体权重: 8

{ V1 } 到 { V3 }:
路过的节点为: 1 3
总体权重: 1

{ V1 } 到 { V4 }:
路过的节点为: 1 4
总体权重: 3

{ V1 } 到 { V5 }:
路过的节点为: 1 3 5
总体权重: 2

{ V1 } 到 { V6 }:
路过的节点为: 1 3 5 6
总体权重: 7
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全怎么学?学习路线资料分享

一.自己对网络安全的理解 安全其实有很多个方向&#xff0c;从大的方面来说&#xff0c;也就是测试和开发。测试&#xff0c;细分下来&#xff0c;又有渗透&#xff08;也就是所谓的web&#xff09;&#xff0c;逆向&#xff08;也就是所谓的二进制&#xff0c;主要是代码审计方…

YUM报错No module named yum处理

一、问题描述 某次GreenPlum集群部署过程中&#xff0c;现场人员反馈&#xff0c;yum命令无法使用了&#xff0c;执行报错&#xff1a;No module named yum&#xff0c;如下所示&#xff1a; 相关资料&#xff1a;YUM 二、问题分析处理 2.1 YUM的本质 yum命令本质上是属于py…

泛微信创办公平台,低代码构建丰富应用,满足多种需求

信创已经成为了国家的战略规划&#xff0c;自2022年起&#xff0c;国家已全面推动国资企业的信创改造工作&#xff0c;要求到2027年底&#xff0c;对综合办公、经营管理、生产运营等系统实现“应替尽替、能替则替”。其中&#xff0c;门户、OA、邮件、档案、党群、纪检监察等综…

7年时间,从功能测试到测试开发,和大家聊聊如何突破职业瓶颈?少走弯路

突破自己的技术瓶颈并不是一蹴而就&#xff0c;还是需要看清楚一些东西&#xff0c;这里也有一些经验和见解跟大家分享一下。同样是职场人士&#xff0c;我也有我的经历和故事。在工作期间&#xff0c;我有过2年加薪5次的小小“战绩”&#xff08;同期进入公司的员工&#xff0…

28岁,从字节退休了···

大厂一直是每个程序员都向往职业目标&#xff0c;大厂意味着薪资高、福利好、倍有面儿&#xff0c;而且发展空间也大。甚至有人调侃不想进大厂的程序员不是好程序员。 而在网上&#xff0c;也有各个网友分享自己在大厂的经历&#xff0c;在某平台还有一个近2600万浏览的话题&a…

度晓晓再战高考:百度“AI伙伴”助阵,人均学霸时代来了

6月7日&#xff0c;高考首日&#xff0c;AI 挑战高考语文的新闻刷屏。 在一场关于高考直播的中&#xff0c;百度搜索正在内测的“AI 伙伴”现场挑战高考语文考试&#xff0c;包括作文、微写作、古诗词赏析、文言文翻译、阅读填空等题型。一篇文言文作文甚至迷惑了资深语文老师庄…

永善公司招聘网络红人主播,高薪招募线上策略娱乐主播

永善公司招聘网络红人主播&#xff0c;高薪招募线上策略娱乐主播#主播#高薪职业#直播 招聘 公司直招网络主播多名&#xff01; 直播平台&#xff1a;抖音、酷狗 不收任何费用 没有经验也没有关系只要你有梦想&#xff0c;只要你肯努力并 且有一颗想发大财的野心&#xff…

父母在家千万注意别打开“共享屏幕”,银行卡里的钱一秒被转走......

打开屏幕共享&#xff0c;差点直接被转账 今天和爸妈聊天端午回家的事情&#xff0c;突然说到最近AI诈骗的事情&#xff0c;千叮咛万嘱咐说要对方说方言才行&#xff0c;让他们充分了解一下现在骗子诈骗的手段&#xff0c;顺便也找了一下骗子还有什么其他的手段&#xff0c;打…

【Clickhouse】ReplaceingMergeTree引擎final实现合并去重探索 | 京东云技术团队

前言 在OLAP实践中&#xff0c;在有数据更新的场景中&#xff0c;比如存储订单数据&#xff0c;我们经常会用到ReplaceingMergeTree引擎来去重数据&#xff0c;以获取数据的最新状态。但是ReplaceingMergeTree引擎实现数据的去重合并的操作是异步的&#xff0c;这样在实际查询…

人事项目开发记录2

项目构建 前端项目构建 Vue项目使用webpack来构建。首先确保本地已经安装了NodeJS&#xff0c;然后在CMD中执行如下命令&#xff0c;可以创建并启动一个名为vuehr的前端项目&#xff1a; 在执行“vue init webpack vuehr”命令时&#xff0c;会要求依次输入项目的基本信息&…

核心领域的数字基建梳理

数字基建&#xff1a;新基建的核心 数字基建是数字经济发展的重要底座&#xff0c;《“十四五”数字经济发展规划》的首要重要任务就是“优化升级数字基础设施”&#xff0c;并提出要建设高速泛在、天地一体、云网融合、智能敏捷、绿色低碳、安全可控的智能化综合性数字信息基…

如何有效避免项目需求蔓延?

如何有效避免项目需求蔓延&#xff1f;6种措施&#xff1a; 1、确定项目范围 &#xff08;1&#xff09;确定范围基线 在项目目标明确的基础上&#xff0c;所有干系人在完全了解项目需求后&#xff0c;建立需求范围基线&#xff08;项目范围说明书、工作分解结构WBS、WBS字典&a…

关于矿井地面电力综合自动化系统的研究与产品选型

摘要&#xff1a;煤矿供电系统是煤矿生产的重要动力保障 , 一旦电力中断 , 生产将被迫停止 , 同时停电后容易发生瓦斯积聚爆炸、淹井等恶性事故&#xff0c;现有配电室采用不同厂商的保护装 置产品&#xff0c;没有形成有效的监控配电系统&#xff0c;不便于管理和实现无人值守…

CSS中scope和scoped区别

前言 在css的发展中&#xff0c;涌现了大量的新的特性和专有名词。 scope scope 是 CSS 中的一个伪类选择器&#xff0c;表示当前规则所在元素&#xff0c;它可以用于限定元素选择器的范围。在常规的 CSS 中&#xff0c;所有的选择器都是全局的&#xff0c;即它们适用于文档…

Mybatis的parameterType造成线程阻塞问题分析 | 京东云技术团队

一、前言 最近在新发布某个项目上线时&#xff0c;每次重启都会收到机器的 CPU 使用率告警&#xff0c;查看对应监控&#xff0c;持续时长达 5 分钟&#xff0c;对于服务重启有很大风险。而该项目有非常多 Consumer 消费&#xff0c;服务启动后会有大量线程去拉取消息处理逻辑…

【网络安全】学习路线和资料分享

一.自己对网络安全的理解 安全其实有很多个方向&#xff0c;从大的方面来说&#xff0c;也就是测试和开发。测试&#xff0c;细分下来&#xff0c;又有渗透&#xff08;也就是所谓的web&#xff09;&#xff0c;逆向&#xff08;也就是所谓的二进制&#xff0c;主要是代码审计方…

uniapp(四) 之还原网络请求以及接口封装

通过uniapp官网&#xff0c;不难发现简单的接口请求格式 uni.request({url: https://www.example.com/request, //仅为示例&#xff0c;并非真实接口地址。data: {text: uni.request},header: {custom-header: hello //自定义请求头信息},success: (res) > {console.log(re…

零基础想学黑客?推荐你了解一下Kali Linux!(建议收藏)

最近好多朋友问我&#xff1a;不会编程&#xff0c;英语也不好&#xff0c;dos命令也记不住&#xff0c;能学习黑客技术么&#xff1f; 我可以明确告诉大家&#xff0c;可以的&#xff01; 相信每一个少年心中&#xff0c;曾经都有过一个黑客梦&#xff01; 有人觉得黑客霸气…

5.1 合并数据

5.1 合并数据 5.1.1 堆叠合并数据1、横向堆叠 concat()2、纵向堆叠 concat()和append() 5.1.2 主键合并数据 merge()和join()5.1.3 重叠合并数据 combine_first() 5.1.1 堆叠合并数据 堆叠就是简单地把两个表拼在一起&#xff0c;也被称作轴向连接、绑定或连接。依照连接轴的方…

U盘 PE系统制作教程(附pe启动教程+获取方式)

目录 软件介绍&#xff1a; 软件安装步骤&#xff1a; 01 02 03 04 05 06 07 08 09 附&#xff1a;u盘pe系统启动教程 01 02 03 软件介绍&#xff1a; 微 PE 工具箱 v2.2 是一款免费纯净、无捆绑软件、体积小巧、功能齐全的PE 系统&#xff0c;微PE工具箱 v2.2 …