镇江市丹徒区建设局网站wix和wordpress区别

web/2025/9/27 22:28:28/文章来源:
镇江市丹徒区建设局网站,wix和wordpress区别,网站开发培训光山,重庆seo网站哪家好本来想直接写A* 的#xff0c;不过看完最佳路径优先搜索算法后觉得还是要先理解一下这个算法后才能更好的理解A* 算法#xff0c;所以把这篇文章放到A* 前面。 基本概念 最佳优先搜索算法#xff08;Best-first-searching#xff09;是一种启发式搜索算法#xff08;Heu…本来想直接写A* 的不过看完最佳路径优先搜索算法后觉得还是要先理解一下这个算法后才能更好的理解A* 算法所以把这篇文章放到A* 前面。 基本概念 最佳优先搜索算法Best-first-searching是一种启发式搜索算法Heuristic Algorithm其基于广度优先搜索算法不同点是其依赖于估价函数对将要遍历的节点进行估价选择代价小的节点进行遍历直到找到目标点为止。BFS算法不能保证找到的路径是一条最短路径但是其计算过程相对于Dijkstra算法会快很多。 BFS算法的启发估价函数公式为 f ( n ) h ( n ) f(n) h(n) f(n)h(n) n表示当前的点g(n)为从起始点到点n的实际代价h(n)为从点n到目标点的估价。 从上述公式我们可以看出BFS的搜索方式非常简单粗暴直接从起点开始连接终点对线上的点进行搜索遇到障碍物时向四周展开。在没有障碍物的场景下BFS是一种快速有效的路径搜索方式 但是在大部分情况下我们的场景中肯定会存在不同的障碍物此时它的搜索路径就不再是最优的了 代码实现 import os import sys from collections import deque import matplotlib.pyplot as pltimport math import heapqclass BFS:BFS add the new visited node in the end of the opensetdef __init__(self, s_start, s_goal, heuristic_type,xI, xG):self.s_start s_startself.s_goal s_goalself.heuristic_type heuristic_typeself.u_set [(-1, 0), (-1, 1), (0, 1), (1, 1),(1, 0), (1, -1), (0, -1), (-1, -1)] # feasible input setself.obs self.obs_map() # position of obstaclesself.OPEN [] # priority queue / OPEN setself.CLOSED [] # CLOSED set / VISITED orderself.PARENT dict() # recorded parentself.g dict() # cost to comeself.x_range 51 # size of backgroundself.y_range 31self.xI, self.xG xI, xGself.obs self.obs_map()def update_obs(self, obs):self.obs obsdef obs_map(self):Initialize obstacles positions:return: map of obstaclesx 51y 31obs set()for i in range(x):obs.add((i, 0))for i in range(x):obs.add((i, y - 1))for i in range(y):obs.add((0, i))for i in range(y):obs.add((x - 1, i))for i in range(10, 21):obs.add((i, 15))for i in range(15):obs.add((20, i))for i in range(15, 30):obs.add((30, i))for i in range(16):obs.add((40, i))return obsdef update_obs(self, obs):self.obs obsdef animation(self, path, visited, name):self.plot_grid(name)self.plot_visited(visited)self.plot_path(path)plt.show()def plot_grid(self, name):obs_x [x[0] for x in self.obs]obs_y [x[1] for x in self.obs]plt.plot(self.xI[0], self.xI[1], bs)plt.plot(self.xG[0], self.xG[1], gs)plt.plot(obs_x, obs_y, sk)plt.title(name)plt.axis(equal)def plot_visited(self, visited, clgray):if self.xI in visited:visited.remove(self.xI)if self.xG in visited:visited.remove(self.xG)count 0for x in visited:count 1plt.plot(x[0], x[1], colorcl, markero)plt.gcf().canvas.mpl_connect(key_release_event,lambda event: [exit(0) if event.key escape else None])if count len(visited) / 3:length 20elif count len(visited) * 2 / 3:length 30else:length 40## length 15if count % length 0:plt.pause(0.001)plt.pause(0.01)def plot_path(self, path, clr, flagFalse):path_x [path[i][0] for i in range(len(path))]path_y [path[i][1] for i in range(len(path))]if not flag:plt.plot(path_x, path_y, linewidth3, colorr)else:plt.plot(path_x, path_y, linewidth3, colorcl)plt.plot(self.xI[0], self.xI[1], bs)plt.plot(self.xG[0], self.xG[1], gs)plt.pause(0.01)def searching(self):Breadth-first Searching.:return: path, visited orderself.PARENT[self.s_start] self.s_startself.g[self.s_start] 0self.g[self.s_goal] math.infheapq.heappush(self.OPEN,(self.heuristic(self.s_start), self.s_start))while self.OPEN:_, s heapq.heappop(self.OPEN)self.CLOSED.append(s)if s self.s_goal:breakfor s_n in self.get_neighbor(s):new_cost self.g[s] self.cost(s, s_n)if s_n not in self.g:self.g[s_n] math.infif new_cost self.g[s_n]: # conditions for updating Costself.g[s_n] new_costself.PARENT[s_n] s# best first set the heuristics as the priority heapq.heappush(self.OPEN, (self.heuristic(s_n), s_n))return self.extract_path(self.PARENT), self.CLOSEDdef get_neighbor(self, s):find neighbors of state s that not in obstacles.:param s: state:return: neighborsreturn [(s[0] u[0], s[1] u[1]) for u in self.u_set]def cost(self, s_start, s_goal):Calculate Cost for this motion:param s_start: starting node:param s_goal: end node:return: Cost for this motion:note: Cost function could be more complicate!if self.is_collision(s_start, s_goal):return math.infreturn math.hypot(s_goal[0] - s_start[0], s_goal[1] - s_start[1])def is_collision(self, s_start, s_end):check if the line segment (s_start, s_end) is collision.:param s_start: start node:param s_end: end node:return: True: is collision / False: not collisionif s_start in self.obs or s_end in self.obs:return Trueif s_start[0] ! s_end[0] and s_start[1] ! s_end[1]:if s_end[0] - s_start[0] s_start[1] - s_end[1]:s1 (min(s_start[0], s_end[0]), min(s_start[1], s_end[1]))s2 (max(s_start[0], s_end[0]), max(s_start[1], s_end[1]))else:s1 (min(s_start[0], s_end[0]), max(s_start[1], s_end[1]))s2 (max(s_start[0], s_end[0]), min(s_start[1], s_end[1]))if s1 in self.obs or s2 in self.obs:return Truereturn Falsedef extract_path(self, PARENT):Extract the path based on the PARENT set.:return: The planning pathpath [self.s_goal]s self.s_goalwhile True:s PARENT[s]path.append(s)if s self.s_start:breakreturn list(path)def heuristic(self, s):Calculate heuristic.:param s: current node (state):return: heuristic function valueheuristic_type self.heuristic_type # heuristic typegoal self.s_goal # goal nodeif heuristic_type manhattan:return abs(goal[0] - s[0]) abs(goal[1] - s[1])else:#sqrt(x^2y^2)return math.hypot(goal[0] - s[0], goal[1] - s[1])def main():s_start (5, 5)s_goal (45, 25)bfs BFS(s_start, s_goal, None,s_start,s_goal)path, visited bfs.searching()bfs.animation(path, visited, Breadth-first Searching (BFS))if __name__ __main__:main()简单讲解一下原理跟A*那篇类似 简单解析一下 在获取起点后算法维护了两个字典 self.PARENT[self.s_start] self.s_startself.g[self.s_start] 0self.g[self.s_goal] math.infPARENT字典中存取的是这个点由哪个点延伸出来的即它的上一个节点是谁用于最后的路径的返回g这个字典中存储的是每个坐标的代价值即g[s]。 然后算法通过堆栈的概念维护了一个堆栈 heapq.heappush(self.OPEN,(self.heuristic(self.s_start), self.s_start))将初始值的f[s]存储在这里然后进行while循环 首先从堆栈中取出栈顶元素 _, s heapq.heappop(self.OPEN)注意到这里使用的heapq堆栈功能中的两个函数heapq.heappop与heapq.heappush。heappop会取出栈顶元素并将原始数据从堆栈中删除而heappush则是对插入的数据按大小排序并存储在堆栈中。所以每一个遍历的点都会按照它的代价值放入堆栈中同时每次取出的都是代价值最小的那个。 然后判断出栈顶元素是否为目标点如果为目标点则退出 if s self.s_goal: # stop conditionbreak如果不是则更新该点附近点的代价值 for s_n in self.get_neighbor(s):new_cost self.g[s] self.cost(s, s_n)if s_n not in self.g:self.g[s_n] math.infif new_cost self.g[s_n]: # conditions for updating Costself.g[s_n] new_costself.PARENT[s_n] s# best first set the heuristics as the priority heapq.heappush(self.OPEN, (self.heuristic(s_n), s_n))get_neighbor为获取该点周围的点的坐标。heappush入栈时需要存储的该点的代价值的计算方式为 def heuristic(self, s):Calculate heuristic.:param s: current node (state):return: heuristic function valueheuristic_type self.heuristic_type # heuristic typegoal self.s_goal # goal nodeif heuristic_type manhattan:return abs(goal[0] - s[0]) abs(goal[1] - s[1])else:#sqrt(x^2y^2)return math.hypot(goal[0] - s[0], goal[1] - s[1])这里计算了一个启发函数的代价值h(n)h的计算可以根据实际情况进行选择例如在栅格地图中计算h的方式一般可以分为两种曼哈顿距离与欧几里德距离。 另外这里注意一个非常巧妙的问题对于同一个点如果它在计算其左边的点的时候会将其添加到堆栈中计算其本身时会出栈再计算其右边时是否还需要重新入栈呢 这个是不一定的是否重新入栈的关键取决于该点在右边的点的计算代价值是否小于左边 if new_cost self.g[s_n]:如果代价值比原来的小则会重新入栈否则这个点就不需要重新计算这样子就避免了大量的重复计算以及死循环的问题。 最后得到结果如下 从结果可以看出虽然最佳路径优先搜索算法得到的结果不是最优的但是在搜索过程中确实效率还是非常高的。 参考 1、最佳优先搜索和A*搜索算法 2、路径规划算法

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

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

