У меня есть неприятная ошибка, которую я не могу решить в течение достаточно долгого времени.
Я реализовал Maze Solving, используя A * (A-star) и Dijkstra в Python, и мой 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
Дейкстр:
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
этой ветви гораздо чаще. Эвристика хорошая, я проверял несколько раз
Есть идеи?
Если вы хотите попробовать, здесь - это Github repo