Python 在参数内寻找最短图 def最短路径(有向图、开始、结束、maxTotalDist、MaxDistOutdoor、已访问=[]): 如果不是(有向图.hasNode(开始)和有向图.hasNode(结束)): raise VALUERROR('开始或结束不在图形中') 路径=[str(开始)] 如果开始=结束: 返回路径 最短=无 最小总距离=0 对于有向图.childrenOf(开始)中的节点: 如果(str(节点)未访问):#避免循环 已访问=已访问+[str(节点)]#新列表 FirstStepDist=digraph.childrenOf(开始)[node][0] FirstStepOutdoors=digraph.childrenOf(start)[node][1] newPath=最短路径(有向图、节点、端点、maxTotalDist、MaxDistOutdoor、已访问) 如果newPath==无: 持续 TotalDist=int(FirstStepDist)+TotalDistance(有向图,新路径) TotalOutdoorDist=int(FirstStepOutdoor)+TotalOutdoorDistance(有向图,newPath) **如果TotalOutdoorDist>MaxDistOutdoor: 继续** 如果(最短==无或总距离

Python 在参数内寻找最短图 def最短路径(有向图、开始、结束、maxTotalDist、MaxDistOutdoor、已访问=[]): 如果不是(有向图.hasNode(开始)和有向图.hasNode(结束)): raise VALUERROR('开始或结束不在图形中') 路径=[str(开始)] 如果开始=结束: 返回路径 最短=无 最小总距离=0 对于有向图.childrenOf(开始)中的节点: 如果(str(节点)未访问):#避免循环 已访问=已访问+[str(节点)]#新列表 FirstStepDist=digraph.childrenOf(开始)[node][0] FirstStepOutdoors=digraph.childrenOf(start)[node][1] newPath=最短路径(有向图、节点、端点、maxTotalDist、MaxDistOutdoor、已访问) 如果newPath==无: 持续 TotalDist=int(FirstStepDist)+TotalDistance(有向图,新路径) TotalOutdoorDist=int(FirstStepOutdoor)+TotalOutdoorDistance(有向图,newPath) **如果TotalOutdoorDist>MaxDistOutdoor: 继续** 如果(最短==无或总距离,python,graph-algorithm,Python,Graph Algorithm,您的代码不会返回可能的最短路径,因为您使用的算法()不会返回最短路径。相反,试试看 但是,由于您有一些重量限制(户外距离),您应该退房。您应该会发现集成约束非常容易。我不确定为什么您的代码最终会不正确。但是,您是否意识到它的效率非常低?在我看来,您正在搜索从开始节点开始的所有可能的非循环路径,以便找到最短的路径。有很多更快的方法做事情。我知道,但我不知道如何编写这样的方法。但是是的,为什么我的if语句会抛出一些结果,这让我莫名其妙。对于一个简单的最短路径函数,请看。也许会有帮助。 def sho

您的代码不会返回可能的最短路径,因为您使用的算法()不会返回最短路径。相反,试试看


但是,由于您有一些重量限制(户外距离),您应该退房。您应该会发现集成约束非常容易。

我不确定为什么您的代码最终会不正确。但是,您是否意识到它的效率非常低?在我看来,您正在搜索从开始节点开始的所有可能的非循环路径,以便找到最短的路径。有很多更快的方法做事情。我知道,但我不知道如何编写这样的方法。但是是的,为什么我的if语句会抛出一些结果,这让我莫名其妙。对于一个简单的最短路径函数,请看。也许会有帮助。
def shortestPath(digraph, start, end, maxTotalDist, maxDistOutdoors, visited=[]):
    if not (digraph.hasNode(start) and digraph.hasNode(end)):
        raise ValueError('Start or end not in graph.')
    path = [str(start)]
    if start == end:
        return path
    shortest = None
    MinimumTotalDist = 0
    for node in digraph.childrenOf(start):
        if (str(node) not in visited): #avoid cycles
            visited = visited + [str(node)] #new list
            FirstStepDist = digraph.childrenOf(start)[node][0]
            FirstStepOutdoors = digraph.childrenOf(start)[node][1]
            newPath = shortestPath(digraph, node, end, maxTotalDist, maxDistOutdoors, visited)
            if newPath == None:
                continue
            TotalDist = int(FirstStepDist) + TotalDistance(digraph,newPath)
            TotalOutdoorDist = int(FirstStepOutdoors) + TotalOutdoorDistance(digraph,newPath)
            **if TotalOutdoorDist > maxDistOutdoors:
                continue**
            if (shortest == None or TotalDist < MinimumTotalDist):
                shortest = newPath
                MinimumTotalDist = TotalDist
    if shortest != None:
        path = path + shortest
    else:
        path = None

    if TotalDistance(digraph,path) <= maxDistOutdoors:
        return path