A星比dijkstra慢

时间:2018-05-05 16:58:14

标签: python python-3.x dijkstra a-star maze

我有一个令人讨厌的错误,我很长时间都无法解决。 我在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

0 个答案:

没有答案