Я следую этому примеру под названием «Вирус в сети» из библиотеки Mesa, которая создает сетевые графы с помощью Networkx.
Вот его функция, которая проверяет соседей узла, чтобы попытаться заразить их вирусом.
def try_to_infect_neighbors(self):
neighbors_nodes = self.model.grid.get_neighbors(self.pos, include_center=False)
susceptible_neighbors = [agent for agent in self.model.grid.get_cell_list_contents(neighbors_nodes) if
agent.state is State.SUSCEPTIBLE]
for a in susceptible_neighbors:
if self.random.random() < self.virus_spread_chance:
a.state = State.INFECTED
Однако мне нравится определять расстояние между узлом и его соседом. А вот еще один пример под названием Sugarscape из Меса, похоже, именно это и делает.
Поэтому я изменил код на:
def try_to_infect_neighbors(self):
neighbors_nodes = self.model.grid.get_neighbors(self.pos, include_center=False)
susceptible_neighbors = [agent for agent in self.model.grid.get_cell_list_contents(neighbors_nodes) if
agent.state is State.SUSCEPTIBLE]
for a in susceptible_neighbors:
print('Self position:', self.pos, 'Neightbor position:', neighbor_agent.pos)
# Output: Self position: 52 Neightbor position: 13
neightbor_distance = get_distance(self.pos, neighbor_agent.pos)
# TypeError: 'int' object is not iterable
print(neightbor_distance)
if neightbor_distance <= 1:
if self.random.random() < self.virus_spread_chance:
a.state = State.INFECTED
def get_distance(pos_1, pos_2):
""" Get the distance between two point
Args:
pos_1, pos_2: Coordinate tuples for both points.
"""
x1, y1 = pos_1
x2, y2 = pos_2
dx = x1 - x2
dy = y1 - y2
return math.sqrt(dx**2 + dy**2)
В примере Sugarscape a.pos
дает кортеж из местоположений x и y. Но в случае с вирусом в сети a.pos
дает идентификатор агента. Как я могу получить доступ к местоположению агента по осям x и y в примере «Вирус в сети»? Я попытался найти их внутри a.model.G
и a.model.grid
с помощью переменных: self.G = nx.erdos_renyi_graph(n=self.num_nodes, p=prob)
и self.grid = NetworkGrid(self.G)
, но я не смог их идентифицировать и думаю, что это не должно быть так скрыто.