Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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元组字典中的DFS_Python_Algorithm_Graph_Depth First Search - Fatal编程技术网

python元组字典中的DFS

python元组字典中的DFS,python,algorithm,graph,depth-first-search,Python,Algorithm,Graph,Depth First Search,所以我花了5个小时在谷歌上搜索DFS、BFS、A*、贝尔曼福特和其他公司 我有roads=[('a',[('b',5.0),('c',8.0)],('b',[('a',5.0),('d',6.0)],('c',[('a',8.0),('d',2.0)],('d',[('b',6.0),('c',2.0),('e',12.0),('f',2.0)],('e',['d',12.0),(', ('g',3.0)],('f',[('d',2.0),('g',7.0)],('g',[('e',3.0),(

所以我花了5个小时在谷歌上搜索DFS、BFS、A*、贝尔曼福特和其他公司

我有
roads=[('a',[('b',5.0),('c',8.0)],('b',[('a',5.0),('d',6.0)],('c',[('a',8.0),('d',2.0)],('d',[('b',6.0),('c',2.0),('e',12.0),('f',2.0)],('e',['d',12.0),(',
('g',3.0)],('f',[('d',2.0),('g',7.0)],('g',[('e',3.0),('f',7.0)]]

加权字典。我发现这个代码:

def find_all_paths(graph, start, end, path=[]):
    path = path + [start]
    if start == end:
        return [path]
    if not start in graph:
        return []
    paths = []
    for node in graph[start]:
        if node not in path:
            newpaths = find_all_paths(graph, node, end, path)
            for newpath in newpaths:
                paths.append(newpath)
    return paths
它从未在道路上找到起点,并返回
[]


我太迷路了。我了解这些算法的功能,但不知道如何编写它们。我只想找到最短的路

您复制的代码无法解决您的问题。首先,请注意,它的名称告诉您它做了其他事情。此外,它甚至不看边权重

最后,它完全不是为处理图形表示而设计的。请注意,
start
参数在我假设的字典中用作键,它希望该值是可访问节点的iterable。但你不是在给它一本字典,而是在给它一个列表

对于空列表返回值,如果您这样调用函数:

path = find_all_paths(graph, 'a', 'f')
…那么这是正确的<代码>'a'根本不是图形中的节点。您的节点是元组,以类似
'a'
的标识符开始,但也包含一个2元组列表。您每次都必须键入以下内容:

path = find_all_paths(
  graph,
  start=('a', [('b', 5.0), ('c', 8.0)]),
  end=('f', [('d', 2.0), ('g', 7.0)]),
  )
恶心

最后,像
('d',2.0)
这样的2元组也不是节点。即使您修复了它的其余部分,一旦其中一个参数作为新的
start
参数传递到递归函数调用中,这些参数仍然会使
if start not in graph:
测试失败。如果您解决了这个问题,它们将与指定的
end
节点不匹配。此代码无法执行您想要的操作

我的建议是:

  • 不要将随机数据插入你在互联网上找到的函数中。开始简单:将返回最短路径,这是您想要的。它是一个*没有启发式函数(你说你已经读过了*)。编写代码,然后担心变得复杂。(请注意,您可能需要一个可调优先级队列——您可以使用构建一个。)

  • 您需要通过一个不可变的ID访问任意节点,因此您的图应该是一个字典,而不是一个列表。键是单字母字符串,值是边的列表(或元组)。然后,您可以使用类似以下内容遍历节点的所有边:
    for-edge in-graph['a']:

  • 如果您创建一个名为
    Edge
    的文件,其中包含两个字段:
    dest
    weight
    ,您的生活可能会轻松得多。(如果您发现还需要原点,可以填写3个字段:
    orig
    dest
    weight

  • >P>查找其他数据块,并考虑编写另一个代码>命名NUTPLE < /代码>,或为它们编写一个类。(第一个竞争者:
    路径
    ,使用
    权重
    方法。)

  • 考虑使用来显示大型嵌套结构,如图形。这将使打印到控制台的调试更加容易

  • PS:我发现斯图尔特·拉塞尔和彼得·诺维格的前几章是对像这样的图搜索算法的极好介绍。。。不幸的是,这本书的大部分内容对你来说可能是离题的