在SIR模型和网格二维图上得到错误



我正在尝试使用提供给ndlib的SIR模型来分析流行病在网格二维网络中的行为。下面的代码是我的实现

import networkx as nx
import ndlib.models.ModelConfig as mc
import ndlib.models.epidemics as ep
from ndlib.viz.mpl.DiffusionTrend import DiffusionTrend
g3 = nx.grid_2d_graph(80,80) 
model3 = ep.SIRModel(g3)
cfg = mc.Configuration()
cfg.add_model_parameter('lambda',beta)
cfg.add_model_parameter("fraction_infected",0.05)
cfg.add_model_parameter('beta',0.9)
cfg.add_model_parameter('gamma',0.05)
model3.set_initial_status(cfg)
iterations3 = model3.iteration_bunch(500)
trends3 = model3.build_trends(iterations3)

问题是当我试图得到我的配置模型,因为它给了我这个错误

ValueError                                Traceback (most recent call last)
~AppDataLocalTemp/ipykernel_11068/1868465894.py in <module>
7 cfg.add_model_parameter('gamma',0.05)
8 
----> 9 model3.set_initial_status(cfg)
10 iterations3 = model3.iteration_bunch(500)
11 trends3 = model3.build_trends(iterations3)
~anaconda3libsite-packagesndlibmodelsDiffusionModel.py in set_initial_status(self, configuration)
173 
174                 available_nodes = [n for n in self.status if self.status[n] == 0]
--> 175                 sampled_nodes = np.random.choice(available_nodes, int(number_of_initial_infected), replace=False)
176                 for k in sampled_nodes:
177                     self.status[k] = self.available_statuses['Infected']
mtrand.pyx in numpy.random.mtrand.RandomState.choice()
ValueError: a must be 1-dimensional

有人知道如何解决这个问题吗?谢谢阅读

图的节点没有被标记为整数,当其他库试图访问图时,它们期望整数作为节点标签。nx.grid_2d_graph()的标记默认使用元组完成,以允许通过网格进行选择(例如(0,0)或(10,10))。要使代码正常工作,请将节点标签更改为整数:

import networkx as nx
import ndlib.models.ModelConfig as mc
import ndlib.models.epidemics as ep
from ndlib.viz.mpl.DiffusionTrend import DiffusionTrend
g3 = nx.grid_2d_graph(80,80) 
#relabel the nodes:
g3 = nx.convert_node_labels_to_integers(g3, first_label=0)
model3 = ep.SIRModel(g3)
cfg = mc.Configuration()
cfg.add_model_parameter('lambda',0.4)
cfg.add_model_parameter("fraction_infected",0.05)
cfg.add_model_parameter('beta',0.9)
cfg.add_model_parameter('gamma',0.05)
infected_nodes = [1, 2, 3, 4, 5]
cfg.add_model_initial_configuration("Infected", infected_nodes)
model3.set_initial_status(cfg)
iterations3 = model3.iteration_bunch(500)
trends3 = model3.build_trends(iterations3)

最新更新