Hi, I’m trying to use agents.jl for an SEIR network model, where each agent is a node and nodes are connected by edges. I want to run the model so that for each agent, ‘neighbours’ are identified through edges, and if a neighbour has status==I, then there is some probability that the agent will become infected. Currently I am stuck because when I run the model, neighbours aren’t being identified correctly - on my network model it looks like agents are randomly becoming infected and this is not occurring from being connected to another infected agent.
Here is the code:
using Agents
using Random
using Graphs
using GraphPlot
using Compose
# Create a simple graph with 5 nodes (agents)
network = SimpleGraph(5) # 5 nodes in a graph
add_edge!(network, 1, 2)
add_edge!(network, 1, 3)
add_edge!(network, 2, 4)
add_edge!(network, 3, 5)
# Number of nodes (agents)
num_nodes = nv(network)
space = GraphSpace(network)
p_initial_infected = 0.5
# Set up agent
@agent struct Person(GraphAgent) # create agent that moves in a GraphSpace
status::Symbol # S E I or R
end
# Set up model
function initialize(
susceptibility::Float64 = 0.1
)
# Define model props
properties = Dict(
:susceptibility => susceptibility
)
model = ABM(
Person,
space;
properties,
agent_step!)
# Add agents to model
for i in 1:num_nodes
status = rand() < p_initial_infected ? :I : :S # all are initially set as susceptible except a few as I
add_agent!(Person, model, status) # place agents onto network and set Person variables
end
return model
end
# Model stepping function
function agent_step!(person::Person, model)
neighbors = nearby_ids(person, model) # Get neighbors' IDs
for neighbor_id in neighbors # Iterate over neighbor IDs
neighbor = model[neighbor_id]
println("Agent ", person.id, " (", person.status, ") has neighbor ", neighbor_id)
if neighbor.status == :I && person.status == :S
# Calculate transmission probability (including edge weights if applicable)
if rand(abmrng(model)) < model.susceptibility
person.status = :I # Move to infected state
end
end
end
end
model = initialize()
# step model
for t in 1:20
step!(model)
println("Step $t: ", count(i -> i.status == :I, allagents(model)), "infected")
end
Any help much appreciated! I could be totally on the wrong path - pretty new to Julia and ABMs. Thanks!