<p>可以为所需功能编写定制方法:</p>
<pre><code>def SIRS_simulation_with_quarantine(graph, params, tmax):
a, b, y, d, q = params
t=0
graph_current_timestep = graph.copy()
graph_previous_timestep = graph.copy()
Infected_nodes = [x for x in graph_current_timestep.nodes() if graph_current_timestep.nodes[x]['state'][0]=='I']
S = []
I = []
R = []
T = []
while(t<tmax):
for node in graph.nodes():
# initialise random probablilty for that node
p = np.random.rand()
# determine neighbours for that node
neighbors = [n for n in graph_previous_timestep.neighbors(node)]
# depending on the state, check for any state changes and update node attributes
if graph_previous_timestep.nodes[node]['state'][0] == 'S':
if (q > np.random.rand()): # if the node didnt quarantine...
if len(set.intersection(set(neighbors), set(Infected_nodes)))>0: # if any neighbors are infected...
if (p < a):
attrs = {node: {'state': 'I'}}
nx.set_node_attributes(graph_current_timestep, attrs)
elif graph_previous_timestep.nodes[node]['state'][0] == 'I':
if (p < b):
attrs = {node: {'state': 'R'}}
nx.set_node_attributes(graph_current_timestep, attrs)
elif (p < y):
attrs = {node: {'state': 'S'}}
nx.set_node_attributes(graph_current_timestep, attrs)
elif graph_previous_timestep.nodes[node]['state'][0] == 'R':
if (p < d):
attrs = {node: {'state': 'S'}}
nx.set_node_attributes(graph_current_timestep, attrs)
# after the changes to states have occured for all nodes, record number of nodes at each state, increment timestep
Infected_nodes = [x for x in graph_current_timestep.nodes() if graph_current_timestep.nodes[x]['state'][0]=='I']
S.append(len([x for x in graph_current_timestep.nodes() if graph_current_timestep.nodes[x]['state'][0]=='S']))
I.append(len(Infected_nodes))
R.append(len([x for x in graph_current_timestep.nodes() if graph_current_timestep.nodes[x]['state'][0]=='R']))
T.append(t)
graph_previous_timestep = graph_current_timestep.copy()
t = t+1
return T, S, I, R
</code></pre>