如果f = g + h,那么在下面的代码中我会添加g?
此外,除了从我的初始位置添加移动成本之外,我还能如何使这段代码更有效率?
def a_star(initial_node):
open_set, closed_set = dict(), list()
open_set[initial_node] = heuristic(initial_node)
while open_set:
onode = get_next_best_node(open_set)
if onode == GOAL_STATE:
return reconstruct_path(onode)
del open_set[onode]
closed_set.append(onode)
for snode in get_successor_nodes(onode):
if snode in closed_set:
continue
if snode not in open_set:
open_set[snode] = heuristic(snode)
self.node_rel[snode] = onode
return False
答案 0 :(得分:0)
在上一个if
中,如果snode不在open_set中(没有双关语!),则不应该只设置启发式,而应该设置启发式加上当前节点的成本。如果在开放集中snode ,则应检查当前值与当前值之间的最小值(如果有两种或更多种方法到达同一节点,则应考虑成本最低的节点) )。
这意味着您需要存储节点的“实际”成本和“估计”成本。初始节点的实际成本为零。对于每个新节点,它是另一个顶点的成本加上弧的成本之间的每个传入弧的最小值(换句话说,最后一个节点的成本加上从那个节点移动到当前节点的成本)。估计的成本必须将两个值相加:到目前为止的实际成本加上启发式函数。
我不知道你的代码中是如何表示节点的,所以我不能给出更具体的建议。如果您仍有疑问,请编辑您的问题,提供更多详细信息。