我有一个令人讨厌的错误,我很长时间都无法解决。 我在python中使用A *(A-star)和Dijkstra实现了Maze Solving,而我的A *实际上比Dijkstra慢。
这两部分都是相同的:
open_list={}
dist=dict([(v, float('inf')) for v in self.adj_list])
dist[start]=0
parents=dict([(v,None) for v in self.adj_list])
marked={}
marked[start]=True
while open_list:
(tmp,val)=min(open_list.items(), key=lambda x: x[1])
#take current minimum from open_list, add it to closed list and
#remove it from open_list
del open_list[tmp]
#if we found exit
if tmp == stop:
path=deque([])
while parents[tmp]:
path.appendleft(tmp)
tmp=parents[tmp]
path.appendleft(start)
return list(path)
A *:
for v,w in self.adj_list[tmp]:
if v not in marked:
marked[v]=True
dist[v]=dist[tmp]+w
open_list[v]=dist[v]+self.h[v]
parents[v]=tmp
elif v in open_list:
if dist[v] > dist[tmp]+w:#better path exists
dist[v]=dist[tmp]+w
parents[v]=tmp
open_list[v]=dist[v]#update value in open_list
的Dijkstra:
for v,w in self.adj_list[tmp]:
if v not in marked:
marked[v]=True
dist[v]=dist[tmp]+w
open_list[v]=dist[v]
parents[v]=tmp
elif v in open_list:
if dist[v] > dist[tmp]+w:
dist[v]=dist[tmp]+w
parents[v]=tmp
open_list[v]=dist[v]
正如你所看到的,它们是相同的(除了A *中的启发式部分),但由于某种原因,A *较慢并且更频繁地进入if dist[v] > dist[tmp]+w:#better path exists
这个分支。启发式很好,我多次检查
有什么想法吗?
如果您想尝试,here是Github repo