ModelId:

antsworld

SimileVersion:

5.9

In this model, a population of animals (called ants) is created and the individuals move around at random. The area in which they move is represented by a grid of hexagons.

An association model is created to relate each individual to the hexagon it currently occupies. The technique of one-sided enumeration is used to make this association; it is vital that it happens efficiently, because it changes each time step. In this case the position of each ant is used to determine the index of the submodel instance for the hexagon containing it.

Equations:

Equations in antsworld

Variable n

n = int(sqrt(size(World)))

Variable neighbour offsets a

neighbour offsets a = [0,1,1,0,-1,-1]

Variable neighbour offsets b

neighbour offsets b = [1,0,-1,-1,0,1]

Variable neighbour offsets c

neighbour offsets c = [-1,-1,0,1,1,0]

Equations in Ants

Immigration im1

im1 = 0.1

Variable Pheromone output

Pheromone output = 1

Variable my body size

my body size = 2

Variable my direction

my direction = ceil(rand_var(0,6))

Variable my head size

my head size = 1

Variable my space

my space = infront=element(last([neighbour_spaces]),my_direction),if time()==init_time() then 5102 elseif infront>0 then infront else prev(1)

Where:

my_direction=my direction

[neighbour_spaces]=neighbour spaces

Variable neighbour spaces

neighbour spaces = [neighbours_at]

Where:

[neighbours_at]= ../location/neighbours (to Ants in at)

Variable x

x = x_at

Where:

x_at= ../location/x (to Ants in at)

Variable y

y = y_at

Where:

y_at= ../location/y (to Ants in at)

Equations in location

Condition cond1

cond1 = index(1) is my_space_at

Where:

my_space_at= ../Ants/my space (from Ants in at)

Variable Pheromone

Pheromone = Pheromone_output_at

Where:

Pheromone_output_at= ../Ants/Pheromone output (from Ants in at)

Variable neighbours

neighbours = [their_ids_has]

Where:

[their_ids_has]= ../World/neighbours/their ids (from World in has)

Variable x

x = x_has

Where:

x_has= ../World/x (from World in has)

Variable y

y = y_has

Where:

y_has= ../World/y (from World in has)

Equations in World

Compartment Pheromone

Initial value = 0

Rate of change = + Addition

Flow Addition

Addition = sum({Pheromone_has})

Where:

{Pheromone_has}= ../location/Pheromone (to World in has)

Variable a

a = ceil(index(1)/n)-ceil(n/2)

Where:

n= ../n

Variable b

b = index(1)-n*a-ceil(n*n/2)

Where:

n= ../n

Variable c

c = -a-b

Variable my id

my id = index(1)

Variable x

x = 50+(a-c)* 0.866

Variable y

y = 50+b* 1.5

Equations in borders

Variable x

x = off=sqrt(3/4),x+element([0,off,off,0,-off,-off],index(1))

Where:

x= ../x

Variable y

y = y+element([1, 0.5, -0.5,-1, -0.5, 0.5],index(1))

Where:

y= ../y

Equations in neighbours

Variable a

a = a+element([neighbour_offsets_a],index(1))

Where:

a= ../a

[neighbour_offsets_a]= ../../neighbour offsets a

Variable b

b = b+element([neighbour_offsets_b],index(1))

Where:

b= ../b

[neighbour_offsets_b]= ../../neighbour offsets b

Variable c

c = c+element([neighbour_offsets_c],index(1))

Where:

c= ../c

[neighbour_offsets_c]= ../../neighbour offsets c

Variable their ids

their ids = if all([a,b,c]> - (n/2)) and all([a,b,c]

Results:

This image shows the distribution of pheromone over the grid are after 3000 time units:

ModelId:

animal1

SimileVersion:

5.9

This models the dynamics of a population of animals, represented as a set of individuals that come into existence, live for a while, then die. When the animals are alive, they move around according to a simple random walk.

Equations:

**Equations in Desktop**

N = sum({one})

**Equations in ANIMAL**

X: initial value = rand(30,70)

Y: initial value = rand(30,70)

Dir: initial value = rand(0,6.28)

create = 100

r = rand(0,2*0.7)

m = 0.6

xchange = (if outside == 1 then speed*cos(dir+3.14) else speed*cos(dir))

dirchange = (if outside == 1 then 3.14/dt(1) else rand(-0.4,0.4)/dt(1))

ychange = (if outside == 1 then speed*sin(dir+3.14) else speed*sin(dir))

speed = 5

size = 3

outside = (if (x<0;x>100;y<0;y>100)then 1 else 0)

one = 1

Results: