我正在努力让下面的代码工作。我的目标是,在指定特定位置的节点/边后,计算它们之间的距离。当我硬编码值0和1时,我收到预期的答案,但当我尝试使用while循环迭代时,我得到下面的错误输出(编辑以添加完整的错误消息):
C:\Users\Owner\Desktop\Math Thinking in CS\Python code>py hamilt.py
86.6083136886985
Traceback (most recent call last):
File "C:\Users\Owner\Desktop\Math Thinking in CS\Python code\hamilt.py", line 77, in <module>
print(cycle_length(g,cycle3))
^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Owner\Desktop\Math Thinking in CS\Python code\hamilt.py", line 27, in cycle_length
dist = np.sqrt(((pos[d+1][d]-pos[d][d]))**2 + (pos[d][d+1]-pos[d+1][d+1])**2)
~~~~~~^^^^^
IndexError: tuple index out of range
特别注意--我没有使用“for _ in [:-1]:“形式的for循环,因为出于某种原因,我使用的coursera评分器称其超出范围,即使它在我的机器上成功运行。此外,我正在学习的课程的讨论论坛非常活跃,所以我转向其他地方寻求帮助。由于这是一门课程,请随时为我指出方向,而不是回答/直接给出代码解决方案,如果这更有指导意义的话。
import networkx as nx
import numpy as np
def cycle_length(g, cycle):
assert len(cycle) == g.number_of_nodes()
cycleweight = 0
vertices = 0
pos=nx.get_node_attributes(g,'pos')
dist=range(0,len(cycle))
d = 0
while d < len(cycle) - 1:
dist = np.sqrt(((pos[d+1][d]-pos[d][d]))**2 + (pos[d][d+1]-pos[d+1][d+1])**2) #this is the line giving me issues
print(dist)
d += 1
while vertices < len(cycle) - 1:
cycleweight = cycleweight + g[cycle[vertices]][cycle[vertices+1]]['weight']*dist[vertices]
vertices += 1
return cycleweight
g = nx.Graph()
g.add_node(0,pos=(174,25))
g.add_node(1,pos=(129,99))
g.add_node(2,pos=(268,212))
g.add_node(3,pos=(211,209))
g.add_node(4,pos=(156,82))
g.add_edge(4,1,weight=1)
g.add_edge(1,0,weight=1)
g.add_edge(0,3,weight=1)
g.add_edge(3,2,weight=1)
g.add_edge(2,4,weight=1)
cycle3 = [4,1,0,3,2]
print(cycle_length(g,cycle3))
我试过输入硬编码的值,这很有效,但是当我试着输入一个我正在迭代的变量时,我无法让它工作。
1条答案
按热度按时间sshcrbum1#
此处:
d
从0
开始,然后继续while d < len(cycle) - 1
,每次迭代d
加1,在示例中,len(cycle)
等于5
,因此d
从0
变为3
。在第二次迭代中,
d
等于1
,如果pos
的值为{0: (174, 25), 1: (129, 99), 2: (268, 212), 3: (211, 209), 4: (156, 82)}
,你认为在计算pos[d][d + 1]
时会发生什么?pos[x][y]
的第二个索引y
应该总是0
或1
,如果你用它来访问2元组字典的话。