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

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

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

其中n是路径上的最后一个节点,gn)是从起始节点到n的路径的开销,hn)是一个启发式,用于估计从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][]
sy=M.intersections[start][]
gx=M.intersections[goal][]
gy=M.intersections[goal][]
h=math.sqrt((sx-gx)*(sx-gx)+(sy-gy)*(sy-gy))
closedSet=set()
openSet=set()
openSet.add(start)
gScore={}
gScore[start]=
fScore={}
fScore[start]=h
cameFrom={}
sumg=
NEW=
BOOL=False
while len(openSet)!=:
MAX=
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)>:
continue
print("key is not in closeSet")
if len(a&openSet)==:
openSet.add(neighbor)
else:
BOOL=True
x= M.intersections[current][]
y= M.intersections[current][]
x1=M.intersections[neighbor][]
y1=M.intersections[neighbor][]
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

最新文章

  1. 浅谈Hybrid技术的设计与实现第三弹——落地篇
  2. JavaScript的几种继承方式
  3. l来自wentao:项目加入缓存(redis),实时调试时用 -----可视化缓存,flushdb
  4. 二、MongoDB的基础知识简介
  5. 普通Jquery的ajax判断重复和formvalidator的ajaxValidator区别
  6. (转)Salesforce的440亿美金并购宣告企业软件市场进入3.0互联网化时代
  7. CSS 盒子模型(Box model)中的 padding 与 margin
  8. JQ异步调用
  9. VLC命令参数(转载)
  10. 自定义绘制View
  11. 在OpenShift平台开发Node.js程序
  12. react - 解刨组件的多种写法
  13. 如何写SysV服务管理脚本
  14. Linux Debugging (九) 一次生产环境下的“内存泄露”
  15. 几何概型 uva11722
  16. https openssl http2
  17. C++ Standards Support in GCC - GCC 对 C++ 标准的支持
  18. logback配置详解
  19. [转帖]Linux系统/dev/mapper目录浅谈
  20. 【phpstudy】安装Oracle 客户端 并连接

热门文章

  1. java list转换json格式
  2. java-异常处理2
  3. 初探iview
  4. php收集表单数据-$GET和$POST的区别
  5. ajax下载小于500M大文件【原】
  6. vue-waterfall2 基于Vue.js 瀑布流组件
  7. php怎么自动加载
  8. 【祈福】NOIP战后占卜:众星陨落,天命难违
  9. 2018-11-30-WPF-解决-ListView-的滚动条不显示
  10. Leetcode771.Jewels and Stones宝石与石头