Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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_Depth First Search - Fatal编程技术网

Python 如何返回第一个有效路径?

Python 如何返回第一个有效路径?,python,depth-first-search,Python,Depth First Search,我有一个模拟图形的大型数据集,其中包含城市及其之间的距离。它存储为元组列表: map = [('Baltimore', 'New York City', 85), ('Dallas', 'Cincinatti', 104), ('Denver', 'Salt Lake City', 91), ('Orlando', 'New York City', 17), ('Orlando', 'San Francisco', 64), ('Seattle', 'Baltimore', 89),

我有一个模拟图形的大型数据集,其中包含城市及其之间的距离。它存储为元组列表:

map = [('Baltimore', 'New York City', 85), 
 ('Dallas', 'Cincinatti', 104),
 ('Denver', 'Salt Lake City', 91),
 ('Orlando', 'New York City', 17),
 ('Orlando', 'San Francisco', 64),
 ('Seattle', 'Baltimore', 89),
 ('Seattle', 'Portland', 44),
 ('Portland', 'Las Vegas', 32),
 ('Las Vegas', 'Reno', 7),
 ('Reno', 'Chicago', 29),
 ('Chicago', 'San Francisco', 56)]
这表明“巴尔的摩”和“纽约市”两个顶点之间的距离为85。我正在尝试使用深度优先搜索并编写一个方法,该方法可以获取起始城市和最终城市,并返回一个有效路径(如果存在一个或多个路径),该路径将连接这两个城市以及总距离。例如,如果StasySudio=“巴尔的摩”和EndoCase=“旧金山”,它将打印:是的,巴尔的摩、纽约、奥兰多、旧金山、166。我只需要代码返回一条总距离为的有效路径

def dfs_helper(map, start_city, end_city):
    stack = []
    visited = []
    adj_cities = get_connections(map, start_city)
    dfs_visit(map, start_city, end_city, adj_cities, stack, visited)

def dfs_visit(results, start_city, end_city, adj_cities, stack, visited):
    #mark start_city as visited
    visited.append(start_city)

    if(end_city in visited):   #soon as end_city is discovered, return the path it took to get there.
        return stack

    for adj_city in adj_cities:
        #add adj_city to stack to keep track of that path to the end_city
        stack.append(adj_city)  
        if adj_city not in visited:
            adj_cities = get_connections(results, adj_city)
            dfs_visit(map, adj_city, end_city, adj_cities, stack, visited)

def get_connections(map, city):
    connections = []

    for result in map:
        if (result[0] == city):
            connections.insert(0, result[1])
        elif (result[1] == city and result[0] != city):
            connections.insert(0, result[0])

    connections.reverse()
    return connections
我这样称呼它:
dfs\u helper(地图,“巴尔的摩”,“旧金山”)

构造一个加权模型来为对象建模,并用于查找路径

特别是,您可能会感兴趣。它查找起始节点和最终节点之间可能的最短路径。第一段甚至以道路网为例说明其应用

Dijkstra算法是一种寻找图中节点之间最短路径的算法,例如,它可以表示道路网络


根据注释,如果您不关心寻找最短的可能路径,那么递归也会以较小的时间复杂度来解决您的问题。

要返回图形中两个节点之间的路径,如果不一定需要是最短的,可以使用。它接受参数
start\u city
end\u city
,返回从
start\u city
end\u city
的总成本。但是,如果还需要打印路径,则可以打印前置向量。这里有一个想法:

def dfs_visit(start_city):
   mark start_city as visited

   if(end_city is discovered)   //soon as end_city is discovered, return the path it took to get there.
       return stack

   for each adj_city of start_city:
       add adj_city to stack //to keep track of that path to the end_city
       if adj_city is not discovered:
            dfs_visit(adj_city)

重复此过程,直到没有未发现的顶点

有时甚至不会返回结果,因为数据集太大
。那么,您的数据集中有多少个连接?是否超过10^9?构造一个加权模型来建模对象并使用它来查找路径。@SakibAhammed大概有2000个连接。当我到达大于3个城市的路径时,此代码将不再运行。您还没有问任何问题。请仔细研究这些指导原则,它们解释了您的帖子需要包含的内容。要返回一条有效路径,而不管它是否是最短路径,我认为递归深度优先搜索最合适。@ChuckLoganLim我编辑了我的代码以反映dfs算法。我找不到它的实际路径。你看到我的逻辑中有错误吗?你的
adj_city
只是与
start_city
相邻的所有城市的列表。一旦您穿过初始城市,
adj_city
在逻辑上就不正确了。请在递归调用之前尝试调用
get_connections
。@ChuckLoganLim我做了更改。看起来我仍然没有进入堆栈应该返回的位置。我编辑代码以反映dfs算法。我找不到它的实际路径。你看到我的逻辑有错误吗?