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的循环体中使用else语句的方法
Mar 30 Python
python生成IP段的方法
Jul 07 Python
Python 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
使用numpy和PIL进行简单的图像处理方法
Jul 02 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
Python基础之高级变量类型实例详解
Jan 03 Python
Python Selenium安装及环境配置的实现
Mar 17 Python
Python selenium爬虫实现定时任务过程解析
Jun 08 Python
python中字典增加和删除使用方法
Sep 30 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
Feb 22 Python
django使用多个数据库的方法实例
Mar 04 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 flush()与ob_flush()的区别详解
2013/06/03 PHP
php使用curl访问https示例分享
2014/01/17 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
PHP实现倒计时功能
2020/11/16 PHP
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
AngularJS入门教程之表格实例详解
2016/07/27 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
序列化模块json代码实例详解
2020/03/03 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
koa中间件核心(koa-compose)源码解读分析
2020/06/15 Javascript
JS实现超级好看的鼠标小尾巴特效
2020/12/01 Javascript
windows上安装Anaconda和python的教程详解
2017/03/28 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
Python hashlib模块用法实例分析
2018/06/12 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
办公室驾驶员岗位职责
2013/11/15 职场文书
个人授权委托书
2014/04/03 职场文书
单位工作证明格式模板
2014/10/04 职场文书
党员个人自我评价
2015/03/03 职场文书
学校体育节班级口号
2015/12/25 职场文书
责任书格式
2019/04/18 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
vue判断按钮是否可以点击
2022/04/09 Vue.js