相关文章

php网站培训班湖北营销网站建设联系方式

为了方便阅读将文章分为使用篇和源码解析两篇,上一篇已经写了Handler是什么、有什么、怎们用,这一片从源码的角度分析完整流程,看看Handler消息机制到底是啥原理。才疏学浅,如有错误,欢迎指正,多谢。 完整…

合肥网站公司网站制作风格

GD官方提供的很多KEIL例程为KIEL4的版本,读者使用的时候可能会碰到使用KEIL5打开KEIL4的工程会报错以及无法找到芯片选型的问题,具体表现如下图所示。 我们该怎么办呢? 下面为大家介绍两种方法: 第一种方法是在keil4的工程后缀u…

网站建设视频教程集西安建设工程交易网

文章目录 1、ZAB协议介绍2、消息广播 1、ZAB协议介绍 ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。 Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面,Zookeeper 并…

招设计师在哪里找模板网站建设乐云seo效果好

参考 (1) https://www.cnblogs.com/tongchengbin/p/7670927.html

淘宝页面设计的网站广东网络seo推广公司

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 本篇介绍一下Python的内置函数也叫高阶函数,就是Python自…

新余网站开发中山网站建点

SMS群发信息API接口支持哪些格式?如何使用API接口? SMS群发信息API接口被广泛应用于企业营销、客户服务、身份验证等多个领域。确保SMS群发信息API接口的安全性,已成为企业和开发者们必须重视的问题。AoKSend将探讨几种保障SMS群发信息API接…

