在Dijkstra的算法中,我对最近邻居的决心不知所措。 我得到如下奇怪的结果首先这是我的网络文件的内容,代表7个节点之间的距离:

http://pastebin.com/PUM5qT6D

(不包括第一列中的数字1-7)

现在我的代码:

> infinity = 1000000 invalid_node = -1
> startNode = 0
> 
> #Values to assign to each node class Node:
>      distFromSource = infinity
>      previous = invalid_node
>      visited = False
> 
> #read in all network nodes
> #node = the distance values between nodes def network():
>     f = open ('network.txt', 'r')
>     theNetwork = [[int(node) for node in line.split(',')] for line in
> f.readlines()]
>     #print theNetwork
> 
>     return theNetwork
> 
> #for each node assign default values
> #populate table with default values def populateNodeTable():
>     nodeTable = []
>     index = 0
>     f = open('network.txt', 'r')
>     for line in f:
>       node = map(int, line.split(','))
>       nodeTable.append(Node())
>      
>       #print "The previous node is " ,nodeTable[index].previous
>       #print "The distance from source is " ,nodeTable[index].distFromSource
>       index +=1
>     nodeTable[startNode].distFromSource =
> 0
> 
>     return nodeTable
> 
> #find the nearest neighbour to a particular node def
> nearestNeighbour(nodeTable,
> theNetwork):
>      nearestNeighbour = []
>      nodeIndex = 0
>      for node in nodeTable:
>           if node != 0 and Node.visited == False:
>              nearestNeighbour.append(nodeIndex)
>              nodeIndex +=1
>      print nearestNeighbour
> 
>      return nearestNeighbour
> 
> def tentativeDistance (theNetwork,
> nodeTable, nearestNeighbour):
>     shortestPath = []
>     for nodeIndex in nearestNeighbour:
>          currentDistance = nearestNeighbour[] + startNode
>          print currentDistance
> ##         if currentDistance < Node.distFromSource:
> ##            theNetwork[Node].previous = nodeIndex
> ##            theNetwork[Node].length = nodeIndex
> ##            theNetwork[Node].visited = True;
> ##            shortestPath.append(indexNode)
> ##            nodeIndex +=1
> ##    print shortestPath
> 
> currentNode = startNode
> 
> if __name__ == "__main__":
>     nodeTable = populateNodeTable()
>     theNetwork = network()
>     nearestNeighbour(nodeTable, theNetwork)
>     tentativeDistance(theNetwork, nodeTable, nearestNeighbour)

所以,我试着查看网络函数提供的值,在populateNodeTable函数中将所有节点设置为'visited = false',然后通过查看前一个函数中提供的值来确定节点的最近邻居,尽管我得到了此错误消息:

> Traceback (most recent call last):  
> File "C:\Documents and Settings\Harvey\Desktop\2dArray.py", line 77, in <module>
>     tentativeDistance(theNetwork, nodeTable, nearestNeighbour)   File
> "C:\Documents and Settings\Harvey\Desktop\2dArray.py", line 51, in tentativeDistance
>     for nodeIndex in nearestNeighbour: TypeError: 'function' object is not iterable

当我运行我的网络功能时,我得到了这个输出:

[[0, 2, 4, 1, 6, 0, 0], [2, 0, 0, 0, 5, 0, 0], [4, 0, 0, 0, 5, 5, 0], [1, 0, 0, 0, 1, 1, 0], [6, 5, 0, 1, 0, 5, 5], [0, 0, 5, 1, 5, 0, 0], [0, 0, 0, 0, 5, 0, 0]]

到目前为止,非常好 - 当我运行populateNodeTable函数和我的网络函数时,我得到了这个输出:

> The previous node is  -1 
  The distance from source is  1000000 # happens 7 times#
> 

另外,这很好 - 除了上述功能之外,执行myNeighbour函数后的输出是:

[0, 1, 2, 3, 4, 5, 6]

这个输出是错误的,是我的问题开始的地方

