路径搜索算法 A* 算法 和 Dijkstra 算法

 A*算法和Dijkstra算法是两种常用的路径搜索算法,用于在图形结构中寻找最短路径。它们都属于单源最短路径算法,可以用于解决各种寻路问题。

        A算法是一种启发式搜索算法,同时考虑了实际移动代价和估计距离代价,通过估计代价来指导搜索方向,并选择最优的路径。A算法通过估价函数值 f(n) = g(n) + h(n) 来评估节点的优先级,其中 g(n) 是实际移动代价,h(n) 是从当前节点到目标节点的估计代价。A算法使用优先队列(通常是最小堆)来管理待处理的节点,每次选择具有最小 f(n) 值的节点进行扩展。A算法在最优条件下(即 h(n) 函数是准确的)保证能够找到最短路径。

        Dijkstra算法是一种经典的图搜索算法,通过不断选择最短路径的节点进行扩展,逐步确定从起点到达其他节点的最短路径。Dijkstra算法使用一个距离数组来记录起始节点到每个节点的最短距离,通过选择当前距离最小的节点进行扩展,更新与该节点相邻节点的距离值。Dijkstra算法在没有负权边的情况下保证能够找到最短路径。

        总结:A*算法通过使用估计函数来指导搜索方向,具有较高的效率和准确性,特别适用于路径搜索问题。Dijkstra算法是一种经典的最短路径算法,适用于图中存在负权边(但不能有负权环)的场景。根据实际情况选择合适的算法,可以高效地寻找最短路径。

A*路径搜索算法的完整代码:

using System;
using System.Collections.Generic;public class AStarPathfinding
{// 定义节点类public class Node{public int x;public int y;public bool isWalkable;public List<Node> neighbors;public Node parent;public int gCost;public int hCost;public Node(int x, int y, bool isWalkable){this.x = x;this.y = y;this.isWalkable = isWalkable;neighbors = new List<Node>();}public int fCost { get { return gCost + hCost; } }}// 寻找路径public static List<Node> FindPath(Node startNode, Node endNode){List<Node> openSet = new List<Node>();HashSet<Node> closedSet = new HashSet<Node>();openSet.Add(startNode);while (openSet.Count > 0){Node currentNode = openSet[0];for (int i = 1; i < openSet.Count; i++){if (openSet[i].fCost < currentNode.fCost || openSet[i].fCost == currentNode.fCost && openSet[i].hCost < currentNode.hCost){currentNode = openSet[i];}}openSet.Remove(currentNode);closedSet.Add(currentNode);if (currentNode == endNode){return GeneratePath(startNode, endNode);}foreach (Node neighbor in currentNode.neighbors){if (!neighbor.isWalkable || closedSet.Contains(neighbor)){continue;}int newCostToNeighbor = currentNode.gCost + GetDistance(currentNode, neighbor);if (newCostToNeighbor < neighbor.gCost || !openSet.Contains(neighbor)){neighbor.gCost = newCostToNeighbor;neighbor.hCost = GetDistance(neighbor, endNode);neighbor.parent = currentNode;if (!openSet.Contains(neighbor)){openSet.Add(neighbor);}}}}return null;}// 计算两个节点之间的距离public static int GetDistance(Node nodeA, Node nodeB){int distanceX = Math.Abs(nodeA.x - nodeB.x);int distanceY = Math.Abs(nodeA.y - nodeB.y);return distanceX + distanceY;}// 生成路径public static List<Node> GeneratePath(Node startNode, Node endNode){List<Node> path = new List<Node>();Node currentNode = endNode;while (currentNode != startNode){path.Add(currentNode);currentNode = currentNode.parent;}path.Reverse();return path;}// 使用示例static void Main(string[] args){// 创建地图Node[,] map = new Node[10, 10];for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){bool isWalkable = true;  // 是否可以行走,根据实际情况设置map[i, j] = new Node(i, j, isWalkable);}}// 设置邻居节点for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){Node node = map[i, j];if (i > 0){node.neighbors.Add(map[i - 1, j]);}if (i < 9){node.neighbors.Add(map[i + 1, j]);}if (j > 0){node.neighbors.Add(map[i, j - 1]);}if (j < 9){node.neighbors.Add(map[i, j + 1]);}}}// 测试寻路Node startNode = map[0, 0];Node endNode = map[9, 9];List<Node> path = FindPath(startNode, endNode);if (path != null){Console.WriteLine("Path Found:");foreach (Node node in path){Console.WriteLine("(" + node.x + ", " + node.y + ")");}}else{Console.WriteLine("No Path Found.");}}
}

        在示例代码中,我们定义了一个 AStarPathfinding 类实现A*路径搜索的相关逻辑。代码中包含了一个 Node 类用于表示节点对象,以及 FindPath 函数用于寻找路径,GetDistance 函数用于计算两个节点之间的距离,GeneratePath 函数用于生成路径。

        在 Main 函数中,我们首先创建了一个 10x10 的地图,设置各个节点的可行走状态,并为每个节点设置邻居节点。然后,我们以 (0, 0) 作为起始节点,(9, 9) 作为目标节点,调用 FindPath 函数寻找路径。如果找到了路径,则输出路径上的节点坐标;否则,输出 "No Path Found."。

        请注意,这只是一个简单的示例,实际的路径搜索算法根据具体的场景和需求可能需要更复杂的实现。