东昌府聊城网站优化wordpress单本小说模板

1. 第一个坑 【gcc版本不匹配】 请确认你的gcc版本是不是12的,11是编译不通过的。 一般在最后编译时报错,在/var/log/nvidia-installer.log日志中可以看到以下字样 Warning: Compiler version check failed:The major and minor number of the compil…

葫芦岛市城乡建设局网站如何在手机上设计房屋装修效果图

Dynamic Web TWAIN用于快速部署 Web 应用程序的文档扫描 SDK,文档扫描SDK,,超过 5300 家公司信任 Dynamic Web TWAIN ,因其稳健性和安全性而受到超过 5300 家公司的信赖,Dynamic Web TWAIN 是一款基于浏览器的文档扫描…

目前网站开发状况wordpress远程图片模块

文章目录 文档列表文档下载文档列表

怎么进行网站推广做网站需要搭建服务器么

1.2D转换 转换(transform)你可以简单理解为变形 移动:translate 旋转:rotate 缩放:sCale 移动:translate 1.移动具体值 /* 移动盒子的位置: 定位 盒子的外边距 2d转换移动 */div {width…

怎么提高网站加载速度十大装潢公司上海

添加更多特征会使所有的模型变得更加复杂,从而增大过拟合的可能性。 在添加新特征或处理一般的高位数据集时,最好将特征的数量减少到只包含最有用的那些特征,并删除其余特征,这样会得到泛化能力更好、更简单的模型。 对于如何判…

网站设计找谁做网站建设资料

文章目录 @[TOC]1、 需求及效果1.1 需求1.2 效果2、 思路及SQL语句3、实现折叠明细表4、结语1、 需求及效果 1.1 需求 想要查看U8的审批流程,查看流程在哪个节点或人停留的时间,这个单据整个流程走下来需要的时间。可以更加直观方便的查看审批效率 1.2 效果 采用了SSRS上…

视频网站开发公司有哪些公司邢台哪儿能做网站

当涉及到与1688官方合作的API接口时,以下是一些建议和指导,以帮助您开始编写相关的代码。 了解API接口文档: 在编写与1688官方合作的API接口之前,首先需要了解1688官方提供的API接口文档。您可以在1688开放平台上找到相关的文档…

沈阳网站建设的价格佛山网站建设方案咨询

本文原word格式百度云盘下载地址:综述 2需求 2作者 2系统一览 2Unity3d客户端 2PHP后台 4准备 6XAMPP 6官网 6下载地址 6教程 6ThinkPHP 6官网 7项目所用版本 7下载地址 7快速入门 7完全手册 7步骤 7准备ThinkPHP 7修改MySQL设置信息 8检测是否成功 9扩展&#xff1…

集约化网站建设情况企业网站做备案

【1】基础学习笔记之opencv(1):opencv中facedetect例子浅析 http://www.cnblogs.com/tornadomeet/archive/2012/03/22/2411318.html【2】OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect http://blog.csdn.net/yang_xian521/arti…

wordpress 网站统计插件查网站流量的网址

我有一个使用MySQL作为后端的Django应用程序。我在原始MySQL记录显示一个值时遇到困难,但Django在Web应用程序中提供了其他内容。例如,我有一个客户端数据表。每条记录中的一个字段称为snailMailInvoice并且是Y / N选项 - 默认值是Y(varchar类型)。-----…

石油网页设计与网站建设深圳燃气公司网上营业厅

文章目录 为什么要有AVL树什么是AVL树AVL树的实现元素的插入平衡因子的更新AVL树的旋转 AVL树的检查完整实现 本篇总结的是AVL树中的全部内容,配有详细的图解过程 为什么要有AVL树 前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现…

做网站网页的公司行业网站建设的开发方案

PLC_博图系列☞FB&FC 文章目录 PLC_博图系列☞FB&FC背景介绍FB&FC与C 类比博图中定义函数块 (FB)函数 (FC) 关键字: PLC、 西门子、 博图、 FC 、 FB 背景介绍 这是一篇关于PLC编程的文章,特别是关于西门子的博图软件。我并不是专业的P…

企业电子商务网站建设总结wordpress 中文主题网

在现代科技的迅猛发展下,直播系统源码平台被开发搭建出来,为人们的生活方式带来了很大的改变,直播系统源码平台的好友、短视频、直播、社区等功能让很多人越来越热衷于去在平台上刷视频、看直播、分享生活。用户的喜爱也督促了直播系统源码平…

深圳龙华做网站的互联网创业有哪些项目可以做

背景 今天在安装jenkins后,使用java运行war包的时候,提示jdk1.8版本太低,需要提高版本,所以就需要切换jdk版本 解决 在用户变量中,首先更改了JAVA_HOME的地址为17的目录,发现javac的版本改为17了&#x…