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模块学习 filecmp 文件比较
Aug 27 Python
python实现哈希表
Feb 07 Python
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
python计算auc指标实例
Jul 13 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
python实现彩色图转换成灰度图
Jan 15 Python
Python操作配置文件ini的三种方法讲解
Feb 22 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
Feb 27 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
使用OpenCV去除面积较小的连通域
Jul 05 Python
Python 使用dict实现switch的操作
Apr 07 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数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
2018/06/22 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
jQuery实现跨域
2015/02/03 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
详解离线安装npm包的几种方法
2018/11/25 Javascript
JavaScript使用canvas绘制随机验证码
2020/02/17 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
python绘制封闭多边形教程
2020/02/18 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
最新的咖啡店创业计划书
2013/12/30 职场文书
职工运动会邀请函
2014/02/02 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
社区平安建设方案
2014/05/25 职场文书
实验室的标语
2014/06/20 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
2014年统战工作总结
2014/12/09 职场文书
小学中等生评语
2014/12/29 职场文书
个人自荐书范文
2015/03/09 职场文书
鉴史问廉观后感
2015/06/10 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
基于JavaScript实现年月日三级联动
2021/06/22 Javascript