Growing ring with energy-driven moving agents - RuleBase

Growing ring with energy-driven moving agents

Author: Ricardo Honorato
tags: none

This model grows a one dimensional ring and inserts new agents on it which diffuse along the ring; the idea is that this is a simple model of receptor clustering in a growing membrane. The rates of diffusion rules are modulated by the change in system's energy they produce. In turn, the system's energy is given by the number of instances of two different connected components in the mixture, namely Mem(r!1, s!2), Mem(l!1, s!3), Sensor(m!2), Sensor(m!3), which represents a Sensor agent next to another one (and thus both being part of the same cluster), and Mem(r!1, s), Mem(l!1, r!2, s!3), Mem(l!2, s), Sensor(m!3), which is a free Sensor (entropic term).

The density of receptors in the ring over time is plotted below.

Simulation results

The syntax is KaSim's.

 

Download View code
%agent: Mem(l, r, s)
%agent: Sensor(m)

%var: '-1' 0 - 1
%var: 'kInsert' 2E-6
%var: 'D' 0.018
%var: 'h' 3
%var: 'kMove' 'D'/('h'^2)
%var: 'kGrow' 8E-6

%var: 'alpha' 1/2
%var: 'J' 5
%var: 'lambda' 0 - 1/2

'Insert' Mem(s) -> Mem(s!1), Sensor(m!1) @ 'kInsert'
'Grow' Mem(l!1), Mem(r!1) -> Mem(l!1), Mem(r!2), Mem(r!1, l!2) @ 'kGrow'

# Movements
#'MoveR' Mem(s!1, l!2), Sensor(m!1), Mem(r!2, s) -> Mem(s, l!2), Sensor(m!1), Mem(r!2, s!1) @ 'kMove'
'MoveR:010-10' Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, r!5, s!_), Mem(l!5, s), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, r!5, s!_), Mem(l!5, s), Sensor(m!9) @ \
               'kMove' # dE = 0

'MoveR:010-11' Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, r!5, s!_), Mem(l!5, s!_), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, r!5, s!_), Mem(l!5, s!_), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * 'alpha') # dE = aJ

'MoveR:110-10' Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, r!5, s!_), Mem(l!5, s), Sensor(m!9) -> \
               Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, r!5, s!_), Mem(l!5, s), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * '-1' * 'alpha') # dE = -aJ

'MoveR:110-11' Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, r!5, s!_), Mem(l!5, s!_), Sensor(m!9) -> \
               Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, r!5, s!_), Mem(l!5, s!_), Sensor(m!9) @ \
               'kMove' # dE = 0

'MoveR: 00-10' Mem(r!1, s), Mem(l!1, r!2, s  ), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s!_), Mem(l!4, s), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s!9), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!_), Mem(l!4, s), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * (1 - 2 * 'alpha')) # dE = J - 2aJ

'MoveR: 00-11' Mem(r!1, s), Mem(l!1, r!2, s  ), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s!_), Mem(l!4, s!_), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s!9), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!_), Mem(l!4, s!_), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * (1 - 'alpha')) # dE = J - aJ

'MoveR:010-0'  Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, s), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, s), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * (2 * 'alpha' - 1)) # dE = -J + 2aJ

'MoveR:110-0'  Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, s), Sensor(m!9) -> \
               Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, s), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * ('alpha' - 1)) # dE = -J + aJ

'MoveR: 00-0'  Mem(r!1, s), Mem(l!1, r!2, s  ), Mem(l!2, r!3, s!9), Mem(l!3, s), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s!9), Mem(l!2, r!3, s  ), Mem(l!3, s), Sensor(m!9) @ \
               'kMove' # dE = 0

#'MoveL' Mem(s!1, r!2), Sensor(m!1), Mem(l!2, s) -> Mem(s, r!2), Sensor(m!1), Mem(l!2, s!1) @ 'kMove'
'MoveL:01-010' Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, r!5, s!_), Mem(l!5, s), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, r!5, s!_), Mem(l!5, s), Sensor(m!9) @ \
               'kMove' # dE = 0

'MoveL:01-011' Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, r!5, s!_), Mem(l!5, s!_), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, r!5, s!_), Mem(l!5, s!_), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * '-1' * 'alpha') # dE = -aJ

'MoveL:11-010' Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, r!5, s!_), Mem(l!5, s), Sensor(m!9) -> \
               Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, r!5, s!_), Mem(l!5, s), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * 'alpha') # dE = aJ

'MoveL:11-011' Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, r!5, s!_), Mem(l!5, s!_), Sensor(m!9) -> \
               Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, r!5, s!_), Mem(l!5, s!_), Sensor(m!9) @ \
               'kMove' # dE = 0

'MoveL: 0-010' Mem(r!1, s), Mem(l!1, r!2, s!9), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!_), Mem(l!4, s), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s  ), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s!_), Mem(l!4, s), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * (2 * 'alpha' - 1)) # dE = -J + 2aJ

'MoveL: 0-011' Mem(r!1, s), Mem(l!1, r!2, s!9), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!_), Mem(l!4, s!_), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s  ), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s!_), Mem(l!4, s!_), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * ('alpha' - 1)) # dE = -J + aJ

'MoveL:01-00'  Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, s), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, s), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * (1 - 2 * 'alpha')) # dE = J - 2aJ

'MoveL:11-00'  Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s!9), Mem(l!3, r!4, s  ), Mem(l!4, s), Sensor(m!9) -> \
               Mem(r!1, s!_), Mem(l!1, r!2, s!_), Mem(l!2, r!3, s  ), Mem(l!3, r!4, s!9), Mem(l!4, s), Sensor(m!9) @ \
               'kMove' * [exp] ('lambda' * 'J' * (1 - 'alpha')) # dE = J - aJ

'MoveL: 0-00'  Mem(r!1, s), Mem(l!1, r!2, s!9), Mem(l!2, r!3, s  ), Mem(l!3, s), Sensor(m!9) -> \
               Mem(r!1, s), Mem(l!1, r!2, s  ), Mem(l!2, r!3, s!9), Mem(l!3, s), Sensor(m!9) @ \
               'kMove' # dE = 0


%init: 1 (Mem(l!1, r!2), Mem(l!2, r!3), Mem(l!3, r!4), Mem(l!4, r!5), Mem(l!5, r!6), Mem(l!6, r!7), Mem(l!7, r!8), \
          Mem(l!8, r!9), Mem(l!9, r!10), Mem(l!10, r!1))

%obs: 'Mem' Mem()
%obs: 'Sensor' Sensor(m!_)
%plot: 'Sensor'/'Mem'