### Persephone - a socio-economic-ecological model of European agricultural landscapes. ### ### This file contains a set of life-history related utility functions needed by species. ### """ initrandompopulation(popsize, asexual=true) A simplified version of `initpopulation()`. Creates a function that initialises `popsize` individuals, spread at random across the landscape. If `popsize` is less than 1, it is interpreted as a population density (i.e. 1 animal per `popsize` pixels). """ function initrandompopulation(popsize::Float64, asexual::Bool=true) initfunc = function(species::Dict{String,Any}, model::AgentBasedModel) if popsize < 1.0 x, y = size(model.landscape) popsize = Int(round(x*y*popsize)) end for i in 1:popsize sex = asexual ? hermaphrodite : rand([male, female]) add_agent!(Animal, model, species, sex, 0) end @debug "Initialised $(popsize) $(species["name"])s." end return initfunc end #TODO initpopulation """ reproduce!(animal, model, n=1) Produce one or more offspring for the given animal at its current location. """ function reproduce!(animal::Animal, model::AgentBasedModel, n::Int64=1) # XXX at the moment we don't have intra-specific variation, so currently we # don't need sexual recombination here for i in 1:n sex = animal.sex == hermaphrodite ? hermaphrodite : rand([male, female]) add_agent!(animal.pos, Animal, model, animal.traits, sex, 0) end @debug "$(animal.traits["name"]) $(animal.id) has reproduced." end """ kill(animal, model, probability=1.0, cause="") Kill this animal, optionally with a given percentage probability. Returns true if the animal dies, false if not. """ function kill!(animal::Animal, model::AgentBasedModel, probability::Float64=1.0, cause::String="") if rand() < probability postfix = isempty(cause) ? "." : " from $cause." @debug "$(animal.traits["name"]) $(animal.id) has died$(postfix)" kill_agent!(animal, model) return true end return false end