Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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
与'有关的问题;访问列表';在使用Dijkstras时,Python_Python_Recursion_Dynamic Programming_Dijkstra_Adjacency List - Fatal编程技术网

与'有关的问题;访问列表';在使用Dijkstras时,Python

与'有关的问题;访问列表';在使用Dijkstras时,Python,python,recursion,dynamic-programming,dijkstra,adjacency-list,Python,Recursion,Dynamic Programming,Dijkstra,Adjacency List,我对编码还比较陌生,所以对于被覆盖的、笨拙的代码,我深表歉意 此外,f.f.r.这是麻省理工学院的开放式课件“习题集11,绕过麻省理工学院的最快方法”。(对于以后的习题集,我无法在线找到解决方案。) 我已经实现了Dijkstra算法的一个最成功的版本,有动态规划和没有动态规划。在这个实现中,我保留了一个节点列表,以避免循环/无限循环……但据我所知,这就是我遇到问题的地方。考虑到我的边是加权的,并且在某些情况下我希望通过不同的边重新访问相同的节点,这将导致我的代码忽略正确的解决方案。因此,我想找到

我对编码还比较陌生,所以对于被覆盖的、笨拙的代码,我深表歉意

此外,f.f.r.这是麻省理工学院的开放式课件“习题集11,绕过麻省理工学院的最快方法”。(对于以后的习题集,我无法在线找到解决方案。)

我已经实现了Dijkstra算法的一个最成功的版本,有动态规划和没有动态规划。在这个实现中,我保留了一个节点列表,以避免循环/无限循环……但据我所知,这就是我遇到问题的地方。考虑到我的边是加权的,并且在某些情况下我希望通过不同的边重新访问相同的节点,这将导致我的代码忽略正确的解决方案。因此,我想找到一种方法来修改我的代码,这样它就能记住访问了哪些边,而不是哪个节点,而且……我确实尝试过修改它,以记住访问了哪些边——但我的实现不起作用——所以我希望看到正确的编写方法

我的代码失败的输入示例:

# Test case 6
print "---------------"
print "Test case 6:"
print "Find the shortest-path from Building 1 to 32 without going outdoors"
expectedPath6 = ['1', '3', '10', '4', '12', '24', '34', '36', '32']
brutePath6 = bruteForceSearch(digraph, '1', '32', LARGE_DIST, 0)
dfsPath6 = directedDFS(digraph, '1', '32', LARGE_DIST, 0)
print "Expected: ", expectedPath6
print "Brute-force: ", brutePath6
print "DFS: ", dfsPath6
代码的输出

---------------
Test case 6:
Find the shortest-path from Building 1 to 32 without going outdoors
Expected:  ['1', '3', '10', '4', '12', '24', '34', '36', '32']
Brute-force:  ['1', '3', '10', '13', '24', '34', '36', '32']
DFS:  ['1', '3', '3', '3', '7', '7', '9', '13', '24', '34', '36', '36', '32']
邻接列表是dict中dict的形式,其中权重存储为元组。要检查暴力代码、地图输入或有向图的构建方式,请访问此GitHub

