Wolf Sheep Predation - GoGo Plotter

No preview image

1 collaborator

Default-person Arthur Hjorth (Author)

Tags

(This model has yet to be categorized with any tags)
Child of model Wolf Sheep Predation preview imageWolf Sheep Predation
Model group LS426-2012 | Visible to everyone | Changeable by group members (LS426-2012)
Model was written in NetLogo 5.0RC7 • Viewed 969 times • Downloaded 31 times • Run 0 times
Download the 'Wolf Sheep Predation - GoGo Plotter' modelDownload this modelEmbed this model

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


Comments and Questions

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

Click to Run Model

extensions [gogo]

globals [
  
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  
  ;; @FIrat, all new global parameters for our go go board version
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  
  grass?
  grass-regrowth-time  
  penmovetimer ;; timer for moving pen
  plotting? ;; have we started plotting yet
  lastdsheeppos? ;; was the last change in sheep population positive?
  lastsheepcount
  grass  ;; keep track of how much grass there is
  serial-port   ;; different on different operating systems
  paperstarted? ;; boolean for whether paper has been started
  ] 

;; Sheep and wolves are both breeds of turtle.
breed [sheep a-sheep]  ;; sheep is its own plural, so we use "a-sheep" as the singular.
breed [wolves wolf]
turtles-own [energy]       ;; both wolves and sheep have energy
patches-own [countdown]

to setup
  clear-all
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;
  ;;; @Firat, our new setup procedures
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;    
  setup-gogo
  ;; set last dsheep to positive
  set lastdsheeppos? true
  ;; sets lastsheepcount to 155 because that is just about the mean sheep count with the currently setup parameters
  ;; and so that therefore works as the starting point for the pen
  set lastsheepcount 155
  
  set grass? true
  set grass-regrowth-time 30
  
  set paperstarted? false
  
  set plotting? false
  
  ;; set the penmovetimer to silly high number so it does not start at first
  set penmovetimer -1
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;
  ;;; @Firat, this is the old code
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;    
  


  
  ;; "old" predation model code
  ask patches [ set pcolor green ]
  ;; check GRASS? switch.
  ;; if it is true, then grass grows and the sheep eat it
  ;; if it false, then the sheep don't need to eat
  if grass? [
    ask patches [
      set countdown random grass-regrowth-time ;; initialize grass grow clocks randomly
      set pcolor one-of [green brown]
    ]
  ]
  set-default-shape sheep "sheep"
  create-sheep initial-number-sheep  ;; create the sheep, then initialize their variables
  [
    set color white
    set size 1.5  ;; easier to see
    set label-color blue - 2
    set energy random (2 * sheep-gain-from-food)
    setxy random-xcor random-ycor
  ]
  set-default-shape wolves "wolf"
  create-wolves initial-number-wolves  ;; create the wolves, then initialize their variables
  [
    set color black
    set size 1.5  ;; easier to see
    set energy random (2 * wolf-gain-from-food)
    setxy random-xcor random-ycor
  ]
  display-labels
  set grass count patches with [pcolor = green]
  reset-ticks
end 

to go
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;
  ;; @Firat: These are our new procedures
  ;; we start plotting when there are exactly 155 sheep
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  

  if(plotting?)
  [
    pauseanddraw    
  ]

  if(count sheep = 155)
  [
    set plotting? true
    ask sheep [set color red]    
    if (not paperstarted?) [runpaper]
  ]


;  if(count sheep = 155)
;  [
;      runpaper
;      movepen
;      set plotting? true
;      ask sheep [set color red]
;      
;  ]
  
  ;; if we have started plotting, we check if the pen move timer is up
  ;; the pen move timer is a set amount of time from the last time we started the motors
  ;; and is calculated in move-pen-for-time
  ;; if we are plotting and the pen move timer is up, we move the pen again
;  if (plotting?)
;  [
;    if timer > penmovetimer
;    [
;      movepen
;    ]
;  ]
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;
  ;;; @Firat OLD CODE  
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  
  if not any? turtles [ stop ]
  ask sheep [
    move
    if grass? [
      set energy energy - 1  ;; deduct energy for sheep only if grass? switch is on
      eat-grass
    ]
    death
    reproduce-sheep
  ]
  ask wolves [
    move
    set energy energy - 1  ;; wolves lose energy as they move
    catch-sheep
    death
    reproduce-wolves
  ]
  if grass? [ ask patches [ grow-grass ] ]
  set grass count patches with [pcolor = green]
  tick
  display-labels

if (stop?) [stoppaper]  
if (not stop?) [go]
end 

to move  ;; turtle procedure
  rt random 50
  lt random 50
  fd 1
end 

to eat-grass  ;; sheep procedure
  ;; sheep eat grass, turn the patch brown
  if pcolor = green [
    set pcolor brown
    set energy energy + sheep-gain-from-food  ;; sheep gain energy by eating
  ]
end 

to reproduce-sheep  ;; sheep procedure
  if random-float 100 < sheep-reproduce [  ;; throw "dice" to see if you will reproduce
    set energy (energy / 2)                ;; divide energy between parent and offspring
    hatch 1 [ rt random-float 360 fd 1 ]   ;; hatch an offspring and move it forward 1 step
  ]
end 

to reproduce-wolves  ;; wolf procedure
  if random-float 100 < wolf-reproduce [  ;; throw "dice" to see if you will reproduce
    set energy (energy / 2)               ;; divide energy between parent and offspring
    hatch 1 [ rt random-float 360 fd 1 ]  ;; hatch an offspring and move it forward 1 step
  ]
end 

