我有一个n * n网格网络,其中每个节点的值为(0,0),(0,1)......(n-1,n-1)。我需要添加一条边,以便减少网络的平均路径长度(APL)。为此,我必须选择每个节点,为每个其他节点绘制一条边并检查APL。
所以我为此做了一个嵌套for循环:
for x,y in itertools.product(range(n), range(n)):
for i,j in itertools.product(range(x,n), range(n)):
这里外部for循环选择第一个节点,而内部for循环选择第二个节点。 range(x,n)
在某种程度上减少了迭代次数,同样有办法将内部for循环中的range(n)
更改为其他东西,以便减少迭代次数吗?
我尝试使用range((y+1)%n,n)
但是它不起作用,因为假设第一个节点是(0,n-1),然后在选择第二个节点为(0,n)之后,它将不会选择( 1,0)。那么有没有办法优化这个?
答案 0 :(得分:1)
如果我理解正确,只需使用索引与循环的模数
循环遍历相同的索引两次,并在同一索引上只有continue
,例如:
for x, y in itertools.product(range(n), repeat=2):
for i, j in itertools.product(range(n), repeat=2):
if (x, y) == (i, j):
continue
add_edge((x, y), ((x+i)%n, (y+j)%n))
...