python 实现A*算法的示例代码


Posted in Python onAugust 13, 2018

A*作为最常用的路径搜索算法,值得我们去深刻的研究。路径规划项目。先看一下维基百科给的算法解释:https://en.wikipedia.org/wiki/A*_search_algorithm

A *是最佳优先搜索它通过在解决方案的所有可能路径(目标)中搜索导致成本最小(行进距离最短,时间最短等)的问题来解决问题。 ),并且在这些路径中,它首先考虑那些似乎最快速地引导到解决方案的路径。它是根据加权图制定的:从图的特定节点开始,它构造从该节点开始的路径树,一次一步地扩展路径,直到其一个路径在预定目标节点处结束。

在其主循环的每次迭代中,A *需要确定将其部分路径中的哪些扩展为一个或多个更长的路径。它是基于成本(总重量)的估计仍然到达目标节点。具体而言,A *选择最小化的路径

F(N)= G(N)+ H(n)

其中n是路径上的最后一个节点,g(n)是从起始节点到n的路径的开销,h(n)是一个启发式,用于估计从n到目标的最便宜路径的开销。启发式是特定于问题的。为了找到实际最短路径的算法,启发函数必须是可接受的,这意味着它永远不会高估实际成本到达最近的目标节点。

维基百科给出的伪代码:

function A*(start, goal)
  // The set of nodes already evaluated
  closedSet := {}

  // The set of currently discovered nodes that are not evaluated yet.
  // Initially, only the start node is known.
  openSet := {start}

  // For each node, which node it can most efficiently be reached from.
  // If a node can be reached from many nodes, cameFrom will eventually contain the
  // most efficient previous step.
  cameFrom := an empty map

  // For each node, the cost of getting from the start node to that node.
  gScore := map with default value of Infinity

  // The cost of going from start to start is zero.
  gScore[start] := 0

  // For each node, the total cost of getting from the start node to the goal
  // by passing by that node. That value is partly known, partly heuristic.
  fScore := map with default value of Infinity

  // For the first node, that value is completely heuristic.
  fScore[start] := heuristic_cost_estimate(start, goal)

  while openSet is not empty
    current := the node in openSet having the lowest fScore[] value
    if current = goal
      return reconstruct_path(cameFrom, current)

    openSet.Remove(current)
    closedSet.Add(current)

    for each neighbor of current
      if neighbor in closedSet
        continue // Ignore the neighbor which is already evaluated.

      if neighbor not in openSet // Discover a new node
        openSet.Add(neighbor)
      
      // The distance from start to a neighbor
      //the "dist_between" function may vary as per the solution requirements.
      tentative_gScore := gScore[current] + dist_between(current, neighbor)
      if tentative_gScore >= gScore[neighbor]
        continue // This is not a better path.

      // This path is the best until now. Record it!
      cameFrom[neighbor] := current
      gScore[neighbor] := tentative_gScore
      fScore[neighbor] := gScore[neighbor] + heuristic_cost_estimate(neighbor, goal) 

  return failure

function reconstruct_path(cameFrom, current)
  total_path := {current}
  while current in cameFrom.Keys:
    current := cameFrom[current]
    total_path.append(current)
  return total_path

下面是UDACITY课程中路径规划项目,结合上面的伪代码,用python 实现A* 

import math
def shortest_path(M,start,goal):
  sx=M.intersections[start][0]
  sy=M.intersections[start][1]
  gx=M.intersections[goal][0]
  gy=M.intersections[goal][1] 
  h=math.sqrt((sx-gx)*(sx-gx)+(sy-gy)*(sy-gy))
  closedSet=set()
  openSet=set()
  openSet.add(start)
  gScore={}
  gScore[start]=0
  fScore={}
  fScore[start]=h
  cameFrom={}
  sumg=0
  NEW=0
  BOOL=False
  while len(openSet)!=0: 
    MAX=1000
    for new in openSet:
      print("new",new)
      if fScore[new]<MAX:
        MAX=fScore[new]
        #print("MAX=",MAX)
        NEW=new
    current=NEW
    print("current=",current)
    if current==goal:
      return reconstruct_path(cameFrom,current)
    openSet.remove(current)
    closedSet.add(current)
    #dafult=M.roads(current)
    for neighbor in M.roads[current]:
      BOOL=False
      print("key=",neighbor)
      a={neighbor}
      if len(a&closedSet)>0:
        continue
      print("key is not in closeSet")
      if len(a&openSet)==0:
        openSet.add(neighbor)  
      else:
        BOOL=True
      x= M.intersections[current][0]
      y= M.intersections[current][1]
      x1=M.intersections[neighbor][0]
      y1=M.intersections[neighbor][1]
      g=math.sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1))
      h=math.sqrt((x1-gx)*(x1-gx)+(y1-gy)*(y1-gy)) 
      
      new_gScore=gScore[current]+g
      if BOOL==True:
        if new_gScore>=gScore[neighbor]:
          continue
      print("new_gScore",new_gScore) 
      cameFrom[neighbor]=current
      gScore[neighbor]=new_gScore     
      fScore[neighbor] = new_gScore+h
      print("fScore",neighbor,"is",new_gScore+h)
      print("fScore=",new_gScore+h)
      
    print("__________++--------------++_________")
                   
def reconstruct_path(cameFrom,current):
  print("已到达lllll")
  total_path=[]
  total_path.append(current)
  for key,value in cameFrom.items():
    print("key",key,":","value",value)
    
  while current in cameFrom.keys():
    
    current=cameFrom[current]
    total_path.append(current)
  total_path=list(reversed(total_path))  
  return total_path

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之从if开始语句的征程
Sep 14 Python
Python实现计算文件夹下.h和.cpp文件的总行数
Apr 23 Python
浅析python递归函数和河内塔问题
Apr 18 Python
从头学Python之编写可执行的.py文件
Nov 28 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
python中使用while循环的实例
Aug 05 Python
python实现复制大量文件功能
Aug 31 Python
Django之路由层的实现
Sep 09 Python
python 实现两个线程交替执行
May 02 Python
Django 用户登陆访问限制实例 @login_required
May 13 Python
Win10下用Anaconda安装TensorFlow(图文教程)
Jun 18 Python
python 贪心算法的实现
Sep 18 Python
Python绘制KS曲线的实现方法
Aug 13 #Python
Python标准库shutil用法实例详解
Aug 13 #Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 #Python
python之super的使用小结
Aug 13 #Python
Selenium控制浏览器常见操作示例
Aug 13 #Python
详解python3中的真值测试
Aug 13 #Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 #Python
You might like
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
PHP字符串与数组处理函数用法小结
2020/01/07 PHP
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
CheckBox多选取值及判断CheckBox选中是否为空的实例
2017/10/31 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
Python中Django框架利用url来控制登录的方法
2015/07/25 Python
Python实现二叉搜索树
2016/02/03 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
VSCode Python开发环境配置的详细步骤
2019/02/22 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
Python根据服务获取端口号的方法
2019/09/25 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
大学生职业生涯规划范文
2013/12/31 职场文书
停电放假通知
2015/04/14 职场文书
《春酒》教学反思
2016/02/22 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
Redis特殊数据类型bitmap位图
2022/06/01 Redis