Для модели перколяции облигаций я хочу построить квадратную решетку с помощью NetworkX, используя grid_2d_graph(l,l)
. Это дает мне квадратную решетку размером lxl
с каждым ребром open
.
Идея состоит в том, что я хочу выбрать край графика случайным образом, а затем проверить, назначен ли край уже (1, чтобы оставить край таким, какой он есть, 0, чтобы добавить его в список ребер, чтобы удалить из график), и если он еще не был назначен (ребро имеет 'state' = -1
), я хочу выбрать случайным образом с определенной вероятностью p
, если ребро открыто (оставьте его как есть), или если оно закрыто (поместите это в список краев, чтобы удалить).
Поэтому я сохранил все ребра с атрибутом данных 'state' = -1
в виде списка, а затем попытался случайным образом получить доступ к записи этого списка, чтобы затем изменить атрибут 'state'
на какое-то значение. Но похоже, что эта операция не разрешена. Когда я пытаюсь редактировать состояния, я получаю следующую ошибку:
File "bond-percolation.py", line 39, in <module>
ed[10][2] = 1
TypeError: 'tuple' object does not support item assignment
Итак, мой вопрос: как я могу случайно выбрать ребро и эффективно изменить значение 'state'
?
Вот мой код:
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
import random
#Width of the quadratic lattice
l = 30
#Create grid
G = nx.grid_2d_graph(l,l)
#Total number of edges in the lattice
n = 2 * l * (l-1)
m = 0
#Set probability if an edge is open
p = 0.17
#Create empty list to add closed edges later
ed = []
ld = []
for e in G.edges(data = 'state', default = -1):
ed.append(e)
#Creating the lattice
while (m != n):
i = np.random.randint(n-1)
a = random.random()
if (ed[i][2] == -1):
if (a > p):
ld.append(ed[i])
else:
ed[i][2] = 1
m = m + 1
#We need this so that the lattice is drawn vertically to the horizon
pos = dict( (l,l) for l in G.nodes() )
#Draw the lattice
nx.draw_networkx(G, pos = pos, with_labels = False, node_size = 0)
#Plot it on the screen
plt.axis('off')
plt.show()