Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 搜索。从初始位置添加移动成本_Python_Search_A Star - Fatal编程技术网

Python 搜索。从初始位置添加移动成本

Python 搜索。从初始位置添加移动成本,python,search,a-star,Python,Search,A Star,如果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)

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

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

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


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

如果您认为我们需要有关该问题的更多信息。一个好的问题包括:问题的简要背景。对问题的清晰明确的陈述。期望输出的示例。最好是独立运行的代码片段。公平地说,问题是关于的,在标题和标签中都有说明。我们这些有it背景的人可以立即理解OP想要什么,即使它在其他人看来“神秘”。(这并不意味着这个问题无法改进)快速回答,将封闭列表更改为集合()添加以下内容是否足以将算法视为*?open_set[snode]=min_dist_from_initial_node(snode)+启发式(snode)现在,它在技术上不是a*因为它只是f=h?是的,我相信这是正确的,记住不管snode是否已经在open_集中,你都应该这样做。另外,根据我在评论中提到的维基百科文章,如果启发式函数是单调的,那么你只能有一个闭集,否则你可能会得到一个次优路径。但这超出了这个问题的范围,可能与你的实际需要有关,也可能与你的实际需要无关。。。