【发布时间】:2020-09-15 21:25:24
【问题描述】:
我在 matplotlib 中有一个网格(20*20 或 40*40 基于用户的选择),其中包含基于 LatLong 位置划分的数据。该网格中的每个单元格代表一个 0.002 或 0.001 的区域(例如:[-70.55, 43.242] 到 [-70.548, 43.244])。网格根据阈值着色,例如高于 30 的任何东西都是绿色的,低于 30 的任何东西都是红色的。
我实现了 A start 算法,以便在该图上从一个位置(单元格)移动到另一个位置,同时避开所有绿色单元格。在绿色和红色单元格的边界上行驶的成本是 1.3,而对角线的成本是 1.5,在两个红色单元格之间行驶的成本是 1。
我正在使用对角距离启发式算法,对于每个单元格,我都会获取所有可能的邻居,并根据阈值设置它们的 G 值。
现在我大部分时间都能找到正确的路径,并且对于附近的单元格,它的运行时间不到 1 秒。但是当我走得更远时,它需要 14-18 秒。
我不明白我在这里做错了什么?我一直在想办法改进它,但失败了。
这是算法的一个片段。我想指出,确定可访问的邻居和设置 G 值在这里可能不是问题,因为每个函数调用的运行时间约为 0.02 - 0.03 秒。
感谢任何建议!谢谢
def a_star(self, start, end):
startNode = Node(None, start)
endNode = Node(None, end)
openList = []
closedList = []
openList.append(startNode)
while len(openList) > 0:
current = openList[0]
if current.location == endNode.location:
path = []
node = current
while node is not None:
path.append(node)
node = node.parent
return path[::-1]
openList.pop(0)
closedList.append(current)
# This takes around 0.02 0.03 seconds
neighbours = self.get_neighbors(current)
for neighbour in neighbours:
append = True
for node in closedList:
if neighbour.location == node.location:
append = False
break
for openNode in openList:
if neighbour.location == openNode.location:
if neighbour.g < openNode.g:
append = False
openNode.g = neighbour.g
break
if append:
neighbour.h = round(self.heuristic(neighbour.location, endNode.location), 3)
neighbour.f = round(neighbour.g + neighbour.h, 3)
bisect.insort_left(openList, neighbour)
return False
编辑:添加节点片段
class Node:
def __init__(self, parent, location):
self.parent = parent
self.location = location
self.g = 0
self.h = 0
self.f = 0
编辑 2:添加图片
圆是起点,星是终点。黄色单元格不可访问,因此黄色单元格上没有对角线路径,并且无法在两个黄色单元格之间移动。
【问题讨论】:
-
我对@987654329@ 感到困惑:
neighbor似乎是Node,并且它至少具有三个值:neighbor.f、neighbor.g和neighbor.location。但是您创建第一个节点是Node(None, start),所以只有两个属性?您能否提供Node的定义以及理解该部分所需的任何内容? -
@trincot 当然,当我初始化前两个节点时,第一个参数
None是父节点,第二个是位置[-74.420, 45.532]。f, g, and h设置为 0。抱歉,如果这是不好的做法,我对这些事情不是很有经验。 -
两个节点可以有相同的位置吗?您是否曾经为
.h赋值?您在哪里为.g赋值?很抱歉,只有部分信息很难写出完整的答案。 -
@trincot 是的,两个节点可以有相同的位置。 H 在这里被分配了一个值
self.heuristic(neighbour.location, endNode.location)。当我得到一个节点的所有邻居时,G 在这里被分配了一个值neighbours = self.get_neighbors(current)。将 G 分配在那里的原因是因为我需要检查所有周围的邻居以确定 G 是 1、1.3 还是 1.5 -
好的,我想我现在明白了;-) 感谢您的耐心等待。现在我要去绘图板...
标签: python algorithm matplotlib search a-star