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使用urllib2实现发送带cookie的请求
Apr 28 Python
python 禁止函数修改列表的实现方法
Aug 03 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
django基于存储在前端的token用户认证解析
Aug 06 Python
django2.2 和 PyMySQL版本兼容问题
Feb 17 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
jupyter notebook 多行输出实例
Apr 09 Python
Python把图片转化为pdf代码实例
Jul 28 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 Python
Python2及Python3如何实现兼容切换
Sep 01 Python
Python实战之实现康威生命游戏
Apr 26 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
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
PHP延迟静态绑定示例分享
2014/06/22 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
安装docker和docker-compose实例详解
2019/07/30 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
javascript AutoScroller 函数类
2009/05/29 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
npm国内镜像 安装失败的几种解决方案
2017/06/04 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
python字符串连接方法分析
2016/04/12 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
基于python的列表list和集合set操作
2019/11/24 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
自学python用什么系统好
2020/06/23 Python
销售工作岗位职责
2013/12/24 职场文书
服装机修工岗位职责
2013/12/26 职场文书
机关单位动员会主持词
2014/03/20 职场文书
职业生涯规划书前言
2014/04/15 职场文书
普通话宣传标语
2014/06/26 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
运输公司工作总结
2015/08/11 职场文书
七年级上册生物的课件
2019/08/07 职场文书
MySQL中in和exists区别详解
2021/06/03 MySQL
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS
Spring Boot项目传参校验的最佳实践指南
2022/04/05 Java/Android