Jump to content

The CA model: Difference between revisions

From SELESwiki
No edit summary
 
 
(6 intermediate revisions by the same user not shown)
Line 23: Line 23:
  Time Units: Step kiloStep 1000 1000
  Time Units: Step kiloStep 1000 1000
  Landscape Events:
  Landscape Events:
   Producer.lse DEBUG
   ConsumeCA.lse DEBUG
  Consumer.lse DEBUG
  Update.lse DEBUG
  Spatial Variables:
  Spatial Variables:
   LSState[3]
   LSState[3]
   PrevLSState[3]
   PrevLSState[3]
  Legends:
  Legends:
   LSStateTypes = {0:Uncolonised,   1:Producer, 2:Consumer}
   LSStateTypes = {0:Uncolonised, 1:Producer, 2:Consumer}
  Global Variables:
  Global Variables:
   pInitialProducer = 0.01
   pInitialProducer = 0.01
Line 38: Line 36:
   pDeathProducer = 0.01
   pDeathProducer = 0.01
   pDeathConsumer = 0.05
   pDeathConsumer = 0.05
//  SpreadRateProducer = 1
//  SpreadRateConsumer = 1
  Output Frequency: 1
  Output Frequency: 1


===consumer.lse===
===consumeCA.lse===
   // Process based definition for  consumber behaviour in producer/consumer  model
   // Producer/Consumer conceptual model implemented as a cellular automata
LSEVENT: Consumder
  // updating everything in a single event
DEFINITIONS
  LSEVENT: ConsumeCA
  LAYER: LSState, PrevLSState
  GLOBAL CONSTANT: Uncolonised, Producer,  Consumer
  GLOBAL VARIABLE: pInitialConsumer,  pSpreadConsumer, pDeathConsumer //,  SpreadRateConsumer
ENDDEF
// Just start once
RETURNTIME = 0
// Initialize in an empty cell
PROBINIT = IF LSState EQ Uncolonised THEN  pInitialConsumer ELSE 0
TRANSITIONS
  // Decide if this cell survives
  Dies = UNIFORM(0,1) < pDeathConsumer
  // If the consumer is dying
  IF Dies
      LSState = Uncolonised
  ENDFN
  TRANSITIONS = !Dies
  LSState = Consumer
ENDTR
SPREADTIMESTEP = 1 //SpreadRateConsumer
SPREADLOCATION
  REGION CENTRED(0,1, WRAPPED)
ENDSL
SPREADPROB
  // Always spread to the same cell  (self), and spread probabilistical to  neighbouring producer cells
  SPREADPROB = IF Location EQ (SOURCE  Location) THEN 1
              ELSE IF PrevLSState EQ  Producer  THEN pSpreadConsumer
              ELSE 0
ENDSP
 
===producer.lse===
// Process based definiton of producer  behaviour in producer/consumer model
LSEVENT: Producer
DEFINITIONS
  LAYER: LSState, PrevLSState
  GLOBAL CONSTANT: Uncolonised, Producer,  Consumer
  GLOBAL VARIABLE: pInitialProducer,  pSpreadProducer, pDeathProducer //,  SpreadRateProducer
ENDDEF
// Just start once
RETURNTIME = 0
  // Initialize in an empty cell
PROBINIT = IF LSState EQ Uncolonised THEN  pInitialProducer ELSE 0
TRANSITIONS
  // Decide if this cell survives
  Dies = UNIFORM(0,1) < pDeathProducer
  // If the producer is dying
  IF Dies
      LSState = Uncolonised
  ENDFN
  TRANSITIONS = (!Dies)
  LSState = Producer
ENDTR
SPREADTIMESTEP = 1 //SpreadRateProducer
SPREADLOCATION
  notEaten = PrevLSState EQ Producer //  check that the producer wasn't eaten  during the last step
  REGION CENTRED(0, 1, WRAPPED)
      DECISION notEaten // don't spread if  eaten (i.e. stop process)
ENDSL
SPREADPROB
  // Always spread to the same cell  (self), and spread probabilistically to  empty neighbouring cells
  SPREADPROB = IF Location EQ (SOURCE  Location) THEN 1 // spread to same cell
              ELSE IF PrevLSState EQ  Uncolonised THEN pSpreadProducer
              ELSE 0
ENDSP
 
===update.lse===
// Event to update time step
  LSEVENT: Update
  DEFINITIONS
  DEFINITIONS
   LAYER: LSState, PrevLSState
   LAYER: LSState, PrevLSState
  GLOBAL CONSTANT: Uncolonised, Producer, Consumer
  GLOBAL VARIABLE: pInitialProducer, pInitialConsumer
  GLOBAL VARIABLE: pSpreadProducer, pDeathProducer, pSpreadConsumer, pDeathConsumer
  ENDDEF
  ENDDEF
INITIALSTATE
  LSState = IF (UNIFORM(0,1) < pInitialConsumer) THEN Consumer
              ELSE IF (UNIFORM(0,1) < pInitialProducer) THEN Producer
              ELSE Uncolonised
  INITIALSTATE = 1
