当前位置: 首页 > news >正文

五分钟了解最短路径寻路算法:Dijkstra 迪杰斯特拉

最短路径查找算法

寻路算法在生活中应用十分常见。本文实现的是关于图的最短路径查找算法。
该算法比较常见于游戏和室内地图导航。

实现

例子:几个节点之间,相连接的线段有固定长度,该长度决就是通过代价。查找到花费最少的路径。该图结构为

5米
2米
4米
5米
2米
2米
2米
8米
起点A
B
C
F
终点D
思路:

可以看到 A>B>D与A>C>D 的代价都相同,边相加都等于10. 而A>C>B的路线代价扽与9,是最短路径。

  1. 将每个节点的子节点包括路径都保存成散列表。
  2. 递归检查每个相关节点,看是否能到达终点,并记录下代价、路线、并保存好与上次成功到达终点的路径相比,代价较小的路径。
  3. 不断更新直到循环每个节点。
  4. 最后输出的结果就是想要的最短路径

复杂度:最坏情况应该就是O((n-1)2) 了吧

不参考加权,求任意两点间的所有路径
//csharp版代码using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;namespace ConsoleApp1test
{class Program{   //创建图数据static Hashtable myGraph = new Hashtable();static void Main(string[] args) {//A节点及其信息与关系myGraph["A"] = new Hashtable();(myGraph["A"] as Hashtable)["B"] = 5;(myGraph["A"] as Hashtable)["C"] = 2;(myGraph["A"] as Hashtable)["F"] = 2;//B节点myGraph["B"] = new Hashtable();(myGraph["B"] as Hashtable)["D"] = 5;(myGraph["B"] as Hashtable)["F"] = 5;//CmyGraph["C"] = new Hashtable();(myGraph["C"] as Hashtable)["B"] = 2;(myGraph["C"] as Hashtable)["D"] = 8;//DmyGraph["D"] = new Hashtable();//fmyGraph["F"] = new Hashtable();//递归监测GetPath(myGraph["A"] as Hashtable, "A", "D");Console.ReadKey();}//创建用于存储代价的变量static int cost = 0;//创建用于记录路径的数据表static Hashtable rote = new Hashtable();static List<string> rotearray = new List<string>();public static void GetPath(Hashtable targetNode, string startPoint, string endPoint){//记录当前节点rotearray.Add(startPoint);Console.WriteLine("当前节点:"+ startPoint);string st = "";foreach (string name in rotearray){st += name + ">";}Console.WriteLine("当前结构:"+st);//当前节点是否是根节点if (startPoint == endPoint){//已经到达终点  //输出当前分支的每个节点string s = "";foreach (string name in rotearray){s += name + ">";}Console.WriteLine("到达终点,路径:"+s);Console.WriteLine("=================");} else {//未到达指定节点 遍历每个节点下相关联的子节点foreach (string connected_node_name in targetNode.Keys)//在第一次输入时,不应该遍历所有的值{GetPath(myGraph[connected_node_name] as Hashtable, connected_node_name, endPoint);}}//删除当前节点回 到上层if (rotearray.Count > 0)rotearray.RemoveAt(rotearray.Count - 1);}}
}

结果:

当前节点:A
当前结构:A>
当前节点:C
当前结构:A>C>
当前节点:D
当前结构:A>C>D>
到达终点,路径:A>C>D>
=================
当前节点:B
当前结构:A>C>B>
当前节点:F
当前结构:A>C>B>F>
当前节点:D
当前结构:A>C>B>D>
到达终点,路径:A>C>B>D>
=================
当前节点:F
当前结构:A>F>
当前节点:B
当前结构:A>B>
当前节点:F
当前结构:A>B>F>
当前节点:D
当前结构:A>B>D>
到达终点,路径:A>B>D>
=================

求指定两点间代价最小(最短)路径

此段代码,用于求出加权图最短路径,加入了防循环,可以在有向图、无向图中使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;namespace ConsoleApp1test
{class Program{   //创建图数据static Hashtable myGraph = new Hashtable();static void Main(string[] args) {//A节点及其信息与关系myGraph["A"] = new Hashtable();(myGraph["A"] as Hashtable)["B"] = 5;(myGraph["A"] as Hashtable)["C"] = 2;(myGraph["A"] as Hashtable)["F"] = 2;//B节点myGraph["B"] = new Hashtable();(myGraph["B"] as Hashtable)["D"] = 5;(myGraph["B"] as Hashtable)["F"] = 5;//CmyGraph["C"] = new Hashtable();(myGraph["C"] as Hashtable)["B"] = 2;(myGraph["C"] as Hashtable)["D"] = 8;//DmyGraph["D"] = new Hashtable();//fmyGraph["F"] = new Hashtable();(myGraph["F"] as Hashtable)["B"] = 2;//递归监测GetPath(myGraph["A"] as Hashtable, "A", "D");Console.WriteLine("最短路径:" + shortestPath + " 代价:" + shortestCost + "米");Console.ReadKey();}//创建用于存储代价\记录路径的数据表static List<string> pathList = new List<string>();static List<int> pathCostList = new List<int>();static int shortestCost = 100000;static string shortestPath = "";public static void GetPath(Hashtable targetNode, string startPoint, string endPoint){//记录当前节点pathList.Add(startPoint);Console.WriteLine("当前节点:"+ startPoint);string allPath = "";for(int i=0; i < pathList.Count; i++){allPath += pathList[i];allPath += (i == (pathList.Count - 1)) ? "" : ">";}Console.WriteLine("当前结构:" + allPath);//当前节点是否是根节点if (startPoint == endPoint){//已经到达终点  //输出当前分支的每个节点Console.WriteLine("到达终点,路径:"+ allPath);//计算所有的权值int pathCost_total = 0;foreach (int pathCost in pathCostList){pathCost_total += pathCost;}Console.WriteLine("代价:" + pathCost_total.ToString() + "米");//更新最短路径信息if (pathCost_total < shortestCost) {shortestCost = pathCost_total;shortestPath = allPath;}Console.WriteLine("==========害羞而淫荡的分割线==========");} else {//未到达指定节点 遍历每个节点下相关联的子节点foreach (string connected_node_name in targetNode.Keys){//如果,路径中已存在节点,就不走了。 避免循环。if (!pathList.Contains(connected_node_name)) {//记录路径权值pathCostList.Add((int)targetNode[connected_node_name]);GetPath(myGraph[connected_node_name] as Hashtable, connected_node_name, endPoint);//记录路径权值if (pathCostList.Count > 0)pathCostList.RemoveAt(pathCostList.Count - 1);}}}//删除当前节点回 到上层if (pathList.Count > 0)pathList.RemoveAt(pathList.Count - 1);}}
}

结果:

当前节点:A
当前结构:A
当前节点:C
当前结构:A>C
当前节点:D
当前结构:A>C>D
到达终点,路径:A>C>D
代价:10==========害羞而淫荡的分割线==========
当前节点:B
当前结构:A>C>B
当前节点:F
当前结构:A>C>B>F
当前节点:D
当前结构:A>C>B>D
到达终点,路径:A>C>B>D
代价:9==========害羞而淫荡的分割线==========
当前节点:F
当前结构:A>F
当前节点:B
当前结构:A>F>B
当前节点:D
当前结构:A>F>B>D
到达终点,路径:A>F>B>D
代价:9==========害羞而淫荡的分割线==========
当前节点:B
当前结构:A>B
当前节点:F
当前结构:A>B>F
当前节点:D
当前结构:A>B>D
到达终点,路径:A>B>D
代价:10==========害羞而淫荡的分割线==========
最短路径:A>C>B>D 代价:9

有权图,理论上来说把权化为等量节点,也可以使用最短节点算法求最短路径。

相关文章:

五分钟了解最短路径寻路算法:Dijkstra 迪杰斯特拉

最短路径查找算法 寻路算法在生活中应用十分常见。本文实现的是关于图的最短路径查找算法。 该算法比较常见于游戏和室内地图导航。 实现 例子&#xff1a;几个节点之间&#xff0c;相连接的线段有固定长度&#xff0c;该长度决就是通过代价。查找到花费最少的路径。该图结构…...

【ARM】Day8 中断

1. 思维导图 2. 实验要求&#xff1a; 实现KEY1/LEY2/KE3三个按键&#xff0c;中断触发打印一句话&#xff0c;并且灯的状态取反 key1 ----> LED3灯状态取反 key2 ----> LED2灯状态取反 key3 ----> LED1灯状态取反 key3.h #ifndef __KEY3_H__ #define __KEY3_H__#in…...

大数据Flink(六十八):SQL Table 的基本概念及常用 API

文章目录 SQL & Table 的基本概念及常用 API 一、​​​​​​​一个 Table API\SQL任务的代码结构...

算法练习- 其他算法练习6

文章目录 数字序列比大小最佳植树距离文艺汇演计算误码率二维伞的雨滴效应阿里巴巴找黄金宝箱4 数字序列比大小 A、B两人一人一个整数数组&#xff0c;长度相等&#xff0c;元素随即&#xff1b;两人随便拿出一个元素&#xff08;弹出&#xff09;&#xff0c;比较大小&#x…...

ModaHub魔搭社区:WinPlan经营大脑管理中心

角色权限 展示设置的角色,及对应的成员及权限点。角色、成员、权限点可自由配置;管理员的角色不可删除、权限点默认全部不可更改。 WinPlan决策系统 算力 阿里云 腾讯云 AWS亚马逊 框架 业务数据基座 WinPlan垂直大模型 模型 分...

滑动窗口系列4-Leetcode322题零钱兑换-限制张数-暴力递归到动态规划再到滑动窗口

这个题目是Leecode322的变种&#xff0c;322原题如下&#xff1a; 我们这里的变化是把硬币变成可以重复的&#xff0c;并且只有coins数组中给出的这么多的金币&#xff0c;也就是说有数量限制&#xff1a; package dataStructure.leecode.practice;import java.util.Arrays; i…...

Nginx全局配置

一、修改启动进程数 worker_processes 1; #允许的启动工作进程数数量&#xff0c;和你真实的cpu数量有关 1 worker_processes auto; #如果设置为auto 就是你真实的cpu数量 ps axo pid,cmd,psr,ni|grep nginx #可以看到 nginx的 worker数量 二、日制分割 [rootyuji ~]#…...

VUE笔记(四)vue的组件

一、组件的介绍 1、组件的作用 整个项目都是由组件组成 可以让代码复用&#xff1a;相似结构代码可以做成一个组件&#xff0c;直接进行调用就可以使用&#xff0c;提高代码复用性 可以让代码具有可维护性&#xff08;只要改一处&#xff0c;整个引用的部分全部都变&#xf…...

菜鸟教程《Python 3 教程》笔记

菜鸟教程《Python 3 教程》笔记 0 写在前面1 基本数据类型1.1 Number&#xff08;数字&#xff09;1.2 String&#xff08;字符串&#xff09;1.3 bool&#xff08;布尔类型&#xff09;1.4 List&#xff08;列表&#xff09;1.5 Tuple&#xff08;元组&#xff09;1.6 Set&…...

JAVA学习-愚见

JAVA学习-愚见 分享一下Java的学习路线&#xff0c;仅供参考【本人亲测&#xff0c;真实有效】 1、尽可能推荐较新的课程 2、大部分视频在B站上直接搜关键词就行【自学&#xff0c;B大的学生】 文章目录 JAVA学习-愚见前期准备Java基础课程练手项目 数据库JavaWeb前端基础 Vue…...

Watch数据监听详解

一、Vue2写法 1、watch使用的几种方法 1、通过 watch 监听 data 数据的变化&#xff0c;数据发生变化时&#xff0c;就会打印当前的值 watch: {data(val, value) {console.log(val)console.log(value)}} 2、通过 watch 监听 list 数据的变化&#xff0c;数据发生变化时&…...

UML建模以及几种类图的理解

文章目录 前言1.用例与用例图1.1 参与者1.2 用例之间的关系1.3 用例图1.4 用例的描述 2.交互图2.1 顺序图2.2 协作图 3.类图和对象图3.1 关联关系3.2 聚合和组合3.3 泛化关系3.4 依赖关系 4.状态图与活动图4.1 状态图4.2 活动图 5.构件图 前言 UML通过图形化的表示机制从多个侧…...

opencv进阶18-基于opencv 决策树导论

1. 什么是决策树&#xff1f; 决策树是最早的机器学习算法之一&#xff0c;起源于对人类某些决策过程 的模仿&#xff0c;属于监督学习算法。 决策树的优点是易于理解&#xff0c;有些决策树既可以做分类&#xff0c;也可以做回归。在排名前十的数据挖掘算法中有两种是决策树[1…...

13.4 目标检测锚框标注 非极大值抑制

锚框的形状计算公式 假设原图的高为H,宽为W 锚框形状详细公式推导 以每个像素为中心生成不同形状的锚框 # s是缩放比&#xff0c;ratio是宽高比 def multibox_prior(data, sizes, ratios):"""生成以每个像素为中心具有不同形状的锚框"""in_he…...

【论文笔记】最近看的时空数据挖掘综述整理8.27

Deep Learning for Spatio-Temporal Data Mining: A Survey 被引用次数&#xff1a;392 [Submitted on 11 Jun 2019 (v1), last revised 24 Jun 2019 (this version, v2)] 主要内容&#xff1a; 该论文是一篇关于深度学习在时空数据挖掘中的应用的综述。论文首先介绍了时空数…...

【大模型】基于 LlaMA2 的高 star 的 GitHub 开源项目汇总

【大模型】基于 LlaMA2 的高 star 的 GitHub 开源项目汇总 Llama2 简介开源项目汇总NO1. FlagAlpha/Llama2-ChineseNO2. hiyouga/LLaMA-Efficient-TuningNO3. yangjianxin1/FireflyNO4. LinkSoul-AI/Chinese-Llama-2-7bNO5. wenge-research/YaYiNO6. michael-wzhu/Chinese-LlaM…...

解决elementUI打包上线后icon图标偶尔乱码的问题

解决vue-elementUI打包后icon图标偶尔乱码的问题 一、背景二、现象三、原因四、处理方法方式1&#xff1a;使用css-unicode-loader方式2&#xff1a;升高 sass版本到1.39.0方式3&#xff1a;替换element-ui的样式文件方式4&#xff1a;更换打包压缩方式知识扩展&#xff1a;方式…...

yolov3加上迁移学习和适度的数据增强形成的网络应用在输电线异物检测

Neural Detection of Foreign Objects for Transmission Lines in Power Systems Abstract. 输电线路为电能从一个地方输送到另一个地方提供了一条路径&#xff0c;确保输电线路的正常运行是向城市和企业供电的先决条件。主要威胁来自外来物&#xff0c;可能导致电力传输中断。…...

香橙派OrangePi zero H2+ 驱动移远EC200A

1 系统内核&#xff1a; Linux orangepizero 5.4.65-sunxi #2.2.2 SMP Tue Aug 15 17:45:28 CST 2023 armv7l armv7l armv7l GNU/Linux 1.1 下载内核头安装 下载&#xff1a;orangepi800 内核头rk3399链接https://download.csdn.net/download/weixin_37613240/87635781 1.1.1…...

写一个java中如何用JSch来连接sftp的类并做测试?(亲测)

当使用JSch连接SFTP服务器的类&#xff0c;并进行测试时&#xff0c;可以按照以下步骤操作&#xff1a; 添加JSch库的依赖项。在你的项目中添加JSch库的Maven依赖项&#xff08;如前面所述&#xff09;或下载JAR文件并将其包含在项目中。 <dependency> <groupId&…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...