Dijkstra算法的完整代码:

using System;
using System.Collections.Generic;public class DijkstraAlgorithm
{// 定义节点类public class Node{public int id;public int distance;public bool visited;public List<Edge> edges;public Node(int id){this.id = id;this.distance = int.MaxValue;this.visited = false;this.edges = new List<Edge>();}}// 定义边类public class Edge{public Node source;public Node destination;public int weight;public Edge(Node source, Node destination, int weight){this.source = source;this.destination = destination;this.weight = weight;}}// Dijkstra算法public static void Dijkstra(Node startNode){startNode.distance = 0;PriorityQueue<Node> queue = new PriorityQueue<Node>();queue.Enqueue(startNode);while (queue.Count > 0){Node currentNode = queue.Dequeue();currentNode.visited = true;foreach (Edge edge in currentNode.edges){Node neighborNode = edge.destination;int distance = currentNode.distance + edge.weight;if (distance < neighborNode.distance){neighborNode.distance = distance;if (!neighborNode.visited){queue.Enqueue(neighborNode);}}}}}// 示例用法public static void Main(){// 创建节点Node nodeA = new Node(0);Node nodeB = new Node(1);Node nodeC = new Node(2);Node nodeD = new Node(3);// 创建边Edge edgeAB = new Edge(nodeA, nodeB, 2);Edge edgeAC = new Edge(nodeA, nodeC, 4);Edge edgeBC = new Edge(nodeB, nodeC, 1);Edge edgeCD = new Edge(nodeC, nodeD, 3);// 添加边到节点的边列表nodeA.edges.Add(edgeAB);nodeA.edges.Add(edgeAC);nodeB.edges.Add(edgeBC);nodeC.edges.Add(edgeCD);// 运行Dijkstra算法Dijkstra(nodeA);// 输出最短距离Console.WriteLine("Shortest distance from nodeA to nodeD: " + nodeD.distance);}
}

        这个代码示例创建了一组示例节点和边,然后运行Dijkstra算法来找到从起点到终点的最短路径。在这个示例中,节点使用id来唯一标识,边包含源节点,目标节点和权重。Dijkstra算法使用优先队列来管理待处理的节点,通过不断选择最短距离的节点进行扩展,更新相邻节点的距离值。最后,输出从起点到终点的最短距离。

        请注意,这只是一个简单的示例,实际使用时可能需要根据具体情况进行修改和扩展。 

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

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

相关文章

C语言操作符(简单解释版)

算术操作符&#xff1a; &#xff1a;用于将两个数值相加。例如&#xff1a;3 5 8。-&#xff1a;用于从一个数值中减去另一个数值。例如&#xff1a;5 - 3 2。*****&#xff1a;用于将一个数值乘以另一个数值。例如&#xff1a;6 * 5 30。/&#xff1a;用于将第一个数值除…

【程序员的自我修养08】精华!!!动态库的由来及其实现原理

绪论 大家好&#xff0c;欢迎来到【程序员的自我修养】专栏。正如其专栏名&#xff0c;本专栏主要分享学习《程序员的自我修养——链接、装载与库》的知识点以及结合自己的工作经验以及思考。编译原理相关知识本身就比较有难度&#xff0c;我会尽自己最大的努力&#xff0c;争…

穷举vs暴搜vs深搜vs回溯vs剪枝

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;全排列&#x1f449;&#…

微信小程序使用echarts报错 ReferenceError: Image is not defined 解决

报错 ReferenceError: Image is not defined 在用uni-app开发微信小程序时&#xff0c;使用到了echarts&#xff08;V4.6.0&#xff09;配置项中的icon属性&#xff0c;微信开发者工具报错如下&#xff1a; 定位问题 定位问题到了压缩echarts文件中的new Image 使用非压缩…

Java解决字典序最小回文串

Java解决字典序最小回文串 01 题目 给你一个由 小写英文字母 组成的字符串 s &#xff0c;你可以对其执行一些操作。在一步操作中&#xff0c;你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 &#xff0c;使 s 变成一个 回文串 。如果执行 最少 操…

电商API连接升级:飞书集成助力营销系统

无代码开发的连接优势 在数字化时代&#xff0c;电商平台不断寻求创新的方法来提升业务效率和客户体验。无代码开发的连接优势正是飞书审批带给电商行业的一大福音。通过简化集成过程&#xff0c;飞书审批允许企业无需深入复杂的编程技术&#xff0c;即可实现系统间的高效连接…

【LabVIEW FPGA入门】创建第一个LabVIEW FPGA程序

本教程仅以compactRIO&#xff08;FPGA-RT&#xff09;举例 1.系统配置 1.1软件安装 FPGA-RT 1. LabVIEW Development System (Full or Professional) 2. LabVIEW Real-Time Module 3. LabVIEW FPGA Module 4. NI-RIO drivers 1.2硬件配置 1.使用线缆连接CompactRIO至主机…

