位置: IT常识 - 正文

python A*算法是什么(python apriori算法)

编辑:rootadmin

推荐整理分享python A*算法是什么(python apriori算法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python的a+,python计算a+aa+aaa,python计算a+aa+aaa,python apriori算法,a*算法代码 python,python的a+,pythonai算法,python的a+,内容如对您有帮助,希望把文章链接给更多的朋友!

python A*算法是什么(python apriori算法)

说明

1、A*算法是静态路网中解决最短路径最有效的直接搜索方法。

2、A*算法是启发式算法,采用最佳优先搜索策略(Best-first),基于评估函数对每个搜索位置的评估结果,猜测最佳优先搜索位置。

A*算法大大降低了低质量的搜索路径,因此搜索效率高,比传统的路径规划算法更实时、更灵活。但A*算法找到的是相对最优的路径,而不是绝对最短的路径,适合大规模、实时性高的问题。

实例

importheapqimportcopyimportreimportdatetimeBLOCK=[]#给定状态GOAL=[]#目标状态#4个方向direction=[[0,1],[0,-1],[1,0],[-1,0]]#OPEN表OPEN=[]#节点的总数SUM_NODE_NUM=0#状态节点classState(object):def__init__(self,gn=0,hn=0,state=None,hash_value=None,par=None):'''初始化:paramgn:gn是初始化到现在的距离:paramhn:启发距离:paramstate:节点存储的状态:paramhash_value:哈希值,用于判重:parampar:父节点指针'''self.gn=gnself.hn=hnself.fn=self.gn+self.hnself.child=[]#孩子节点self.par=par#父节点self.state=state#局面状态self.hash_value=hash_value#哈希值def__lt__(self,other):#用于堆的比较,返回距离最小的returnself.fn<other.fndef__eq__(self,other):#相等的判断returnself.hash_value==other.hash_valuedef__ne__(self,other):#不等的判断returnnotself.__eq__(other)defmanhattan_dis(cur_node,end_node):'''计算曼哈顿距离:paramcur_state:当前状态:return:到目的状态的曼哈顿距离'''cur_state=cur_node.stateend_state=end_node.statedist=0N=len(cur_state)foriinrange(N):forjinrange(N):ifcur_state[i][j]==end_state[i][j]:continuenum=cur_state[i][j]ifnum==0:x=N-1y=N-1else:x=num/N#理论横坐标y=num-N*x-1#理论的纵坐标dist+=(abs(x-i)+abs(y-j))returndistdeftest_fn(cur_node,end_node):return0defgenerate_child(cur_node,end_node,hash_set,open_table,dis_fn):'''生成子节点函数:paramcur_node:当前节点:paramend_node:最终状态节点:paramhash_set:哈希表,用于判重:paramopen_table:OPEN表:paramdis_fn:距离函数:return:None'''ifcur_node==end_node:heapq.heappush(open_table,end_node)returnnum=len(cur_node.state)foriinrange(0,num):forjinrange(0,num):ifcur_node.state[i][j]!=0:continuefordindirection:#四个偏移方向x=i+d[0]y=j+d[1]ifx<0orx>=numory<0ory>=num:#越界了continue#记录扩展节点的个数globalSUM_NODE_NUMSUM_NODE_NUM+=1state=copy.deepcopy(cur_node.state)#复制父节点的状态state[i][j],state[x][y]=state[x][y],state[i][j]#交换位置h=hash(str(state))#哈希时要先转换成字符串ifhinhash_set:#重复了continuehash_set.add(h)#加入哈希表gn=cur_node.gn+1#已经走的距离函数hn=dis_fn(cur_node,end_node)#启发的距离函数node=State(gn,hn,state,h,cur_node)#新建节点cur_node.child.append(node)#加入到孩子队列heapq.heappush(open_table,node)#加入到堆中defprint_path(node):'''输出路径:paramnode:最终的节点:return:None'''num=node.gndefshow_block(block):print("---------------")forbinblock:print(b)stack=[]#模拟栈whilenode.parisnotNone:stack.append(node.state)node=node.parstack.append(node.state)whilelen(stack)!=0:t=stack.pop()show_block(t)returnnumdefA_start(start,end,distance_fn,generate_child_fn,time_limit=10):'''A*算法:paramstart:起始状态:paramend:终止状态:paramdistance_fn:距离函数,可以使用自定义的:paramgenerate_child_fn:产生孩子节点的函数:paramtime_limit:时间限制,默认10秒:return:None'''root=State(0,0,start,hash(str(BLOCK)),None)#根节点end_state=State(0,0,end,hash(str(GOAL)),None)#最后的节点ifroot==end_state:print("start==end!")OPEN.append(root)heapq.heapify(OPEN)node_hash_set=set()#存储节点的哈希值node_hash_set.add(root.hash_value)start_time=datetime.datetime.now()whilelen(OPEN)!=0:top=heapq.heappop(OPEN)iftop==end_state:#结束后直接输出路径returnprint_path(top)#产生孩子节点,孩子节点加入OPEN表generate_child_fn(cur_node=top,end_node=end_state,hash_set=node_hash_set,open_table=OPEN,dis_fn=distance_fn)cur_time=datetime.datetime.now()#超时处理if(cur_time-start_time).seconds>time_limit:print("Timerunningout,break!")print("Numberofnodes:",SUM_NODE_NUM)return-1print("Noroad!")#没有路径return-1defread_block(block,line,N):'''读取一行数据作为原始状态:paramblock:原始状态:paramline:一行数据:paramN:数据的总数:return:None'''pattern=re.compile(r'\d+')#正则表达式提取数据res=re.findall(pattern,line)t=0tmp=[]foriinres:t+=1tmp.append(int(i))ift==N:t=0block.append(tmp)tmp=[]if__name__=='__main__':try:file=open("./infile.txt","r")exceptIOError:print("cannotopenfileinfile.txt!")exit(1)f=open("./infile.txt")NUMBER=int(f.readline()[-2])n=1foriinrange(NUMBER):l=[]forjinrange(NUMBER):l.append(n)n+=1GOAL.append(l)GOAL[NUMBER-1][NUMBER-1]=0forlineinf:#读取每一行数据OPEN=[]#这里别忘了清空BLOCK=[]read_block(BLOCK,line,NUMBER)SUM_NODE_NUM=0start_t=datetime.datetime.now()#这里添加5秒超时处理,可以根据实际情况选择启发函数length=A_start(BLOCK,GOAL,manhattan_dis,generate_child,time_limit=10)end_t=datetime.datetime.now()iflength!=-1:print("length=",length)print("time=",(end_t-start_t).total_seconds(),"s")print("Nodes=",SUM_NODE_NUM)

以上就是python A*算法的介绍,希望对大家有所帮助。更多Python学习指路:Python基础教程

本文链接地址:https://www.jiuchutong.com/zhishi/313077.html 转载请保留说明!

上一篇:🎉使用JSONP解决跨域(jsoncpp使用)

下一篇:Nginx 防盗链(nginx防盗链的作用)

  • 小艺是什么手机的语音助手(小艺是什么手机的助手)

    小艺是什么手机的语音助手(小艺是什么手机的助手)

  • 和家亲摄像头夜晚灯关闭教程(和家亲摄像头夜视功能消失)

    和家亲摄像头夜晚灯关闭教程(和家亲摄像头夜视功能消失)

  • 一个手机怎么安装两个拼多多(一个手机怎么安装两个钉钉软件)

    一个手机怎么安装两个拼多多(一个手机怎么安装两个钉钉软件)

  • 万家乐e2热水器故障怎么解决(万家乐热水器e2故障排除)

    万家乐e2热水器故障怎么解决(万家乐热水器e2故障排除)

  • 腾讯会议操作过于频繁请稍后再试(腾讯会议操作过于频繁登录不了)

    腾讯会议操作过于频繁请稍后再试(腾讯会议操作过于频繁登录不了)

  • 用华为手机怎么截视频(用华为手机怎么查找苹果手机的位置)

    用华为手机怎么截视频(用华为手机怎么查找苹果手机的位置)

  • 水星路由器重置完无法上网(水星路由器重置后上不了网)

    水星路由器重置完无法上网(水星路由器重置后上不了网)

  • btvdl09是什么平板型号(btvdl09和btvw09)

    btvdl09是什么平板型号(btvdl09和btvw09)

  • 微信小程序运行环境加载失败(怎么停止微信小程序运行)

    微信小程序运行环境加载失败(怎么停止微信小程序运行)

  • 微信如何跳过验证(微信如何跳过验证手机号)

    微信如何跳过验证(微信如何跳过验证手机号)

  • 路由器延迟高什么原因(路由器延迟高什么意思)

    路由器延迟高什么原因(路由器延迟高什么意思)

  • 苹果手机的三包都包括什么(苹果手机的三包到底是什么意思)

    苹果手机的三包都包括什么(苹果手机的三包到底是什么意思)

  • ipad pro和air的区别(ipad pro和air啥区别)

    ipad pro和air的区别(ipad pro和air啥区别)

  • 如何分辨switch是不是续航加强版(switch如何区分)

    如何分辨switch是不是续航加强版(switch如何区分)

  • 喜马拉雅在哪测声音(喜马拉雅怎么测试声音类型2020)

    喜马拉雅在哪测声音(喜马拉雅怎么测试声音类型2020)

  • ps怎么做漂亮艺术字(ps怎么做好看)

    ps怎么做漂亮艺术字(ps怎么做好看)

  • oppo手机通话声音小怎么办(oppo手机通话声音小怎么调大)

    oppo手机通话声音小怎么办(oppo手机通话声音小怎么调大)

  • 淘宝店铺分数在哪里查(淘宝店铺分数多久清零)

    淘宝店铺分数在哪里查(淘宝店铺分数多久清零)

  • 小米手环怎么监控睡眠(小米手环怎么监测运动心率)

    小米手环怎么监控睡眠(小米手环怎么监测运动心率)

  • yy回放怎么没字幕(yy直播回放怎么没有了)

    yy回放怎么没字幕(yy直播回放怎么没有了)

  • a1980是什么型号(a1980是什么型号笔记本)

    a1980是什么型号(a1980是什么型号笔记本)

  • 查找vivo手机定位(查找vivo手机定位官方网址)

    查找vivo手机定位(查找vivo手机定位官方网址)

  • 想换手机号可是绑定银行卡怎么办(想换手机号了)

    想换手机号可是绑定银行卡怎么办(想换手机号了)

  • 火山视频怎样连拍(火山视频怎么连续播放)

    火山视频怎样连拍(火山视频怎么连续播放)

  • 苹果xsmax有什么功能(苹果xsmax有什么特别的功能)

    苹果xsmax有什么功能(苹果xsmax有什么特别的功能)

  • 快手大屏模式怎样设置回来(快手大屏模式怎样设置OPPO)

    快手大屏模式怎样设置回来(快手大屏模式怎样设置OPPO)

  • 魅族手机自动关机是什么原因(魅族手机自动关机重启是怎么回事)

    魅族手机自动关机是什么原因(魅族手机自动关机重启是怎么回事)

  • 快手通过消息添加是什么意思(快手通过消息添加你说明啥)

    快手通过消息添加是什么意思(快手通过消息添加你说明啥)

  • 留抵税额做进项转出怎么做分录
  • 个人所得税应纳税所得额减半征收
  • 营业外收入需要结转到本年利润吗
  • 代扣代缴增值税纳税义务发生时间
  • 小规模公司注销时账务要如何处理
  • 一次性就业补助金的领取条件
  • 不得抵扣的进项税额转出会计分录
  • 销售退回的货物应当由什么部门清点
  • 会计凭证填制错误怎么办
  • 事业单位结转结余科目
  • 公司股东可以自己买保险吗
  • 研发加计扣除税率
  • 修理费没有发票怎么做账
  • 复利现值是什么意思
  • 审计人员用餐费用
  • 研发支出费用化支出每个月都要结转吗
  • 2018工资个税税率表
  • 增值税计税依据包含消费税吗
  • 小规模纳税人可以抵扣进项税吗
  • 金税盘领用发票查询不到
  • 预缴税款的附加税可以抵扣吗
  • 开票时金额怎么能含税
  • 收到一笔款在在当月已退回怎么做账?
  • 化妆品的消费税率多少
  • 购买土地交易费用怎么算
  • 电脑桌面换壁纸的软件
  • 协调费用应该怎么表述才合理
  • 纳税人解除劳动合同补偿
  • php响应时间
  • ctl.start
  • win10平板模式怎么显示桌面
  • 应付账款收到票怎么做账
  • php 分页
  • 哪些情况即使取消核酸
  • 海关发票丢失怎么处理
  • php如何连接sql server
  • vue-axios详细介绍
  • web渗透违法吗
  • 【深度学习】datasets.ImageFolder 使用方法
  • php 方括号
  • linux用mv文件移动指定文件
  • 接受捐赠收入如何纳税
  • 其他权益工具投资是金融资产吗
  • 第6章 分支语句和逻辑运算符
  • 生产设备的折旧分录
  • 购买材料发票未到如何做账?
  • sql server 数据库技术
  • 金税四期对企业纳税管理影响分析
  • 视同销售是指什么?
  • 服务业的收入确认原则
  • 结转本年利润按什么算
  • 股东入股怎么做分录
  • 购买劳务费会计分录
  • 贷款转入账号
  • 税前扣除的职工福利费怎么算
  • 现金流量比率是什么意思
  • 企业计提坏账准备遵循的会计信息质量要求是
  • 什么是交易价格指数
  • mysql数据库技术介绍
  • ubuntu做开发怎么样
  • 桌面上家庭组图标是干嘛
  • win8怎么彻底删除软件
  • linux内核和根文件系统的关系
  • windows 相机打不开
  • Linux利用sftp命令传输文件(极少数人知道的方法)
  • cpio压缩
  • 笔记本接外设
  • win7系统步骤
  • 11月 Win8.1 Update 3更新哪些内容?开始菜单依然没有
  • Unity3D Editor类(Inspector) 编写经验总结
  • mingw 编译
  • opengl超级宝典第八版 pdf
  • java回收机制原理
  • 安徽国税局发票查询系统
  • 上海社保三方协议
  • 资本结构不合理的公司有哪些
  • 国家税务总局税收违法行为检举管理办法
  • 地税滞纳金如何做账
  • 车辆购置税退税申请表
  • 消费税的税率只有比例税率和定额税率两种判断题
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设