python - A-star 比 dijkstra 慢
问题描述
我有一个令人讨厌的错误,我在很长一段时间内都无法解决。我已经在 python 中使用 A*(A-star)和 Dijkstra 实现了迷宫求解,我的 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)
一个*:
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
解决方案
推荐阅读
- docker - 删除 Docker 磁盘映像大小
- python - 如何保存与旧版熊猫版本向后兼容的熊猫数据框?
- python - DataFrame.xs 的键入声明不正确:参数“key”应允许 Tuple[_str, ...]
- python - Selenium 不等待元素可见导致错误:无效元素状态
- python - Selenium Python 无法将两个列表写入不同的列
- node.js - 如何在 gitlab 克隆的 reactjs 项目上安装节点?
- python - 使用列表理解有条件地连接不均匀的字符串
- python - 将 Django Admin 与 Firebase 集成
- sonarqube - 确认此记录器配置是安全的
- c# - ValidateAntiForgeryToken 端点属性在 Asp.Net 核心 Angular Web 应用程序中每次 CSRF 攻击的使用情况