def findDist(有向图、开始、路径):
路径=[str(开始)]+路径
距离=0
距离=0
对于范围内的i(len(path)-1):
edgeVals=无
listOfDest=digraph.edges[节点(路径[i])]
对于listOfDest中的节点:
如果node.has_键(node(路径[i+1])):
edgeVals=node.values()
距离=距离+边值[0][0]
outDistance=outDistance+edgeVals[0][1]
打破
返回(距离,超出距离)
def directedDFS(有向图、开始、结束、maxTotalDist、MaxDistOutdoor、toPrint=False、visited=[]、level=0、memo={}):
"""
使用“定向深度优先”查找从起点到终点的最短路径。
搜索进近。路径上行驶的总距离不得超过
超过maxTotalDist,则此路径上的室外距离必须为
不超过maxDisOutdoors。
参数:
有向图:类有向图或其子类的实例
开始,结束:开始和结束建筑编号(字符串)
maxTotalDist:路径上的最大总距离(整数)
maxDistOutdoors:路径上户外花费的最大距离(整数)
假设:
起点和终点是图中现有建筑的编号
返回:
从起点到终点的最短路径,由
建筑物编号列表(字符串),[n_1,n_2,…,n_k],
在有向图中,存在从n_i到n_i(i+1)的边,

为什么你的代码忽略了正确的答案?请将输出的相关部分复制并粘贴到实际问题中。文本图像从来没有文本本身有用(除非是关于呈现文本或其他内容的问题)@Blckknght我添加了我的解决方案最失败的测试数据dramatically@MxyL我不确定你到底是什么意思,也许这就是我的问题——我可以说边有多重权重(总行走距离和室外行走距离),对于某些输入,正确的解决方案不仅包括到达目的地,而且还包括在不走出去的情况下到达目的地。因此,理想情况下,代码会丢弃这些解决方案。在给定特定情况下,您应该能够遍历代码,并能够说“这就是为什么它不会沿着这条边走,选择一条不同的边“,这应该能让我们了解哪些线是可疑的。
def findDist(digraph, start, path):
path = [str(start)] + path
distance = 0
outDistance = 0
for i in range(len(path)-1):
    edgeVals = None
    listOfDest = digraph.edges[Node(path[i])]
    for node in listOfDest:
        if node.has_key(Node(path[i+1])):
            edgeVals = node.values()
            distance = distance + edgeVals[0][0]
            outDistance = outDistance + edgeVals[0][1]
            break
return (distance, outDistance)

def directedDFS(digraph, start, end, maxTotalDist, maxDistOutdoors, toPrint = False, visited = [], level = 0, memo = {}):
"""
Finds the shortest path from start to end using directed depth-first.
search approach. The total distance travelled on the path must not
exceed maxTotalDist, and the distance spent outdoor on this path must
not exceed maxDisOutdoors.

Parameters: 
    digraph: instance of class Digraph or its subclass
    start, end: start & end building numbers (strings)
    maxTotalDist : maximum total distance on a path (integer)
    maxDistOutdoors: maximum distance spent outdoors on a path (integer)

Assumes:
    start and end are numbers for existing buildings in graph

Returns:
    The shortest-path from start to end, represented by 
    a list of building numbers (in strings), [n_1, n_2, ..., n_k], 
    where there exists an edge from n_i to n_(i+1) in digraph, 
    for all 1 <= i < k.

    If there exists no path that satisfies maxTotalDist and
    maxDistOutdoors constraints, then raises a ValueError.
"""
#TODO
if toPrint:
    print start, end
check = start
start = Node(start)
end = Node(end)
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
shortestDist = None
shortestOutDist = None
distFilter = (maxTotalDist <= maxDistOutdoors)
for child in digraph.childrenOf(start):
    childNode = child.keys()[0]
    if (str(childNode) not in visited):
        visited = visited + [str(childNode)]
        try:
            newPath = memo[start, end]
        except:
            newPath = directedDFS(digraph, str(childNode), str(end), maxTotalDist, maxDistOutdoors, toPrint, visited, level = level + 1)
        if newPath == None:
            continue
        newPathDist = findDist(digraph, start, newPath)
        if (distFilter) and (newPathDist[1] <= maxDistOutdoors) and ((shortestDist == None) or (newPathDist[0] < findDist(digraph, start, shortestDist)[0])):
            shortestDist = newPath
        elif (not distFilter) and ((shortestOutDist == None) or (newPathDist[1] <= findDist(digraph, start, shortestOutDist)[1])):
            if (shortestOutDist == None) or (newPathDist[0] <= findDist(digraph, start, shortestOutDist)[0]):
                shortestOutDist = newPath
                memo[childNode, end] = newPath
if (distFilter) and (shortestDist != None):
    path = path + shortestDist
elif (not distFilter) and (shortestOutDist != None):
    path = path + shortestOutDist
else: 
    path = None
if (level == 0) and (not distFilter) and (shortestOutDist == None):
    raise ValueError('No such path!')
elif (level == 0) and (not distFilter) and (findDist(digraph, start, shortestOutDist)[1] > maxDistOutdoors):
    raise ValueError('No such path!')
elif (level == 0) and (distFilter) and (shortestDist == None):
    raise ValueError('No such path!')
elif (level == 0) and (distFilter) and (findDist(digraph, start, shortestDist)[0] > maxTotalDist):
    raise ValueError('No such path!')
return path