大前端d8扁平化wordpress模板杭州百度快照优化公司

张小明 2025/12/31 4:40:24
大前端d8扁平化wordpress模板,杭州百度快照优化公司,百度联盟 网站备案,江西求做网站文章目录 0 简介算法介绍广度优先搜索Dijkstra算法最佳优先搜索A*算法 启发函数关于距离曼哈顿距离对角距离欧几里得距离 算法实现坐标点与地图算法主体测试入口实现效果最后 0 简介 今天学长向大家分享一个毕业设计项目 毕业设计 基于Astart的寻路算法设计与实现 项目运行效…文章目录0 简介算法介绍广度优先搜索Dijkstra算法最佳优先搜索A*算法启发函数关于距离曼哈顿距离对角距离欧几里得距离算法实现坐标点与地图算法主体测试入口实现效果最后0 简介今天学长向大家分享一个毕业设计项目毕业设计 基于Astart的寻路算法设计与实现项目运行效果毕业设计 基于Astart的自动寻路算法 项目分享:见文末!算法介绍A*念做AStar算法是一种很常用的路径查找和图形遍历算法。它有较好的性能和准确度。本文在讲解算法的同时也会提供Python语言的代码实现并会借助matplotlib库动态的展示算法的运算过程。A*算法最初发表于1968年由Stanford研究院的Peter Hart, Nils Nilsson以及BertramRaphael发表。它可以被认为是Dijkstra算法的扩展。由于借助启发函数的引导A*算法通常拥有更好的性能。广度优先搜索为了更好的理解A*算法我们首先从广度优先Breadth First算法讲起。正如其名称所示广度优先搜索以广度做为优先级进行搜索。从起点开始首先遍历起点周围邻近的点然后再遍历已经遍历过的点邻近的点逐步的向外扩散直到找到终点。这种算法就像洪水Flood fill一样向外扩张算法的过程如下图所示在上面这幅动态图中算法遍历了图中所有的点这通常没有必要。对于有明确终点的问题来说一旦到达终点便可以提前终止算法下面这幅图对比了这种情况![在这里插入图片描述](https://img-blog.csdnimg.cn/fbf8213643ec418b91aca2296b1d2c07.png?x-oss-processimage/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAc3Vuc2hpbmVjeG1fQkpUVQ,size_20,color_FFFFFF,t_70,g_se,x_16)在执行算法的过程中每个点需要记录达到该点的前一个点的位置 – 可以称之为父节点。这样做之后一旦到达终点便可以从终点开始反过来顺着父节点的顺序找到起点由此就构成了一条路径。Dijkstra算法Dijkstra算法是由计算机科学家Edsger W. Dijkstra在1956年提出的。Dijkstra算法用来寻找图形中节点之间的最短路径。考虑这样一种场景在一些情况下图形中相邻节点之间的移动代价并不相等。例如游戏中的一幅图既有平地也有山脉那么游戏中的角色在平地和山脉中移动的速度通常是不相等的。在Dijkstra算法中需要计算每一个节点距离起点的总移动代价。同时还需要一个优先队列结构。对于所有待遍历的节点放入优先队列中会按照代价进行排序。在算法运行的过程中每次都从优先队列中选出代价最小的作为下一个遍历的节点。直到到达终点为止。下面对比了不考虑节点移动代价差异的广度优先搜索与考虑移动代价的Dijkstra算法的运算结果当图形为网格图并且每个节点之间的移动代价是相等的那么Dijkstra算法将和广度优先算法变得一样。最佳优先搜索在一些情况下如果我们可以预先计算出每个节点到终点的距离则我们可以利用这个信息更快的到达终点。其原理也很简单。与Dijkstra算法类似我们也使用一个优先队列但此时以每个节点到达终点的距离作为优先级每次始终选取到终点移动代价最小离终点最近的节点作为下一个遍历的节点。这种算法称之为最佳优先BestFirst算法。这样做可以大大加快路径的搜索速度如下图所示但这种算法会不会有什么缺点呢答案是肯定的。因为如果起点和终点之间存在障碍物则最佳优先算法找到的很可能不是最短路径下图描述了这种情况。A*算法对比了上面几种算法最后终于可以讲解本文的重点A*算法了。下面的描述我们将看到A*算法实际上是综合上面这些算法的特点于一身的。A*算法通过下面这个函数来计算每个节点的优先级。f ( n ) g ( n ) h ( n ) f(n) g(n)h(n) f(n)g(n)h(n)其中f ( n ) f(n) f(n) 是节点n的综合优先级。当我们选择下一个要遍历的节点时我们总会选取综合优先级最高值最小的节点。g ( n ) g(n) g(n) 是节点n距离起点的代价。h ( n ) h(n) h(n) 是节点n距离终点的预计代价这也就是A*算法的启发函数。关于启发函数我们在下面详细讲解。A* 算法在运算过程中每次从优先队列中选取 f ( n ) f(n) f(n) 值最小优先级最高的节点作为下一个待遍历的节点。另外A*算法使用两个集合来表示待遍历的节点已经遍历过的节点这通常称之为open_set和close_set。完整的A*算法描述如下​* 初始化open_set和close_set * 将起点加入open_set中并设置优先级为0优先级最高 * 如果open_set不为空则从open_set中选取优先级最高的节点n * 如果节点n为终点则 * 从终点开始逐步追踪parent节点一直达到起点 * 返回找到的结果路径算法结束 * 如果节点n不是终点则 * 将节点n从open_set中删除并加入close_set中 * 遍历节点n所有的邻近节点 * 如果邻近节点m在close_set中则 * 跳过选取下一个邻近节点 * 如果邻近节点m也不在open_set中则 * 设置节点m的parent为节点n * 计算节点m的优先级 * 将节点m加入open_set中启发函数上面已经提到启发函数会影响A*算法的行为。在极端情况下当启发函数 h ( n ) h(n) h(n)始终为0则将由 g ( n ) g(n) g(n)决定节点的优先级此时算法就退化成了Dijkstra算法。如果 h ( n ) h(n) h(n)始终小于等于节点n到终点的代价则A* 算法保证一定能够找到最短路径。但是当 h ( n ) h(n) h(n)的值越小算法将遍历越多的节点也就导致算法越慢。如果 h ( n ) h(n) h(n)完全等于节点n到终点的代价则A* 算法将找到最佳路径并且速度很快。可惜的是并非所有场景下都能做到这一点。因为在没有达到终点之前我们很难确切算出距离终点还有多远。如果 h ( n ) h(n) h(n)的值比节点n到终点的代价要大则A*算法不能保证找到最短路径不过此时会很快。 在另外一个极端情况下如果 h ( n ) h(n) h(n)相较于 g ( n ) g(n) g(n)大很多则此时只有 h ( n ) h(n) h(n)产生效果这也就变成了最佳优先搜索。由上面这些信息我们可以知道通过调节启发函数我们可以控制算法的速度和精确度。因为在一些情况我们可能未必需要最短路径而是希望能够尽快找到一个路径即可。这也是A*算法比较灵活的地方。对于网格形式的图有以下这些启发函数可以使用如果图形中只允许朝上下左右四个方向移动则可以使用曼哈顿距离Manhattan distance。如果图形中允许朝八个方向移动则可以使用对角距离。如果图形中允许朝任何方向移动则可以使用欧几里得距离Euclidean distance。关于距离曼哈顿距离如果图形中只允许朝上下左右四个方向移动则启发函数可以使用曼哈顿距离它的计算方法如下图所示![在这里插入图片描述](https://img-blog.csdnimg.cn/967ffffb3d8a439d8f1ec7b73fed5794.png?x-oss-processimage/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAc3Vuc2hpbmVjeG1fQkpUVQ,size_20,color_FFFFFF,t_70,g_se,x_16)计算曼哈顿距离的函数如下这里的D是指两个相邻节点之间的移动代价通常是一个固定的常数。​function heuristic(node) dx abs(node.x - goal.x) dy abs(node.y - goal.y) return D * (dx dy)对角距离如果图形中允许斜着朝邻近的节点移动则启发函数可以使用对角距离。它的计算方法如下计算对角距离的函数如下这里的D2指的是两个斜着相邻节点之间的移动代价。如果所有节点都正方形则其值就是 2 ∗ D \sqrt{2} * D 2​∗D。![在这里插入图片描述](https://img-blog.csdnimg.cn/1ddf5b37923849a4ab526c76e154abea.png?x-oss-processimage/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAc3Vuc2hpbmVjeG1fQkpUVQ,size_20,color_FFFFFF,t_70,g_se,x_16)​function heuristic(node) dx abs(node.x - goal.x) dy abs(node.y - goal.y) return D * (dx dy) (D2 - 2 * D) * min(dx, dy)欧几里得距离如果图形中允许朝任意方向移动则可以使用欧几里得距离。欧几里得距离是指两个节点之间的直线距离因此其计算方法也是我们比较熟悉的 ( p 2. x − p 1. x ) 2 ( p 2. y − p1. y ) 2 \sqrt{(p2.x-p1.x)^2 (p2.y-p1.y)^2} (p2.x−p1.x)2(p2.y−p1.y)2​。其函数表示如下​function heuristic(node) dx abs(node.x - goal.x) dy abs(node.y - goal.y) return D * sqrt(dx * dx dy * dy)算法实现算法的源码可以到github上下载paulQuei/a-star-algorithm。我们的算法演示的是在一个二维的网格图形上从起点找寻终点的求解过程。坐标点与地图首先我们创建一个非常简单的类来描述图中的点相关代码如下​# point.py import sys class Point: def __init__(self, x, y): self.x x self.y y self.cost sys.maxsize接着我们实现一个描述地图结构的类。为了简化算法的描述:我们选定左下角坐标[0, 0]的点是算法起点右上角坐标[size - 1, size - 1]的点为要找的终点。为了让算法更有趣我们在地图的中间设置了一个障碍并且地图中还会包含一些随机的障碍。该类的代码如下​# random_map.py import numpy as np import point class RandomMap: def __init__(self, size50): # 构造函数地图的默认大小是50x50 self.size size self.obstacle size//8 # 设置障碍物的数量为地图大小除以8 self.GenerateObstacle() # 调用GenerateObstacle生成随机障碍物 def GenerateObstacle(self): self.obstacle_point [] self.obstacle_point.append(point.Point(self.size//2, self.size//2)) self.obstacle_point.append(point.Point(self.size//2, self.size//2-1)) # Generate an obstacle in the middle for i in range(self.size//2-4, self.size//2): # 在地图的中间生成一个斜着的障碍物 self.obstacle_point.append(point.Point(i, self.size-i)) self.obstacle_point.append(point.Point(i, self.size-i-1)) self.obstacle_point.append(point.Point(self.size-i, i)) self.obstacle_point.append(point.Point(self.size-i, i-1)) for i in range(self.obstacle-1): # 随机生成其他几个障碍物 x np.random.randint(0, self.size) y np.random.randint(0, self.size) self.obstacle_point.append(point.Point(x, y)) if (np.random.rand() 0.5): # Random boolean 障碍物的方向也是随机的 for l in range(self.size//4): self.obstacle_point.append(point.Point(x, yl)) pass else: for l in range(self.size//4): self.obstacle_point.append(point.Point(xl, y)) pass def IsObstacle(self, i ,j): # 定义一个方法来判断某个节点是否是障碍物 for p in self.obstacle_point: if ip.x and jp.y: return True return False算法主体有了基本的数据结构之后我们就可以开始实现算法主体了。这里我们通过一个类来封装我们的算法。首先实现一些算法需要的基本函数它们如下​# a_star.py import sys import time import numpy as np from matplotlib.patches import Rectangle import point import random_map class AStar: def __init__(self, map): # __init__类的构造函数。 self.mapmap self.open_set [] self.close_set [] def BaseCost(self, p): # BaseCost节点到起点的移动代价对应了上文的 g(n)。 x_dis p.x y_dis p.y # Distance to start point return x_dis y_dis (np.sqrt(2) - 2) * min(x_dis, y_dis) def HeuristicCost(self, p): # HeuristicCost节点到终点的启发函数对应上文的$h(n)$。由于我们是基于网格的图形所以这个函数和上一个函数用的是对角距离。 x_dis self.map.size - 1 - p.x y_dis self.map.size - 1 - p.y # Distance to end point return x_dis y_dis (np.sqrt(2) - 2) * min(x_dis, y_dis) def TotalCost(self, p): # TotalCost代价总和即对应上面提到的 f(n)。 return self.BaseCost(p) self.HeuristicCost(p) def IsValidPoint(self, x, y): # IsValidPoint判断点是否有效不在地图内部或者障碍物所在点都是无效的。 if x 0 or y 0: return False if x self.map.size or y self.map.size: return False return not self.map.IsObstacle(x, y) def IsInPointList(self, p, point_list): # 判断点是否在某个集合中。 for point in point_list: if point.x p.x and point.y p.y: return True return False def IsInOpenList(self, p): # 判断点是否在open_set中。 return self.IsInPointList(p, self.open_set) def IsInCloseList(self, p): # 判断点是否在close_set中。 return self.IsInPointList(p, self.close_set) def IsStartPoint(self, p): # 判断点是否是起点。 return p.x 0 and p.y 0 def IsEndPoint(self, p): # 判断点是否是终点。 return p.x self.map.size-1 and p.y self.map.size-1有了上面这些辅助函数就可以开始实现算法主逻辑了相关代码如下​# a_star.py def RunAndSaveImage(self, ax, plt): start_time time.time() start_point point.Point(0, 0) start_point.cost 0 self.open_set.append(start_point) while True: index self.SelectPointInOpenList() if index 0: print(No path found, algorithm failed!!!) return p self.open_set[index] rec Rectangle((p.x, p.y), 1, 1, colorc) ax.add_patch(rec) self.SaveImage(plt) if self.IsEndPoint(p): return self.BuildPath(p, ax, plt, start_time) del self.open_set[index] self.close_set.append(p) # Process all neighbors x p.x y p.y self.ProcessPoint(x-1, y1, p) self.ProcessPoint(x-1, y, p) self.ProcessPoint(x-1, y-1, p) self.ProcessPoint(x, y-1, p) self.ProcessPoint(x1, y-1, p) self.ProcessPoint(x1, y, p) self.ProcessPoint(x1, y1, p) self.ProcessPoint(x, y1, p)这段代码应该不需要太多解释了它就是根据前面的算法逻辑进行实现。为了将结果展示出来我们在算法进行的每一步都会借助于matplotlib库将状态保存成图片。上面这个函数调用了其他几个函数代码如下:​# a_star.py def SaveImage(self, plt): millis int(round(time.time() * 1000)) filename ./ str(millis) .png plt.savefig(filename) def ProcessPoint(self, x, y, parent): if not self.IsValidPoint(x, y): return # Do nothing for invalid point p point.Point(x, y) if self.IsInCloseList(p): return # Do nothing for visited point print(Process Point [, p.x, ,, p.y, ], , cost: , p.cost) if not self.IsInOpenList(p): p.parent parent p.cost self.TotalCost(p) self.open_set.append(p) def SelectPointInOpenList(self): index 0 selected_index -1 min_cost sys.maxsize for p in self.open_set: cost self.TotalCost(p) if cost min_cost: min_cost cost selected_index index index 1 return selected_index def BuildPath(self, p, ax, plt, start_time): path [] while True: path.insert(0, p) # Insert first if self.IsStartPoint(p): break else: p p.parent for p in path: rec Rectangle((p.x, p.y), 1, 1, colorg) ax.add_patch(rec) plt.draw() self.SaveImage(plt) end_time time.time() print( Algorithm finish in, int(end_time-start_time), seconds)这三个函数应该是比较容易理解的SaveImage将当前状态保存到图片中图片以当前时间命名。ProcessPoint针对每一个节点进行处理如果是没有处理过的节点则计算优先级设置父节点并且添加到open_set中。SelectPointInOpenList从open_set中找到优先级最高的节点返回其索引。BuildPath从终点往回沿着parent构造结果路径。然后从起点开始绘制结果结果使用绿色方块每次绘制一步便保存一个图片。测试入口最后是程序的入口逻辑使用上面写的类来查找路径​# main.py import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Rectangle import random_map import a_star plt.figure(figsize(5, 5)) map random_map.RandomMap() ① ax plt.gca() ax.set_xlim([0, map.size]) ② ax.set_ylim([0, map.size]) for i in range(map.size): ③ for j in range(map.size): if map.IsObstacle(i,j): rec Rectangle((i, j), width1, height1, colorgray) ax.add_patch(rec) else: rec Rectangle((i, j), width1, height1, edgecolorgray, facecolorw) ax.add_patch(rec) rec Rectangle((0, 0), width 1, height 1, facecolorb) ax.add_patch(rec) ④ rec Rectangle((map.size-1, map.size-1), width 1, height 1, facecolorr) ax.add_patch(rec) ⑤ plt.axis(equal) ⑥ plt.axis(off) plt.tight_layout() #plt.show() a_star a_star.AStar(map) a_star.RunAndSaveImage(ax, plt) ⑦这段代码说明如下1. 创建一个随机地图 2. 设置图像的内容与地图大小一致 3. 绘制地图对于障碍物绘制一个灰色的方块其他区域绘制一个白色的的方块 4. 绘制起点为蓝色方块 5. 绘制终点为红色方块 6. 设置图像的坐标轴比例相等并且隐藏坐标轴 7. 调用算法来查找路径由于我们的地图是随机的所以每次运行的结果可能会不一样下面是我的电脑上某次运行的结果![在这里插入图片描述](https://img-blog.csdnimg.cn/cdb6316c700a4cf6930f10e74eb8a439.png?x-oss-processimage/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAc3Vuc2hpbmVjeG1fQkpUVQ,size_13,color_FFFFFF,t_70,g_se,x_16)实现效果学长设计了一个走迷宫小游戏迷宫的遮挡地形可以根据根据鼠标的拖动进行绘画我们还可以将AStart算法应用到像素游戏中效果如下最后实现效果毕业设计 基于Astart的自动寻路算法 项目分享:见文末!
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

建设网站推广文案自己创建的网站

ComfyUI-Florence2模型加载问题全面解析与解决方案 【免费下载链接】ComfyUI-Florence2 Inference Microsoft Florence2 VLM 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Florence2 在使用ComfyUI-Florence2进行视觉AI任务时,很多用户都会遇到一个…

张小明 2025/12/29 18:32:44 网站建设

太原网站排名优化价格网页设计网站图片

第一章:Open-AutoGLM 框架概述Open-AutoGLM 是一个面向通用语言模型自动化任务的开源框架,旨在简化自然语言处理任务中的模型调用、流程编排与结果优化过程。该框架融合了提示工程、自动推理链生成与多模型协同机制,适用于问答系统、文本生成…

张小明 2025/12/29 18:32:11 网站建设

校园二手交易网站设计的原则受欢迎的汕头网站推广

FaceFusion姿态矫正功能解析:如何解决头部偏转带来的融合失真 在短视频平台和AI写真应用中,换脸技术早已不是新鲜事。但如果你曾尝试将一张正脸照片“贴”到一个正在回头说话的视频人物上,大概率会遇到这样的问题:眼睛歪了、嘴巴错…

张小明 2025/12/29 18:31:37 网站建设

网站转换移动网站明年做啥网站能致富

毕业设计(论文)开题报告电气工程与自动化 2020届题 目 微型水声传感器节点设计 课题类型 设计 课题来源 工程实践 学生姓名 学 号 1614241206 专 业 自动化 班 级 自162(本)指导…

张小明 2025/12/29 18:31:03 网站建设

阿里云域名注册网站网站到底是域名需要备案还是空间

在日常出行场景中,公交换乘路径规划是高频需求,核心诉求是最少换乘次数。传统单向广度优先搜索(BFS)在面对多线路、长距离场景时,存在搜索空间大、效率低的问题。本文将介绍一种基于双向 BFS的公交换乘最优路径规划方案…

张小明 2025/12/29 18:30:30 网站建设

完全免费空间网站淘宝排名查询

为什么Windows系统无法识别你的PS3手柄? 【免费下载链接】DsHidMini Virtual HID Mini-user-mode-driver for Sony DualShock 3 Controllers 项目地址: https://gitcode.com/gh_mirrors/ds/DsHidMini 每个PS3手柄用户在Windows系统上都会遇到同样的困境&…

张小明 2025/12/29 18:29:23 网站建设