Как назначить случайный вес ребрам в сети x, например, вес ребра (a, a) = 0 и вес ребра (a, b) = K, где K - некоторое случайное число - PullRequest
1 голос
/ 05 мая 2019

Я работаю над взвешенными графиками и хотел бы назначить случайный вес для краев графика, такой, что

 weight of edge(a, a) = 0
 weight of (a, b) = weight of edge(b, a) = K

, где K - некоторое случайное число.Это продолжается для всех ребер графиков.

Для этого я использую метод random.randint().Я на самом деле использую логику суммы.Если сумма обоих ребер одинакова, тогда присвойте какое-нибудь случайное целое число.

Вот мой код,

nodelist = list(range(1, num_nodes + 1))
edgelist = []
for i in nodelist:
    for j in nodelist:
        if i == j:
            edgelist.append((i, j, 0))
        if (i != j and sum((i, j)) == sum((j, i))):
            rand = random.randint(5, 25)
            edgelist.append((i, j, rand))
print(edgelist)

Фактический результат,

[(1, 1, 0), (1, 2, 18), (1, 3, 6), (2, 1, 13), (2, 2, 0), (2, 3, 21), (3, 1, 20), (3, 2, 17), (3, 3, 0)]

Ожидаемый результат,

[(1, 1, 0), (1, 2, K), (1, 3, H), (2, 1, K), (2, 2, 0), (2, 3, P), (3, 1, H), (3, 2, P), (3, 3, 0)]

где, K, H, P - некоторые случайные целые числа.

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Если порядок результата не важен, следующий код дает желаемый результат:

import random
num_nodes = 3
nodelist = list(range(1, num_nodes + 1))
edgelist = []
for i in nodelist:
    for j in nodelist:
        if j > i:
            break
        if i == j:
            edgelist.append((i, j, 0))
        else:
            rand = random.randint(5, 25)
            edgelist.append((i, j, rand))
            edgelist.append((j, i, rand))
print(edgelist)
# [(1, 1, 0), (2, 1, 7), (1, 2, 7), (2, 2, 0), (3, 1, 18), (1, 3, 18), (3, 2, 13), (2, 3, 13), (3, 3, 0)]

Если вам нужно отсортировать края, просто используйте:

print(sorted(edgelist))
# [(1, 1, 0), (1, 2, 20), (1, 3, 16), (2, 1, 20), (2, 2, 0), (2, 3, 23), (3, 1, 16), (3, 2, 23), (3, 3, 0)]
0 голосов
/ 06 мая 2019

Итак, я понял что-то интересное. Скажем ниже, матрица показывает ребра в полном графе 5 узлов,

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

Теперь, двигаясь правой стороной от principal diagonal, у нас есть списки, первый элемент которых меньше второго элемента. Мы просто должны нацелиться на них и append новый случайный вес.

Вот мой код,

nodelist = list(range(1, num_nodes + 1))
edgelist = []
for i in nodelist:
    for j in nodelist:
        edgelist.append([i, j])

p = 0
eff_edgelist = []
while p < len(edgelist):
    if edgelist[p][0] <= edgelist[p][1]:
        eff_edgelist.append(edgelist[p])
    p += 1

for i in eff_edgelist:
    if i[0] == i[1]:
        i.append(0)
    else:
        i.append(random.randint(5, 50))
eff_edgelist = [tuple(i) for i in eff_edgelist]

for i in list(G.edges(data=True)):
    print([i])

и результат

[(1, 1, {'weight': 0})]
[(1, 2, {'weight': 12})]
[(1, 3, {'weight': 37})]
[(1, 4, {'weight': 38})]
[(1, 5, {'weight': 6})]
[(2, 2, {'weight': 0})]
[(2, 3, {'weight': 12})]
[(2, 4, {'weight': 40})]
[(2, 5, {'weight': 8})]
[(3, 3, {'weight': 0})]
[(3, 4, {'weight': 15})]
[(3, 5, {'weight': 38})]
[(4, 4, {'weight': 0})]
[(4, 5, {'weight': 41})]
[(5, 5, {'weight': 0})]

и если вы проверите, print(G[2][1]), вывод будет {'weight': 12},

, что означает weight of edge(a, b) = weight of edge(b, a).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...