ENDIS
  RETURNTIME
  RETURNTIME
   RETURNTIME = 1
   RETURNTIME = 1
   PrevLSState = LSState
   PrevLSState = LSState
  ENDRT
  ENDRT
  NUMCLUSTERS = 0
  // Cellular automata: visit every cell and change state based on current state
// and neighbourhood
TRANSITIONS
  // An empty cell can possibly be colonised by a producer
  //  if it is next to at least one producer
  IF PrevLSState EQ Uncolonised
    OVER REGION CENTRED(1,1, WRAPPED)
        DECISION (PrevLSState EQ Producer) AND (UNIFORM(0,1) < pSpreadProducer)
        SOURCE LSState = Producer
    ENDFN
  // A producer can possibly die, or be eaten by a consumer
  ELSE IF PrevLSState EQ Producer
    IF (UNIFORM(0,1) < pDeathProducer)  // mortality
        LSState = Uncolonised
    ELSE
        OVER REGION CENTRED(1,1, WRAPPED)
            DECISION (PrevLSState EQ Consumer) AND (UNIFORM(0,1) < pSpreadConsumer)
            SOURCE LSState = Consumer
        ENDFN
    ENDFN
  // A consumer may die
  ELSE // PrevLSState EQ Consumer
    IF UNIFORM(0,1) < pDeathConsumer
        LSState = Uncolonised
    ENDFN
  ENDFN
  TRANSITIONS = FALSE
ENDTR


==Suggested Experiments==
==Suggested Experiments==


To explore this cellular automata model further, try the following:
To explore this cellular automata model further, try the following:

Latest revision as of 21:35, 15 November 2006

Summary

Screenshot

Download Model

Download the .scn, .sel and .lse files by clicking on the following link: File:ProducerConsumer.zip

Model Code Exploration

In the following sections we will examine all of the model files for this model. Note that instead of downloading the zip file above, you could just copy the text in the boxes below into a text editor and save it with the appropriate name (Section title). Opening the resulting .scn file in the SELES simulator would run this model.

Consume.scn

Seles Scenario
Model.sel
SimPriority Low Priority

Model.sel

Seles Model
Time Units: Step kiloStep 1000 1000
Landscape Events:
 ConsumeCA.lse DEBUG
Spatial Variables:
 LSState[3]
 PrevLSState[3]
Legends:
 LSStateTypes = {0:Uncolonised, 1:Producer, 2:Consumer}
Global Variables:
 pInitialProducer = 0.01
 pInitialConsumer = 0.01
 pSpreadProducer = 0.1
 pSpreadConsumer = 0.2
 pDeathProducer = 0.01
 pDeathConsumer = 0.05
Output Frequency: 1

consumeCA.lse

 // Producer/Consumer conceptual model implemented as a cellular automata
// updating everything in a single event
LSEVENT: ConsumeCA
DEFINITIONS
  LAYER: LSState, PrevLSState
  GLOBAL CONSTANT: Uncolonised, Producer, Consumer
  GLOBAL VARIABLE: pInitialProducer, pInitialConsumer
  GLOBAL VARIABLE: pSpreadProducer, pDeathProducer, pSpreadConsumer, pDeathConsumer
ENDDEF
INITIALSTATE
 LSState = IF (UNIFORM(0,1) < pInitialConsumer) THEN Consumer
             ELSE IF (UNIFORM(0,1) < pInitialProducer) THEN Producer
             ELSE Uncolonised
  INITIALSTATE = 1
ENDIS
RETURNTIME
  RETURNTIME = 1
  PrevLSState = LSState
ENDRT
// Cellular automata: visit every cell and change state based on current state
// and neighbourhood
TRANSITIONS
 // An empty cell can possibly be colonised by a producer
 //   if it is next to at least one producer
 IF PrevLSState EQ Uncolonised
    OVER REGION CENTRED(1,1, WRAPPED)
        DECISION (PrevLSState EQ Producer) AND (UNIFORM(0,1) < pSpreadProducer)
        SOURCE LSState = Producer
    ENDFN
 // A producer can possibly die, or be eaten by a consumer
 ELSE IF PrevLSState EQ Producer
    IF (UNIFORM(0,1) < pDeathProducer)  // mortality
        LSState = Uncolonised
    ELSE
       OVER REGION CENTRED(1,1, WRAPPED)
           DECISION (PrevLSState EQ Consumer) AND (UNIFORM(0,1) < pSpreadConsumer)
           SOURCE LSState = Consumer
       ENDFN
    ENDFN
 // A consumer may die
 ELSE // PrevLSState EQ Consumer
    IF UNIFORM(0,1) < pDeathConsumer
       LSState = Uncolonised
    ENDFN
 ENDFN
 TRANSITIONS = FALSE
ENDTR

Suggested Experiments

To explore this cellular automata model further, try the following: