Гнездо для цикла для обхода сетки - PullRequest
0 голосов
/ 06 июня 2018

У меня есть 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) несколько уменьшает количество итераций, аналогично есть ли способ изменить range(n) во внутреннем цикле for на что-то другое, чтобы можно было уменьшить количество итераций?

Я пытался использовать range((y+1)%n,n)но это не будет работать, потому что, предположим, что первый узел (0, n-1), затем после выбора второго узла (0, n) он не выберет (1,0).Так есть ли способ оптимизировать это?

1 Ответ

0 голосов
/ 06 июня 2018

Если я правильно понимаю, просто используйте модуль по индексу против цикла.
Дважды просматривайте одни и те же индексы и просто 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))
        ...
...