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使用线程封装的一个简单定时器类实例
May 16 Python
Python中的迭代器与生成器高级用法解析
Jun 28 Python
通过Python爬虫代理IP快速增加博客阅读量
Dec 14 Python
Python利用Beautiful Soup模块修改内容方法示例
Mar 27 Python
教你用Python写安卓游戏外挂
Jan 11 Python
python如何将图片转换为字符图片
Aug 19 Python
Python实现随机漫步功能
Jul 09 Python
Flask实现图片的上传、下载及展示示例代码
Aug 03 Python
python游戏地图最短路径求解
Jan 16 Python
Python3 无重复字符的最长子串的实现
Oct 08 Python
python ETL工具 pyetl
Jun 07 Python
深入了解Python 变量作用域
Jul 24 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
PHP利用COM对象访问SQLServer、Access
2006/10/09 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
PHP empty函数报错解决办法
2014/03/06 PHP
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
JS中script标签defer和async属性的区别详解
2016/08/12 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
简单实现jQuery多选框功能
2017/01/09 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
在Python的Django框架中生成CSV文件的方法
2015/07/22 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
python后端接收前端回传的文件方法
2019/01/02 Python
pandas 空数据处理方法详解
2019/11/02 Python
Python接口测试get请求过程详解
2020/02/28 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
学校经典推荐信
2013/10/30 职场文书
门诊挂号室室长岗位职责
2013/11/27 职场文书
学生保证书范文
2014/04/28 职场文书
县级文明单位申报材料
2014/05/23 职场文书
法定授权委托证明书
2014/09/27 职场文书
滞留工资返还协议书
2014/10/19 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
北京颐和园导游词
2015/01/30 职场文书
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA