【问题标题】:a* search. adding movement cost from initial positiona* 搜索。从初始位置添加移动成本
【发布时间】:2012-03-20 17:04:48
【问题描述】:

如果 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

【问题讨论】:

  • 如果认为我们需要更多有关问题的信息。
  • 一个好的问题包括: 问题的简明背景。对问题的明确、清晰的陈述。所需输出的示例。最好是独立运行的 sn-p 代码。
  • 公平地说,这个问题专门针对A* algorithm,它在标题和标签中都有说明。我们这些有背景的人可以立即理解 OP 想要什么,即使它在其他人看来“神秘”。 (但这并不意味着这个问题不能使用一些改进)
  • 快速回答,把你的封闭列表改成set()

标签: python search a-star


【解决方案1】:

在最后一个if 中,如果 snode 不在 open_set 中(不是双关语!),您不应该只设置启发式,而是设置启发式加上当前节点的成本。并且如果 snode 在开放集中,您应该检查当前值和当前值之间的最小值(如果有两种或多种方式到达同一个节点,则应考虑成本最低的一种)。

这意味着您需要存储节点的“实际”成本和“估计”成本。初始节点的实际成本为零。对于每个新节点,它是另一个顶点的成本加上弧的成本(换句话说,最后一个节点的成本加上从该节点移动到当前节点的成本)之间的每个传入弧的最小值。估计成本必须将两个值相加:到目前为止的实际成本加上启发式函数。

我不知道节点在您的代码中是如何表示的,所以我无法给出更具体的建议。如果您仍有疑问,请编辑您的问题以提供更多详细信息。

【讨论】:

  • 添加以下内容是否足以使算法被视为a *? open_set[snode] = min_dist_from_initial_node(snode) + heuristic(snode) 现在,它在技术上不是 a*,因为它只是 f = h?
  • 是的,我相信它是正确的,记住无论snode是否已经在open_set中你都应该这样做。另外,根据我在 cmets 中提到的 Wikipedia 文章,如果您的启发式函数是单调的,则只能有一个 closed_set,否则您可能会得到一个次优路径。但这超出了这个问题的范围,可能与您的实际需求相关,也可能不相关......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
相关资源
最近更新 更多