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

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

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

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

维基百科给出的伪代码:

  1. function A*(start, goal)
  2. // The set of nodes already evaluated
  3. closedSet := {}
  4.  
  5. // The set of currently discovered nodes that are not evaluated yet.
  6. // Initially, only the start node is known.
  7. openSet := {start}
  8.  
  9. // For each node, which node it can most efficiently be reached from.
  10. // If a node can be reached from many nodes, cameFrom will eventually contain the
  11. // most efficient previous step.
  12. cameFrom := an empty map
  13.  
  14. // For each node, the cost of getting from the start node to that node.
  15. gScore := map with default value of Infinity
  16.  
  17. // The cost of going from start to start is zero.
  18. gScore[start] := 0
  19.  
  20. // For each node, the total cost of getting from the start node to the goal
  21. // by passing by that node. That value is partly known, partly heuristic.
  22. fScore := map with default value of Infinity
  23.  
  24. // For the first node, that value is completely heuristic.
  25. fScore[start] := heuristic_cost_estimate(start, goal)
  26.  
  27. while openSet is not empty
  28. current := the node in openSet having the lowest fScore[] value
  29. if current = goal
  30. return reconstruct_path(cameFrom, current)
  31.  
  32. openSet.Remove(current)
  33. closedSet.Add(current)
  34.  
  35. for each neighbor of current
  36. if neighbor in closedSet
  37. continue // Ignore the neighbor which is already evaluated.
  38.  
  39. if neighbor not in openSet // Discover a new node
  40. openSet.Add(neighbor)
  41.  
  42. // The distance from start to a neighbor
  43. //the "dist_between" function may vary as per the solution requirements.
  44. tentative_gScore := gScore[current] + dist_between(current, neighbor)
  45. if tentative_gScore >= gScore[neighbor]
  46. continue // This is not a better path.
  47.  
  48. // This path is the best until now. Record it!
  49. cameFrom[neighbor] := current
  50. gScore[neighbor] := tentative_gScore
  51. fScore[neighbor] := gScore[neighbor] + heuristic_cost_estimate(neighbor, goal)
  52.  
  53. return failure
  54.  
  55. function reconstruct_path(cameFrom, current)
  56. total_path := {current}
  57. while current in cameFrom.Keys:
  58. current := cameFrom[current]
  59. total_path.append(current)
  60. return total_path

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

  1. import math
  2. def shortest_path(M,start,goal):
  3. sx=M.intersections[start][]
  4. sy=M.intersections[start][]
  5. gx=M.intersections[goal][]
  6. gy=M.intersections[goal][]
  7. h=math.sqrt((sx-gx)*(sx-gx)+(sy-gy)*(sy-gy))
  8. closedSet=set()
  9. openSet=set()
  10. openSet.add(start)
  11. gScore={}
  12. gScore[start]=
  13. fScore={}
  14. fScore[start]=h
  15. cameFrom={}
  16. sumg=
  17. NEW=
  18. BOOL=False
  19. while len(openSet)!=:
  20. MAX=
  21. for new in openSet:
  22. print("new",new)
  23. if fScore[new]<MAX:
  24. MAX=fScore[new]
  25. #print("MAX=",MAX)
  26. NEW=new
  27. current=NEW
  28. print("current=",current)
  29. if current==goal:
  30. return reconstruct_path(cameFrom,current)
  31. openSet.remove(current)
  32. closedSet.add(current)
  33. #dafult=M.roads(current)
  34. for neighbor in M.roads[current]:
  35. BOOL=False
  36. print("key=",neighbor)
  37. a={neighbor}
  38. if len(a&closedSet)>:
  39. continue
  40. print("key is not in closeSet")
  41. if len(a&openSet)==:
  42. openSet.add(neighbor)
  43. else:
  44. BOOL=True
  45. x= M.intersections[current][]
  46. y= M.intersections[current][]
  47. x1=M.intersections[neighbor][]
  48. y1=M.intersections[neighbor][]
  49. g=math.sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1))
  50. h=math.sqrt((x1-gx)*(x1-gx)+(y1-gy)*(y1-gy))
  51.  
  52. new_gScore=gScore[current]+g
  53. if BOOL==True:
  54. if new_gScore>=gScore[neighbor]:
  55. continue
  56. print("new_gScore",new_gScore)
  57. cameFrom[neighbor]=current
  58. gScore[neighbor]=new_gScore
  59. fScore[neighbor] = new_gScore+h
  60. print("fScore",neighbor,"is",new_gScore+h)
  61. print("fScore=",new_gScore+h)
  62.  
  63. print("__________++--------------++_________")
  64.  
  65. def reconstruct_path(cameFrom,current):
  66. print("已到达lllll")
  67. total_path=[]
  68. total_path.append(current)
  69. for key,value in cameFrom.items():
  70. print("key",key,":","value",value)
  71.  
  72. while current in cameFrom.keys():
  73.  
  74. current=cameFrom[current]
  75. total_path.append(current)
  76. total_path=list(reversed(total_path))
  77. return total_path

