Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Algorithm_Graph Algorithm - Fatal编程技术网

Python 访问所有节点并将其添加到路径

Python 访问所有节点并将其添加到路径,python,algorithm,graph-algorithm,Python,Algorithm,Graph Algorithm,我正在尝试访问所有节点,返回开始节点(Neamt),并将访问的节点添加到path,但问题是如果我到达死胡同,城市将从路径中删除 下面是代码生成的可能路径中的1: 如上面的路径所示,没有“Hirsova”、“Eforie”、“Giurgiu”。 真正发生的事情是当我在PyCharm上调试时:“Hirsova”、“Eforie”、“Giurgiu”被添加到路径,但随后它们被从路径中删除 我想将这些城市按相反顺序包含到路径中。例如: 为什么要从路径中删除它们,因为没有像这样的.append方法的

我正在尝试访问所有节点,返回开始节点(
Neamt
),并将访问的节点添加到
path
,但问题是如果我到达死胡同,城市将从
路径中删除

下面是代码生成的可能路径
中的1:

如上面的
路径所示
,没有
“Hirsova”、“Eforie”、“Giurgiu”
。 真正发生的事情是当我在PyCharm上调试时:
“Hirsova”、“Eforie”、“Giurgiu”
被添加到
路径
,但随后它们被从
路径
中删除

我想将这些城市按相反顺序包含到路径中。例如:

为什么要从
路径
中删除它们,因为没有像
这样的
.append
方法的任何对立面


任何内容都不会被删除,您只需看到不同帧的
find_paths
具有不同的
path
值<代码>列表(路径)
进行复制,这样每个函数调用都会收到自己的列表,一旦函数调用结束并向上移动递归堆栈,您就会看到一个没有附加节点的旧值
path

不会删除任何内容,您只需看到不同的
find_path
帧以及不同的
path
值<代码>列表(路径)
进行复制,以便每个函数调用都会收到自己的列表,一旦函数调用结束并向上移动递归堆栈,您就会看到
path
的旧值,该值没有附加节点。

您只需在输入递归之前和之后进行深度优先搜索并添加节点即可。这会在启动路径时在列表上放置一个名称,然后在递归展开时再次返回。这个过程是:

  • 添加城市
  • 在子对象上递归(如果子对象未被访问)
  • 再次添加城市(如果它不是路径的终点)
  • 您需要添加路径端点检查,这样就不会连续两次添加像Eforie这样的城市。如果一个城市没有未访问的孩子,你就不会再添加它。要做到这一点,只需跟踪递归的计数

    比如:

    def find_paths(node, cities, path, distance, visited = set()):
    
        visited.add(node) # keep track of visited nodes
        path.append(node)
    
        # Fork paths for all possible cities not yet used
        count = 0 # avoid adding end paths twice
        for city in cities[node].keys(): # only recurse on children not the whole list
            if city not in visited: 
                count += 1
                find_paths(city, cities, path, distance, visited)
        if count > 0 : # only add again if there were children
            path.append(node)
    
    a = []
    find_paths('Neamt', cities, a, 0)
    print(a)
    
    导致

    法加拉斯、西比乌、阿拉德、蒂米苏拉、卢戈吉、迈哈迪亚、德罗贝塔、克雷奥瓦、皮特斯蒂、里姆尼库·维利亚、皮特斯蒂、克雷奥瓦、德罗贝塔、迈哈迪亚、卢戈吉、蒂米苏拉、泽林德、阿拉德、西比乌、法加拉斯、朱尔吉乌、布加勒斯特、赫索瓦、埃弗里、赫索瓦、乌尔茨“iceni”、“Vaslui”、“Iasi”、“Neamt”]


    在进入递归之前和之后,您只需执行深度优先搜索并添加节点。这会在启动路径时将名称放在列表上,然后在递归展开时将名称放回列表。该过程是:

  • 添加城市
  • 在子对象上递归(如果子对象未被访问)
  • 再次添加城市(如果它不是路径的终点)
  • 您需要添加路径结束检查,这样您就不会连续两次添加像Eforie这样的城市。如果一个城市没有未访问的子城市,您就不会再添加它。为此,只需跟踪递归计数

    比如:

    def find_paths(node, cities, path, distance, visited = set()):
    
        visited.add(node) # keep track of visited nodes
        path.append(node)
    
        # Fork paths for all possible cities not yet used
        count = 0 # avoid adding end paths twice
        for city in cities[node].keys(): # only recurse on children not the whole list
            if city not in visited: 
                count += 1
                find_paths(city, cities, path, distance, visited)
        if count > 0 : # only add again if there were children
            path.append(node)
    
    a = []
    find_paths('Neamt', cities, a, 0)
    print(a)
    
    导致

    法加拉斯、西比乌、阿拉德、蒂米苏拉、卢戈吉、迈哈迪亚、德罗贝塔、克雷奥瓦、皮特斯蒂、里姆尼库·维利亚、皮特斯蒂、克雷奥瓦、德罗贝塔、迈哈迪亚、卢戈吉、蒂米苏拉、泽林德、阿拉德、西比乌、法加拉斯、朱尔吉乌、布加勒斯特、赫索瓦、埃弗里、赫索瓦、乌尔茨“iceni”、“Vaslui”、“Iasi”、“Neamt”]


    您可以尝试删除语句
    dict(cities)
    list(path)
    中的复制对象,并将它们保留在
    cities
    path
    中。您需要使用@AzatIbrakov中的算法,它们会出现,但无法返回到开始节点。您可以尝试删除语句
    dict(cities)
    list(path)中的复制对象
    然后离开它们
    城市
    路径
    你需要使用@AzatIbrakov的算法,它们出现了,但无法返回到起始节点。很好,谢谢。你能推荐任何算法来检查所有节点并返回起始节点吗?(
    单源算法
    )这不是TSP@AlexHall-这是简单的旧深度优先搜索。很好,谢谢。您能推荐任何算法来检查所有节点并返回开始节点吗?(
    单源算法
    )这不是TSP@AlexHall-这是简单的旧深度优先搜索。每当
    count
    增加1时,
    find_paths
    调用。如果count>0
    如何变成真的
    如果count>0
    如何?@ilvthsgm每次迭代
    find_paths
    都会得到自己版本的
    count
    。所以当我们增加
    count+=1
    时,它只在函数的调用。在查看所有子节点后,它将表示在返回之前我们访问了多少节点。每当
    count
    增加1时,
    find_paths
    调用。如果count>0如何变为真?@ilvthsgm每次迭代
    find_paths
    都将得到自己的
    c版本count
    。因此,当我们增加
    count+=1
    时,它仅在函数调用的范围内。查看所有子节点后,它将表示在返回之前我们访问了多少节点。