五分钟了解最短路径寻路算法:Dijkstra 迪杰斯特拉
最短路径查找算法
寻路算法在生活中应用十分常见。本文实现的是关于图的最短路径查找算法。
该算法比较常见于游戏和室内地图导航。
实现
例子:几个节点之间,相连接的线段有固定长度,该长度决就是通过代价。查找到花费最少的路径。该图结构为
思路:
可以看到 A>B>D与A>C>D 的代价都相同,边相加都等于10. 而A>C>B的路线代价扽与9,是最短路径。
- 将每个节点的子节点包括路径都保存成散列表。
- 递归检查每个相关节点,看是否能到达终点,并记录下代价、路线、并保存好与上次成功到达终点的路径相比,代价较小的路径。
- 不断更新直到循环每个节点。
- 最后输出的结果就是想要的最短路径
复杂度:最坏情况应该就是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 迪杰斯特拉
最短路径查找算法 寻路算法在生活中应用十分常见。本文实现的是关于图的最短路径查找算法。 该算法比较常见于游戏和室内地图导航。 实现 例子:几个节点之间,相连接的线段有固定长度,该长度决就是通过代价。查找到花费最少的路径。该图结构…...
【ARM】Day8 中断
1. 思维导图 2. 实验要求: 实现KEY1/LEY2/KE3三个按键,中断触发打印一句话,并且灯的状态取反 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两人一人一个整数数组,长度相等,元素随即;两人随便拿出一个元素(弹出),比较大小&#x…...
ModaHub魔搭社区:WinPlan经营大脑管理中心
角色权限 展示设置的角色,及对应的成员及权限点。角色、成员、权限点可自由配置;管理员的角色不可删除、权限点默认全部不可更改。 WinPlan决策系统 算力 阿里云 腾讯云 AWS亚马逊 框架 业务数据基座 WinPlan垂直大模型 模型 分...
滑动窗口系列4-Leetcode322题零钱兑换-限制张数-暴力递归到动态规划再到滑动窗口
这个题目是Leecode322的变种,322原题如下: 我们这里的变化是把硬币变成可以重复的,并且只有coins数组中给出的这么多的金币,也就是说有数量限制: package dataStructure.leecode.practice;import java.util.Arrays; i…...
Nginx全局配置
一、修改启动进程数 worker_processes 1; #允许的启动工作进程数数量,和你真实的cpu数量有关 1 worker_processes auto; #如果设置为auto 就是你真实的cpu数量 ps axo pid,cmd,psr,ni|grep nginx #可以看到 nginx的 worker数量 二、日制分割 [rootyuji ~]#…...
VUE笔记(四)vue的组件
一、组件的介绍 1、组件的作用 整个项目都是由组件组成 可以让代码复用:相似结构代码可以做成一个组件,直接进行调用就可以使用,提高代码复用性 可以让代码具有可维护性(只要改一处,整个引用的部分全部都变…...
菜鸟教程《Python 3 教程》笔记
菜鸟教程《Python 3 教程》笔记 0 写在前面1 基本数据类型1.1 Number(数字)1.2 String(字符串)1.3 bool(布尔类型)1.4 List(列表)1.5 Tuple(元组)1.6 Set&…...
JAVA学习-愚见
JAVA学习-愚见 分享一下Java的学习路线,仅供参考【本人亲测,真实有效】 1、尽可能推荐较新的课程 2、大部分视频在B站上直接搜关键词就行【自学,B大的学生】 文章目录 JAVA学习-愚见前期准备Java基础课程练手项目 数据库JavaWeb前端基础 Vue…...
Watch数据监听详解
一、Vue2写法 1、watch使用的几种方法 1、通过 watch 监听 data 数据的变化,数据发生变化时,就会打印当前的值 watch: {data(val, value) {console.log(val)console.log(value)}} 2、通过 watch 监听 list 数据的变化,数据发生变化时&…...
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. 什么是决策树? 决策树是最早的机器学习算法之一,起源于对人类某些决策过程 的模仿,属于监督学习算法。 决策树的优点是易于理解,有些决策树既可以做分类,也可以做回归。在排名前十的数据挖掘算法中有两种是决策树[1…...
13.4 目标检测锚框标注 非极大值抑制
锚框的形状计算公式 假设原图的高为H,宽为W 锚框形状详细公式推导 以每个像素为中心生成不同形状的锚框 # s是缩放比,ratio是宽高比 def multibox_prior(data, sizes, ratios):"""生成以每个像素为中心具有不同形状的锚框"""in_he…...
【论文笔记】最近看的时空数据挖掘综述整理8.27
Deep Learning for Spatio-Temporal Data Mining: A Survey 被引用次数:392 [Submitted on 11 Jun 2019 (v1), last revised 24 Jun 2019 (this version, v2)] 主要内容: 该论文是一篇关于深度学习在时空数据挖掘中的应用的综述。论文首先介绍了时空数…...
【大模型】基于 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:使用css-unicode-loader方式2:升高 sass版本到1.39.0方式3:替换element-ui的样式文件方式4:更换打包压缩方式知识扩展:方式…...
yolov3加上迁移学习和适度的数据增强形成的网络应用在输电线异物检测
Neural Detection of Foreign Objects for Transmission Lines in Power Systems Abstract. 输电线路为电能从一个地方输送到另一个地方提供了一条路径,确保输电线路的正常运行是向城市和企业供电的先决条件。主要威胁来自外来物,可能导致电力传输中断。…...
香橙派OrangePi zero H2+ 驱动移远EC200A
1 系统内核: 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 下载内核头安装 下载:orangepi800 内核头rk3399链接https://download.csdn.net/download/weixin_37613240/87635781 1.1.1…...
写一个java中如何用JSch来连接sftp的类并做测试?(亲测)
当使用JSch连接SFTP服务器的类,并进行测试时,可以按照以下步骤操作: 添加JSch库的依赖项。在你的项目中添加JSch库的Maven依赖项(如前面所述)或下载JAR文件并将其包含在项目中。 <dependency> <groupId&…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