python 实现A*算法的更多相关文章

  1. python数据结构与算法

    最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...

  2. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

  3. Python数据结构与算法--List和Dictionaries

    Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...

  4. Python数据结构与算法--算法分析

    在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...

  5. Python实现ID3算法

    自己用Python写的数据挖掘中的ID3算法,现在觉得Python是实现算法的最好工具: 先贴出ID3算法的介绍地址http://wenku.baidu.com/view/cddddaed0975f4 ...

  6. 以图搜图(一):Python实现dHash算法(转)

    近期研究了一下以图搜图这个炫酷的东西.百度和谷歌都有提供以图搜图的功能,有兴趣可以找一下.当然,不是很深入.深入的话,得运用到深度学习这货.Python深度学习当然不在话下. 这个功能最核心的东西就是 ...

  7. Python之排序算法:快速排序与冒泡排序

    Python之排序算法:快速排序与冒泡排序 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/7828610.html 入坑(简称IT)这一行也有些年头了,但自老师 ...

  8. python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序

    说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...

  9. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  10. Python使用DDA算法和中点Bresenham算法画直线

    title: "Python使用DDA算法和中点Bresenham算法画直线" date: 2018-06-11T19:28:02+08:00 tags: ["图形学&q ...

随机推荐

  1. 各种语言web性能简单对比测试

    忽然想比较一下  python  nodejs  go 的web 响应,就简单的写了个性能对比测试. 测试目标:1 . i5 4核 32G  同一机器   linux 2.  用python(flas ...

  2. 前端--HTML简介

    软件开发架构: c/s架构 客户端 服务端 b/s架构 浏览器 服务端 本质:b/s架构也是c/s架构 HTTP协议 超文本传输协议:规定了客户端与服务端之间消息传输的格式 四个特性: 1.基于TCP ...

  3. MySQL--视图、触发器、事务、存储过程、内置函数、流程控制、索引

    视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复 ...

  4. JQMObile 优势

    1.跨平台  目前大部分的移动设备浏览器都支持HTML5标准,jQuery Mobile以HTML5标记配置网页,所以可以跨不同的移动设备,如Apple iOS,Android,BlackBerry, ...

  5. linux升级或安装程序后无法进入图形界面

    报错如下: Failed to start the X server (your graphical interface). lt is likely that it is not set up co ...

  6. Leetcode74. Search a 2D Matrix搜索二维矩阵

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: matrix ...

  7. Leetcode8.String to Integer (atoi)字符串转整数(atoi)

    实现 atoi,将字符串转为整数. 该函数首先根据需要丢弃任意多的空格字符,直到找到第一个非空格字符为止.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字 ...

  8. poj 2288 Islands and Bridges——状压dp(哈密尔顿回路)

    题目:http://poj.org/problem?id=2288 不知为什么记忆化搜索就是WA得不得了! #include<iostream> #include<cstdio> ...

  9. linux 下批量在多文件中替换字符串

    sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录` 注意:`` 符号在shell里面正式的名称叫做backquote , 一般叫做命令替换其作用 ...

  10. bootStrap表单验证插件的使用

    bootStrapValidator插件的使用 1.插件的下载和引用 首先要引入bootstrapValidator插件.链接的地址:https://www.bootcdn.cn/jquery.boo ...