学习Python中A*算法实现的详细步骤

PHPz
풀어 주다: 2024-01-23 22:51:05
앞으로
568명이 탐색했습니다.

以此加权图为例,用Python实现A*算法。加权图中的节点用粉红色圆圈表示,并且给出了沿节点的路径的权重。节点上方的数字代表节点的启发式值。

如何在Python中实现A*算法?Python实现A*算法详细流程

首先为算法创建类。一个用于存储与起始节点的距离,另一个用于存储父节点。并将它们初始化为0,以及起始节点。

def aStarAlgo(start_node,stop_node):
open_set=set(start_node)
closed_set=set()
g={}
parents={}
g[start_node]=0
parents[start_node]=start_node
로그인 후 복사

找到具有最低f(n)值的相邻节点,针对到达目标节点的条件进行编码。如果不是这种情况,则将当前节点放入打开列表中,并设置其父节点。

While len(open_set)>0:
n=None
for v in open_set:
if n==None or g[v]+heuristic(v)<g[n]+heuristic(n):
n=v
if n==stop_node or Graph_nodes[n]==None:
pass
else:
for(m,weight)in get_neighbors(n):
if m not in open_set and m not in closed_set:
open_set.add(m)
parents[m]=n
g[m]=g[n]+weight
로그인 후 복사

如果相邻的g值低于当前节点并且在封闭列表中,则将其替换为这个新节点作为父节点。

else:
if g[m]>g[n]+weight:
g[m]=g[n]+weight
parents[m]=n
if m in closed_set:
closed_set.remove(m)
open_set.add(m)
로그인 후 복사

如果当前g低于前一个g,并且其相邻在open list中,则将其替换为较低的g值,并将相邻的parent更改为当前节点。

如果不在两个列表中,则将其添加到打开列表并设置其g值。

if n==None:
print('Path does not exist!')
return None
if n==stop_node:
path=[]
while parents[n]!=n:
path.append(n)
n=parents[n]
path.append(start_node)
path.reverse()
print('Path found:{}'.format(path))
return path
open_set.remove(n)
closed_set.add(n)
print('Path does not exist!')
return None
로그인 후 복사

现在,定义一个函数来返回相邻节点及其距离。

def get_neighbors(v):
if v in Graph_nodes:
return Graph_nodes[v]
else:
return None
로그인 후 복사

此外,创建一个函数来检查启发式值。

def heuristic(n):
H_dist={
'A':11,
'B':6,
'C':99,
'D':1,
'E':7,
'G':0,
}
return H_dist[n]
로그인 후 복사

描述一下图表并调用A*函数。

Graph_nodes={
'A':[('B',2),('E',3)],
'B':[('C',1),('G',9)],
'C':Node,
'E':[('D',6)],
'D':[('G',1)],
}
aStarAlgo('A','G')
로그인 후 복사

算法遍历图,找到代价最小的路径。

这是通过E => D => G。

위 내용은 学习Python中A*算法实现的详细步骤의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:163.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!