此外,当我运行我的所有代码包括tentativeDistance时,我收到此错误:

> for nodeIndex in nearestNeighbour:
  TypeError: 'function' object is not iterable

我为这篇文章长篇大论而道歉,我很沮丧,我无法掌握似乎是基本的功能

#1楼 票数:2

您将方法nearestNeighbour传递给tentativeDistance而不是方法的结果。

#2楼 票数:1 已采纳

这是问题所在

tentativeDistance(theNetwork, nodeTable, nearestNeighbour)

应该

 x = nearestNeighbour(nodeTable, theNetwork)
 tentativeDistance(theNetwork, nodeTable, x)

看一下错误,你会看到代码试图迭代一个不可迭代的对象。 这在Python for - in - syntax中是隐含的。

您可能还会考虑重命名变量名称或函数名称以避免混淆。 无论如何,这都是一个容易犯的错误。

  ask by user612041 translate from so

未解决问题?本站智能推荐:

1回复

确定迪杰斯特拉的最近邻居

好的,我对代码进行了一些更改,但是对于应该将哪些变量名传递给我的NearestNeighbour函数感到困惑。 这两个功能可以正常工作: 因此,一切顺利。 但是,我的下一个功能给我一个错误,尽管我更改了方括号中的变量名称,但仍无法解决问题。 这是下一个功能代码和错误消息:
3回复

Dijkstra 算法

在阅读 Dijkstra 算法时,我发现您应该实现最小堆。 我尝试实现最小堆并且该算法有效,但是当我不使用最小堆函数而只是从索引 0 处弹出顶点时,它也有效。 我很困惑,当我们无论如何要探索堆中的所有顶点时,为什么我们需要始终选择具有最小距离的顶点进行探索。 例如: 为什么在 pop(0)
1回复

Dijkstra算法的多个输入

Dijkstra算法的输入是有向和加权图,通常由邻接(距离)矩阵和起始节点表示。 我有两个不同的距离矩阵用作输入,代表两种不同的基础设施(例如,道路和自行车道)。 任何想法如何修改Dijkstra的算法使用这两个输入? 我想用Python实现。 谢谢!
1回复

大权重的Dijkstra算法

我正在尝试解决在线法官关于在完整图表上计算所有最短路径的问题。 完整的问题规范可以在这里看到。 但是,我超出了所需的内存限制。 这是执行Dijkstra算法的代码部分: 由于时间复杂度较高,因此代码使用了没有优先级队列的原始算法。 即使这给出了正确的答案,但我仍然感觉到内存超支与
1回复

CodeFights:Dijkstra的算法实现

考虑以下代码冲突问题: 考虑一个位于n个岛上的大城市。 有连接岛屿的桥梁,但它们都只有单向交通。 更糟糕的是,大多数桥梁在夜间关闭,因此最多只有一座桥梁,交通从任何岛屿A到任何其他岛屿B。 有一个程序员在夜里以Uber司机的身分赚钱。 一天晚上,他接载从零岛到零岛(n-1
2回复

Dijkstra重建图

好的,所以我已经在Python中实现了Djakstra的最短路径算法 ,并且该算法运行正常(距离计算正确),但是我希望它也返回新的优化图形。 这是我的工作: 现在,在打印路径之后,您可以清楚地知道那只是算法路径,而不是节点的真实路径。 如何根据刚刚计算出的距离找出节点的真实路径?
1回复

Dijkstra在python中的算法

我试图在我的python代码上实现Dijkstra的算法,但我无法真正得到正确的算法。 我使用的算法来自此YouTube链接: https : //www.youtube.com/watch?v = pVfj6mxhdMw 基本上我的班级有这三个变量: 以下是我使用视频中提供的算
11回复

python中的Dijkstra算法

我正在尝试使用数组在 python 中实现 Dijkstra 算法。 这是我的实现。 我希望答案是: 然而,我得到的答案是这样的: 对于节点 F,程序给出了错误的答案。 有人可以告诉我为什么吗?