python - 递归 DFS 最短路径实现未按预期工作

标签 python recursion graph depth-first-search

对于大学作业,我们必须为加权图实现递归朴素最短路径算法。它应该检查所有路线,从中我们可以找到最短路线。

我们已经在 Python 脚本上工作了很长时间,但我们无法让它正常工作。这就是我们现在所拥有的:

import numpy as np
global paths
paths = []

class Path:
        def __init__(self):
            self.NodeArray = [];
            self.Weight = 0;


def vindpaden(start,end,pad):
    pad.NodeArray.append(start)
    print "path so far: " + str(pad.NodeArray)
    global paths
    print "Start:" + str(start) + ", " + "end: " + str(end)
    if start == end:
        print "returning"
        paths.append(pad)
    else:
        for j in range(len(graph)):
            if (j not in pad.NodeArray) and graph[start][j] != -1:
                newpaths = vindpaden(j,end,pad)

graph = np.loadtxt("input2.txt")
graph = graph.astype(int)

start = 0
end = 1

path = Path()
vindpaden(start,end,path)

print "###### results:"
for p in paths:
    print "length: " + str(p.Weight) + ", path: " + str(p.NodeArray)

我们使用邻接矩阵作为输入。为了进行测试,我们使用简单的测试图:

graph

具有以下邻接矩阵(其中-1表示没有连接):

-1 -1  1 -1
 3 -3 -1 -1
 2  2 -1  1
-1  2 -1 -1

这会产生以下输出:

path so far: [0]
Start:0, end: 1
path so far: [0, 2]
Start:2, end: 1
path so far: [0, 2, 1]
Start:1, end: 1
returning
path so far: [0, 2, 1, 3]
Start:3, end: 1
######
length: 0, path: [0, 2, 1, 3]

所以你可以看到它找到了一条从点0经2到点1的路径,之后它应该将路径[0,2,1]添加到数组paths中并继续寻找从点2开始的路径。相反,它返回(错误的)路径 [0,2,1,3]。最后,数组paths中唯一的路径是[0,2,1,3],这也很奇怪。

这就是我们期望的输出:

path so far: [0]
Start:0, end: 1
path so far: [0, 2]
Start:2, end: 1
path so far: [0, 2, 1]
Start:1, end: 1
returning
path so far: [0, 2, 3]
Start:3, end: 1
path so far: [0 ,2, 3, 1]
Start:1, end: 1
returning
######
length: 0, path: [0, 2, 1]
length: 0, path: [0, 2, 3, 1]

请注意,我们目前没有使用属性权重。任何帮助将不胜感激!

吉姆

最佳答案

看来您的问题是您只创建了 Path() 的单个实例,这会导致该实例的 NodeArray被损坏。我认为发生的事情如下:

  • 您到达了 NodeArray 的地步包含[0, 2, 1] .
  • 该函数检测到它已到达目标,因此返回到最近的节点以检查其余的潜在路径。
  • 从节点 2 出发, 1 之后的下一个节点是 3 ,所以3添加到 NodeArray列表。由于列表尚未清除,因此新节点 ( 3 ) 只是添加到末尾,结果是 [0, 2, 1, 3 ].
  • 现在,因为1已经在您当前的 NodeArray 中,if语句if (j not in pad.NodeArray) and graph[start][j] != -1:失败并且函数停止。

我认为你需要做的是创建一个新的 Path()每次您调用vindpaden() ,并复制当前的 PathNodeArray进入新Path .

关于python - 递归 DFS 最短路径实现未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32632552/

相关文章:

c++ - 图的邻接列表表示不正确

python - 重复二维 NumPy 数组 N 次

php - 使用 PHP 递归计数文件

JavaScript:使用递归检查数字是否为素数

java - 根据用户输入点创建折线图

java - 如何在Java中呈现波形

python - 基于多行修改python中的pandas数据框

python - 删除 pandas 中行的一部分/向上移动行的一部分?对齐列标题

python - 使用 3D numpy 数组的直观方法

printing - Ocaml:再次调用递归函数