解决json.decoder.JSONDecodeError: Extra data: line 1 column 721 (char 720)问题

python中将字符串序反列化成json格式时报错 fn result_json[0].decode(utf-8).strip(\00) json_object json.loads(fn) print(type(json_object))排查了以下原因应该是序列化的字符串全都在一行&#xff0c;json库不能一次性处理这么长的序列

jsavascript

JavaScript获取当前时间 效果图当前时间 效果图 当前时间 var now new Date();var year now.getFullYear();var month (now.getMonth() 1) <10 ? "0"(now.getMonth() 1) : (now.getMonth() 1);var day now.getDate() <10 ? "0"now.getDate() :…

【Linux 内核源码分析】GPIO子系统软件框架

Linux内核的GPIO子系统是用于管理和控制通用输入输出&#xff08;GPIO&#xff09;引脚的软件框架。它提供了一套统一的接口和机制&#xff0c;使开发者能够方便地对GPIO进行配置、读写和中断处理。 主要组件&#xff1a; GPIO框架&#xff1a;提供了一套API和数据结构&#x…

安卓作业001 - 显示学生信息

文章目录 安卓作业001 - 显示学生信息一、界面设计思路二、涉及知识点概览三、实现步骤详解四、启动应用&#xff0c;查看结果五、任务完成总结 安卓作业001 - 显示学生信息 显示学生详细信息要求更改应用图标及标 题要求设置窗口背景图片 一、界面设计思路 在本次安卓作业0…

兔单抗制备方法的发展-噬菌体展示技术-卡梅德生物

兔单克隆抗体技术是近年来在抗体研究领域中取得的重要进展之一。研究人员通过改进抗原设计、免疫策略和单克隆B细胞培养条件&#xff0c;提高了单克隆抗体的产量和特异性。相比于传统的小鼠单克隆抗体技术&#xff0c;兔单克隆抗体技术具有更大的抗原特异性和更高的亲和力&…

纯血鸿蒙 App 上线,目前已超 150 款!

做鸿蒙应用开发到底学习些啥&#xff1f;鸿蒙生态&#xff0c;正在极速扩大&#xff01; 上月底&#xff0c;包括荣耀 V30、30 系列及 Play 4 Pro 六款老机型&#xff0c;获得了鸿蒙 4.0 正式版更新。 前不久&#xff0c;华为 P30 系列、Mate 20 系列、荣耀 20 系列、荣耀 V2…

第7章 表格和表单

学习目标 掌握创建表格的方法&#xff0c;能够在网页中创建表格。 熟悉表格相关标签的属性&#xff0c;能够运用这些属性设置不同形态的表格。 掌握CSS控制表格样式的方法&#xff0c;能够使用CSS设置表格样式。 了解表单的构成&#xff0c;能够说出表单的构成部分。 掌握创…

【java】byte[] 存储内存清理

在Java中&#xff0c;可以使用byte数组来存储二进制数据。当不再需要这些字节时&#xff0c;我们应该及时释放相关的资源并将其置为null&#xff0c;以便JVM能够正确地管理内存。 下面是一段示例代码&#xff0c;展示了如何创建、使用和清理byte数组&#xff1a; public clas…

离散点过滤算法

离散点过滤算法是数据处理中常用的一种算法&#xff0c;主要用于去除数据中的离群点或噪声点。这些离群点可能是由于测量误差、异常事件或其他原因产生的。以下是一些常见的离散点过滤算法&#xff1a; Z-score过滤算法&#xff1a;该算法通过计算每个数据点的Z-score&#xf…

关于安卓重启设备和重启应用进程

android 重启应用进程 //多种方式重启应用进程public class MainActivity {//重启当前Applicationprivate void restartApplication(){final Intent intent getPackageManager().getLaunchIntentForPackage(getPackageName());intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP…

C#编程-递归

递归 您知道方法可以调用其他方法。但是,方法也可以调用自己。从函数主体调用函数的过程称为递归。 递归的主要优点是在编写清晰、简短和简单的程序方面非常有用。 要理解此概念,请考虑阶乘函数定义为: n != 1 * 2 * 3 * 4 * ... * n此同阶乘函数可定义为: n! = (n-1)!*…

专业服务新篇章:ToB行业运营达人的能力与策略

又逢年底&#xff0c;这两天冷空气南袭&#xff0c;深圳的天气也转为湿冷&#xff0c;又到了年终总结复盘的时候了&#xff0c;其实这样的天气挺适合做深度的思考&#xff0c;清冷的空气&#xff0c;可以让人保持清醒。 月初市场同事希望我写点东西&#xff0c;题目内容自拟&a…

初始py和py开发工具

前言&#xff1a;上一章节给友友们讲解了如何安装py环境&#xff0c;这一章节就来练习一下如何写py的程序以及注意事项。 目录 一.你好世界 1.因为主播liunx用习惯的缘故所以所有的操作都在liunx上面执行&#xff0c;下面我们来看怎么写py的程序&#xff0c; 1.1首先打开liu…