to catch-sheep  ;; wolf procedure
  let prey one-of sheep-here                    ;; grab a random sheep
  if prey != nobody                             ;; did we get one?  if so,
    [ ask prey [ die ]                          ;; kill it
      set energy energy + wolf-gain-from-food ] ;; get energy from eating
end 

to death  ;; turtle procedure
  ;; when energy dips below zero, die
  if energy < 0 [ die ]
end 

to grow-grass  ;; patch procedure
  ;; countdown on brown patches: if reach 0, grow some grass
  if pcolor = brown [
    ifelse countdown <= 0
      [ set pcolor green
        set countdown grass-regrowth-time ]
      [ set countdown countdown - 1 ]
  ]
end 

to display-labels
  ask turtles [ set label "" ]
  if show-energy? [
    ask wolves [ set label round energy ]
    if grass? [ ask sheep [ set label round energy ] ]
  ]
end 

  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;
  ;;; Go go specific code
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  
;; setup go go board

to setup-gogo
    set serial-port user-one-of "Select a port:" gogo:ports
  gogo:open serial-port
  repeat 5
  [ if not gogo:ping
    [ user-message "The GoGo Board is not responding." ] ]
  gogo:talk-to-output-ports [ "a" "b" "b" "d" ]
  
  
  ;; sets the speed of both pen and paper to 1
  gogo:talk-to-output-ports [ "a" ]
  gogo:set-output-port-power 1
  gogo:talk-to-output-ports [ "b" ]
  gogo:set-output-port-power 1
end 

to movepen
 
  ;; find out the change in number of sheep
  ;; if there are more than 200 sheep or less than 110, the graph flatlines at min or max (which is why we
  ;; use a fake sheep count temp var)
  let fakesheepcount 0
  if count sheep > 200 [set fakesheepcount 200]
  if count sheep < 110 [set fakesheepcount 110]
  if fakesheepcount = 0 [set fakesheepcount count sheep]
  ;; find change in sheep
  let dsheep fakesheepcount - lastsheepcount
  
;  if abs dsheep < 30 [stop]
  ;; swap out lastsheepcount for current sheep count
  set lastsheepcount count sheep
  ;; reverse if last change was positive and it is now negative or vice versa
  if ((lastdsheeppos? and dsheep < 0) or (not lastdsheeppos? and dsheep > 0))
  [ show "reverse" ;; print debug
    show dsheep ;; print debug
    ;; "reverse" last change positive bool
    set lastdsheeppos? not lastdsheeppos?
    ;; reverse pen
    stoppen
    reversepen 
    ]
  ;; move the pen for 10 ms per sheep. Abs because otherwise we will set it to negative time and it will not work.
  move-pen-for-time abs dsheep * .5
end 



  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;
  ;;; @Firat new code, our go go related stuff
  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  ;;;;;;;;;;;;;;;;;;;;;  

to gogo-ping
  carefully
  [ if not gogo:ping
    [ user-message "Unable to ping GoGo Board." ] ]
  [ user-message error-message ]
end 

to move-pen-for-time [time]
  gogo:talk-to-output-ports [ "a" ]
gogo:output-port-on
  ;; set the timer 
  set penmovetimer time
  reset-timer
end 

to runpen
  gogo:talk-to-output-ports [ "a" ]
gogo:output-port-on
end 

to stoppen
gogo:talk-to-output-ports [ "a" ]
gogo:output-port-off
end 

to runpaper
  gogo:talk-to-output-ports [ "b" ]
gogo:output-port-on
end 

to stoppaper
gogo:talk-to-output-ports [ "b" ]
gogo:output-port-off
end 

to reversepen
  gogo:talk-to-output-ports [ "a" ]
gogo:output-port-reverse
end 

to reversepaper
  gogo:talk-to-output-ports [ "b" ]
gogo:output-port-reverse
end 

to pauseanddraw
  ;; find out the change in number of sheep
  ;; if there are more than 200 sheep or less than 110, the graph flatlines at min or max 
  ;; so we either kill extra sheep or make some if there are too few
  let fakesheepcount 0
  if count sheep > 200 [ask n-of (count sheep - 200) sheep [die]]
  if count sheep < 110 [
      create-sheep (110 - count sheep)  ;; create the sheep, then initialize their variables
  [
    set color white
    set size 1.5  ;; easier to see
    set label-color blue - 2
    set energy random (2 * sheep-gain-from-food)
    setxy random-xcor random-ycor
  ]
  ]
    
    
    
  if fakesheepcount = 0 [set fakesheepcount count sheep]
  ;; find change in sheep
  let dsheep fakesheepcount - lastsheepcount  
  
  set lastsheepcount fakesheepcount

  ;; reverse if last change was positive and it is now negative or vice versa
  if ((lastdsheeppos? and dsheep < 0) or (not lastdsheeppos? and dsheep > 0))
  [ ;; wait a second so that go go board does not get confused
    wait 1
    
     show "reverse" ;; print debug

    ;; "reverse" last change positive bool
    set lastdsheeppos? not lastdsheeppos?
    ;; reverse pen
    reversepen 
    ]
    show dsheep ;; print debug  
;  runpaper
  if dsheep != 0
  [

    runpen
    wait abs (dsheep * .01)
  ]
;  stoppaper
  stoppen
end 


; Copyright 1997 Uri Wilensky.
; See Info tab for full copyright and license.

There is only one version of this model, created almost 13 years ago by Arthur Hjorth.

Attached files

No files

Parent: Wolf Sheep Predation

This model does not have any descendants.

Graph of models related to 'Wolf Sheep Predation - GoGo Plotter'