State Machine Example 2 NetLogo Model

Produced for the book series "Exercises for Artificial Intelligence";

Author: W. J. Teahan; Publisher: Ventus Publishing Aps, Denmark.

powered by NetLogo

view/download model file: State-Machine-Example-2.nlogo

WHAT IS IT?

This model shows how to make your turtles into "state machines" using a turtle variable and the RUN command. A state machine consists of a collection of states with a different action associated with each state.

The model itself is an alternate version of the Termites model located in the Biology section of Sample Models. Termites is an unusual model in that it uses a turtle forever button; each turtle runs its code, out of synch with all the others. This version of the model uses an observer forever button instead. The state machine technique is necessary in order to code this model using an observer forever button. (For more on turtle forever buttons see the Programming Guide in the NetLogo User Manual.)

This model has been slightly modified by Bill Teahan from the State Machine Example model in NetLogo's Models Library. It has added a plot to graph the growth in the number of piles, or equivalently, the number of spaces, during the simulation. This is in order to estimate the progress of the self-organisation of the system as a whole.


WHAT IS ITS PURPOSE?

The purpose of the modified model is to ascertain whether a function based on global features can be used to measure the state of the simulation (i.e. how self-organised the system is). If the graph of the function shows a smooth upward curve, then it might be useful (for example) as a fitness function for an evolutionary algorithm in order to evolve the behaviour of the termites automatically rather than being explicitly programmed.


HOW TO USE IT?

First select a function to plot using the pileness-measure chooser. Then press the setup button to reset the simulation, then press the go button.


THE INTERFACE

The buttons in the Interface are defined as follows:

- setup: This resets the simulation so that the wood chips and termites are placed randomly.

- go: This runs the simulation.

The sliders, chooser, monitor and plot in the Interface are defined as follows:

- number: This sets the number of termites that will be created at the start of the simulation.

- density: This sets the percentage of patches that will be created as wood chips at the start of the simulation.

- pileness-measure: These are the functions that can be used to measure the self-organisation of the system i.e. how much of the wood chips have been organised into piles. There are two possible functions:
"Number of crowded spaces": This counts the number of patches which have more than 7 yellow-coloured neighbours.
"Number of empty spaces": This counts the number of patches which have more than 7 black-coloured neighbours.

- pileness: This reports the value of the pileness measure as computed by the function chosen by the pileness-measure chooser.

- pileness plot: This plots the pileness value for each tick of the simulation.


THINGS TO NOTICE

Compare the code to the code in the main Termites model. Which way of coding the model do you prefer...?

Note that the behavior of this version of the model isn't absolutely identical to the behavior of the original model. In this version, note that all the turtles begin white, then all turn red, then all turn back to white, and so forth. Gradually the turtles drift out of synch with each other until the coordinated flashing no longer happens. The main model exhibits the same effect, but in the main model, the turtles get out of synch with each other somewhat faster. That's because the way time passes in the two models is a little different. In this version, a turtle's "turn" consists of moving a step or changing tasks. In the original version, a turtle's "turn" is smaller, and consists only of executing a single NetLogo command.


THINGS TO TRY

Try devising your own pileness measures, or alternative functions to measure the self-organisation of the system.


NETLOGO FEATURES

Note the use of the RUN command to make each termite run a different procedure, depending on what task that termites is in the middle of. Since NetLogo 4.0, the RUN command is fast when you use it over and over again on the same strings.


RELATED MODELS

See the Termites model in the Models Library.


CREDITS AND REFERENCES

This model was modified by William John Teahan.

To refer to this model in publications, please use:

State Machine Example 2 NetLogo model.
Teahan, W. J. (2010). Artificial Intelligence. Ventus Publishing Aps.


PROCEDURES

turtles-own [
  task       ;; procedure name (a string) the turtle will run during this tick
  steps      ;; ...unless this number is greater than zero, in which
             ;; case this tick, the turtle just moves forward 1
]

to setup
  clear-all
  set-default-shape turtles "bug"
  ;; randomly distribute wood chips
  ask patches [
    if random-float 100 < density
      [ set pcolor yellow ]
  ]
  ;; randomly distribute termites
  crt number [
    set color white
    setxy random-xcor random-ycor
    set task "search-for-chip"
    set size 5  ;; easier to see
  ]
end

to go
  ask turtles
    [ ifelse steps > 0
        [ set steps steps - 1 ]
        [ run task
          wiggle ]
      fd 1 ]

  do-plot    
  tick
end

to do-plot
  plot pileness
end

to wiggle  ;; turtle procedure
  rt random 50
  lt random 50
end

to search-for-chip   ;; turtle procedure -- "picks up chip" by turning orange
  if pcolor = yellow
    [ set pcolor black
      set color orange
      set steps 20
      set task "find-new-pile" ]
end

to find-new-pile  ;; turtle procedure -- look for yellow patches
  if pcolor = yellow
    [ set task "put-down-chip" ]
end

to put-down-chip  ;; turtle procedure -- finds empty spot & drops chip
  if pcolor = black
   [ set pcolor yellow
     set color white
     set steps 20
     set task "get-away" ]
end

to get-away  ;; turtle procedure -- get out of yellow pile
  if pcolor = black
    [ set task "search-for-chip" ]
end

to-report pileness
  if (pileness-measure = "Number of crowded spaces")
    [ report count patches with [count neighbors with [pcolor = yellow] > 7] ]

  if (pileness-measure = "Number of empty spaces")
    [ report count patches with [count neighbors with [pcolor = black] > 7] ]
  
  report 0   
end

; Copyright 2007 Uri Wilensky. This code may be freely copied, distributed,
; altered, or otherwise used by anyone for any legal purpose.