Evolving Fractal Trees

No preview image

1 collaborator


almost as cool as ifs kits 

"but only almost"

Tagged by Michelle Wilkerson-Jerde about 15 years ago

coolest models 

"because I need to compete with Michelle"

Tagged by Forrest Stonedahl over 15 years ago


"fractals are fun"

Tagged by Reuven M. Lerner over 15 years ago


"should be self explanatory..."

Tagged by Forrest Stonedahl over 15 years ago

Model group Fractal Lovers | Visible to everyone | Changeable by everyone
Model was written in NetLogo 4.1beta2pre2 • Viewed 790 times • Downloaded 51 times • Run 15 times
Download the 'Evolving Fractal Trees' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


$Id: Evolving Fractal Trees.nlogo 43333 2009-03-14 05:20:52Z fjs750 $


This section could give a general understanding of what the model is trying to show or explain.


This section could explain what rules the agents use to create the overall behavior of the model.


This section could explain how to use the model, including a description of each of the items in the interface tab.


This section could give some ideas of things for the user to notice while running the model.


This section could give some ideas of things for the user to try to do (move sliders, switches, etc.) with the model.


This section could give some ideas of things to add or change in the procedures tab to make the model more complicated, detailed, accurate, etc.


This section could point out any especially interesting or unusual features of NetLogo that the model makes use of, particularly in the Procedures tab. It might also point out places where workarounds were needed because of missing features.


This section could give the names of models in the NetLogo Models Library or elsewhere which are of related interest.


This section could contain a reference to the model's URL on the web if it has one, as well as any other necessary credits or references.

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

breed [drawings drawing ]

drawings-own [

to setup
  ask patches [
    sprout-drawings 1 [
      set genome n-values 8 [ random-float 1.0 ]

 ask drawings [ do-drawing ]

to go
  every 5 [
    ask drawings [ pen-up ]
    ask drawings
  if mouse-down? [
    ask patch mouse-xcor mouse-ycor [
      ask turtles-here [
        set fitness fitness + 1

to do-drawing
  let max-dist 0.5
  let scale-factor 0.5 + 0.5 * item 0 genome
  let n floor (2 + 9 * item 1 genome)
  let angle1 floor (360 * item 2 genome)
  let angle2 floor (360 * item 3 genome)
  let col 1 + 10 * (floor 14 * item 4 genome)
  let col-incr 0.00 + 14 * item 5 genome
  let psize 5 * item 6 genome
  set heading 360 * item 7 genome

  let dist max-dist * (scale-factor - 1) / (scale-factor ^ n - 1)

  draw-tree n dist psize scale-factor col col-incr angle1 angle2

to draw-tree [ n dist pensize scale-factor col col-incr angle1 angle2]
  if (n = 0) [ stop ]
  set pen-size pensize
  set color col
  fd dist
  rt angle1
  draw-tree (n - 1) dist * scale-factor pensize * scale-factor scale-factor col + col-incr col-incr angle1 angle2
  lt angle1
  rt angle2
  draw-tree (n - 1) dist * scale-factor pensize * scale-factor scale-factor col + col-incr col-incr angle1 angle2
  lt angle2
  set pen-size pensize
  set color col
  bk dist

;; This procedure does the main work of the genetic algorithm.
;; We start with the old generation of solutions.
;; We choose solutions with good fitness to produce offspring
;; through crossover (sexual recombination), and to be cloned
;; (asexual reproduction) into the next generation.
;; There is also a chance of mutation occurring in each individual.
;; After a full new generation of solutions has been created,
;; the old generation dies.

to create-next-generation
  ; The following line of code looks a bit odd, so we'll explain it.
  ; if we simply wrote "LET OLD-GENERATION SONGS",
  ; then OLD-GENERATION would mean the set of all songs, and when
  ; new solutions were created, they would be added to the breed, and
  ; OLD-GENERATION would also grow.  Since we don't want it to grow,
  ; we instead write "SONGS WITH [TRUE]", which makes OLD-GENERATION
  ; an agentset, which doesn't get updated when new solutions are created.
  let old-generation drawings with [true]
  let population-size (count patches)
  ; Some number of the population is created by crossover each generation
  ; we divide by 2 because each time through the loop we create two children.
  let crossover-count  (floor (population-size * crossover-rate / 100 / 2))

  repeat crossover-count
    ; We use "tournament selection", with tournament size = 3.
    ; This means, we randomly pick 3 solutions from the previous generation
    ; and select the best one of those 3 to reproduce.

    let parent1 min-one-of (n-of 3 old-generation) [fitness]
    let parent2 min-one-of (n-of 3 old-generation) [fitness]
    let inherited-fitness 0.3 * ([fitness] of parent1 + [fitness] of parent2)
    let child-genome-pair crossover ([genome] of parent1) ([genome] of parent2)

    ; create the two children, with their new genetic material
    ask parent1 [ hatch 1 [ set genome item 0 child-genome-pair set fitness inherited-fitness ] ]
    ask parent2 [ hatch 1 [ set genome item 1 child-genome-pair set fitness inherited-fitness ] ]

  ; the remainder of the population is created by cloning
  ; selected members of the previous generation
  repeat (population-size - crossover-count * 2)
    ask max-one-of (n-of 3 old-generation) [fitness]
      [ hatch 1 [ set fitness 0.3 * fitness ] ]

  ask old-generation [ die ]

  ; now we're just talking to the new generation of solutions here
  ask drawings
    ; there's a chance of mutations occurring
    let emptyspots patches with [ not any? turtles-here ]
    if any? emptyspots [ move-to one-of emptyspots ]

;; ===== Mutations

;; This reporter performs one-point crossover on two lists of bits.
;; That is, it chooses a random location for a splitting point.
;; Then it reports two new lists, using that splitting point,
;; by combining the first part of bits1 with the second part of bits2
;; and the first part of bits2 with the second part of bits1;
;; it puts together the first part of one list with the second part of
;; the other.

to-report crossover [bits1 bits2]
  let split-point 1 + random (length bits1 - 1)
  report list (sentence (sublist bits1 0 split-point)
                        (sublist bits2 split-point length bits2))
              (sentence (sublist bits2 0 split-point)
                        (sublist bits1 split-point length bits1))

to mutate   ;; song procedure
  set genome map [ifelse-value (random-float 100.0 < mutation-rate) [(? + random-normal 0 0.5) mod 1.0] [?]]

There are 2 versions of this model.

Uploaded by When Description Download
Forrest Stonedahl about 14 years ago I moved around interface items. I didn't do anything else. I don't know where this model is going. this is just a test, to see how long of comments I can make. Download this version
Forrest Stonedahl about 14 years ago Initial upload Download this version

Attached files

No files

This model does not have any ancestors.

This model does not have any descendants.