Sustainable Village Group 7

Sustainable Village Group 7 preview image

1 collaborator

Default-person Ryan Winton (Author)

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by the author
Model was written in NetLogo 6.2.0 • Viewed 57 times • Downloaded 3 times • Run 0 times
Download the 'Sustainable Village Group 7' 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

;;INCLUDE FILES;;
;__includes["Agent_Script.nls" "Village_Script.nls"]
breed [trees tree]
breed [berries berry]
breed [animals animal]
breed[villagers villager]
breed [houses house]

turtles-own[
  age
  energy
  tiredness
  base-berries-weight
  base-wood-weight
  base-hunt-weight
  desired-berries
  desired-animals
  desired-trees
  berries-weight
  wood-weight
  hunt-weight
  rest-weight
  my-house
  occupants
  house-meat
  house-berries
]

globals
[
  berry-base-energy
  berry-bonus-energy
  meat-base-energy
  meat-bonus-energy

  n
  average-berry-weight
  average-wood-weight
  average-hunt-weight
  average-desired-berries
  average-desired-animals
  average-desired-trees
  village-wood
  village-berries
  village-meat
  empty-capacity
]

;;SETUP FUNCTION;;

to setup
  clear-all

  setup-patches

  setup-village ;;setup village

  set-default-shape houses "house"
  create-houses 1 [
    set color brown
    set size 2.5
    set energy 0
    house-position
  ]

  set-default-shape trees "tree"
  create-trees initial-number-trees [
    set color green
    set size 1.5
    ;;set energy 0
    resource-position
  ]

  set-default-shape berries "circle"
  create-berries initial-number-berries [
    set color red
    set size 0.5
    set energy 0
    resource-position
  ]

  set-default-shape animals "sheep"
  create-animals initial-number-animals [
    set color white
    set size 1
    set energy 100
    resource-position
  ]

  setup-agents ;;setup agents

  ;;display-labels
  reset-ticks
end 

to setup-trees
  ;;create-trees 50 [ setxy random-xcor random-ycor ]
end 

to setup-patches
  if grass-background = true
  [
    ask patches [ set pcolor 56 ]
  ]
end 

;;GO FUNCTION;;

to go

  choose-action ;; have agents wander around the map

  set empty-capacity 0
  ask houses[

    set empty-capacity empty-capacity + house-capacity - count links
    build-house

  ]

  ask villagers [

    villager-reproduce

  ]

  ask berries[

    grow-berries ;; for now the berries only spawn if other berries are still on the scene

  ]

  ask trees[

   grow-trees

  ]

  ask animals[

    wander-sheep
    grow-animals
    eat-berries
    ifelse show-energy = true
    [
      set label round energy
      set label-color [0 0 255]
    ]
    [
      set label ""
    ]
  ]

  calculate-food

  tick
end 

to grow-berries

   if random-float 100 < berries-spawn-rate and count (berries in-radius 1) < 2 [

    hatch 1 [resource-position]
  ]
end 

to grow-trees

   if random-float 200 < trees-spawn-rate and count (trees in-radius 2) < 2 [

    hatch 1 [ resource-position ]
  ]
end 

to grow-animals

   if random-float 200 < animals-spawn-rate [

    hatch 1 [ rt random-float 360 fd 1 ]
  ]
end 

to eat-berries
  if energy <= sheep-energy-to-eat ;;70
  [
    	if any? berries in-radius 1
    	[
      		ask berries in-radius 2 [die]
      set energy energy + 20
    	]
 ]
end 

to house-position
  setxy (-5 + random-float 10) (-5 + random-float 10)
end 

to resource-position
  let x random-float 32
  let y random-float 32

  if x > 7 or x < 25
  [
    set y random-float 32
    setxy x y
  ]ifelse x < 7 or x > 25
  [
    set y (7 + random-float 19)
    setxy x y
  ][setxy x y]
end 

to check-position
end 



;;TURTLE VARIABLES;;

to setup-agents
  set-default-shape turtles "person"
  create-villagers population
  [
    set-agent-stats
    if energy < 25 [set energy energy + 60]
    setxy random-xcor random-ycor
    set color pink
  ]
end 

to gather-berries
  set color red
  set energy energy - 0.5
  set tiredness tiredness + 0.05
  if any? berries in-radius 1
  [
    ask one-of berries in-radius 1 [die]
    let my-berries 0
    if my-house != nobody
    [ ask my-house [ set my-berries house-berries ] ]
    ifelse energy < 25 or my-berries >= max-berries-per-house or my-house = nobody ; only eat the food if hungry, else give to village
    [ set energy energy + base-berry-energy + random-float bonus-berry-energy ]
    [ ask my-house [ set house-berries house-berries + 1 ] ]
  ]
end 

to hunt
  set color orange
  set energy energy - 1.5
  set tiredness tiredness + 0.25
  if any? animals in-radius 1
  [
    if random-float 100 < hunting-risk [set energy energy - 25]
    ask one-of animals in-radius 1 [die]
    let my-meat 0
    if my-house != nobody
    [ ask my-house [ set my-meat house-meat ] ]
    ifelse energy < 25 or my-meat >= max-meat-per-house or my-house = nobody ; only eat the food if hungry, else give to village
    [ set energy energy + base-meat-energy + random-float bonus-meat-energy ]
    [ ask my-house [ set house-meat house-meat + 1 ] ]
  ]
end 

to gather-wood
  set energy energy - 0.5
  set tiredness tiredness + 0.1
  set color brown
  if any? trees in-radius 1
  [
    ask one-of trees in-radius 1 [die]
    set village-wood village-wood + 2
    set energy energy - 2
  ]
end 

to rest
  set color pink
  let house-x 0
  let house-y 0
  set energy energy - 0.2
  while [tiredness > 0]
  [
    if my-house != nobody
    [
      face my-house
      fd 0.5
      set energy energy + 0.5
    ]
    set tiredness tiredness - 0.5
  ]
  if tiredness < 0 [ set tiredness 0 ]
end 

to wander
  fd 1
  rt random 80
  lt random 80
end 

to wander-sheep
  fd 0.5
  rt random 40
  lt random 40
  set energy energy - 0.1
  if energy > 100
  [
    set energy 100
  ]
  if energy < 0
  [
    die
  ]
end 

to choose-action
  let total-berry-weight 0
  let total-wood-weight 0
  let total-hunt-weight 0
  let total-desired-berries 0
  let total-desired-animals 0
  let total-desired-trees 0
  ask villagers[
    ifelse show-energy = true
    [
      set label round energy
    ]
    [
      set label ""
    ]

    if energy > 200
    [
      set energy 200
    ]

    if tiredness > 100
    [
      set tiredness 100
    ]

    if my-house = nobody
    [
      let possible-house nobody
      ask one-of houses
      [
        if count links < house-capacity
        [
          create-link-with myself
          set possible-house self
        ]
      ]
      set my-house possible-house
    ]

    wander
    calculate-weights

    let random-number random-float (berries-weight + wood-weight + hunt-weight + rest-weight)
    (ifelse
      ; if berry gathering selected
      random-number < berries-weight
      [
        gather-berries
      ]
      ; if wood gathering selected
      random-number < wood-weight + berries-weight
      [
        gather-wood
      ]
      ; if hunt selected
      random-number < hunt-weight + wood-weight + berries-weight
      [
        hunt
      ]
      ; if resting selected, still uses a small amount of energy
      [
        rest
      ]
    )

    ; not using this - kept code just in case (ifelse energy < 40[gather-food]energy > 75[gather-wood][set color pink])
    if energy <= 0 ; if out of energy, try and eat from the village food, or else die
    [
      let my-berries 0
      let my-meat 0
      if my-house = nobody [ die ]
      ask my-house [
        set my-berries house-berries
        set my-meat house-meat
      ]
      (ifelse
        my-meat > 0
        [
          set energy energy + base-meat-energy + random bonus-meat-energy
          ask my-house [ set house-meat house-meat - 1 ]
        ]
        my-berries > 0
        [
          set energy energy + base-berry-energy + random bonus-berry-energy
          ask my-house [ set house-berries house-berries - 1 ]
        ]
        [
          die
        ]
      )
    ]
    set total-berry-weight total-berry-weight + base-berries-weight
    set total-wood-weight total-wood-weight + base-wood-weight
    set total-hunt-weight total-hunt-weight + base-hunt-weight
    set total-desired-berries total-desired-berries + desired-berries
    set total-desired-animals total-desired-animals + desired-animals
    set total-desired-trees total-desired-trees + desired-trees

    set age age + 1
  ]
  if count villagers > 1
  [
    set average-berry-weight total-berry-weight / count villagers
    set average-wood-weight total-wood-weight / count villagers
    set average-hunt-weight total-hunt-weight / count villagers
    set average-desired-berries total-desired-berries / count villagers
    set average-desired-animals total-desired-animals / count villagers
    set average-desired-trees total-desired-trees / count villagers
  ]
end 

to calculate-weights
  ; check if the village is low on food
  set berries-weight base-berries-weight
  set wood-weight base-wood-weight
  set hunt-weight base-hunt-weight
  if count berries != 0 and count berries < desired-berries - 5 and count animals > desired-animals + 5
  [
    set hunt-weight 1
  ]
  let my-berries max-berries-per-house
  let my-meat max-meat-per-house
  if my-house != nobody
  [
    ask my-house [
      set my-berries house-berries
      set my-meat house-meat
    ]
  ]
  ifelse my-berries < max-berries-per-house * 0.6 or my-meat < max-meat-per-house * 0.6 or energy < 50
  [
    ; check if villager is hungry, if it is there should be no particular emphasis on gathering wood
    if (energy < 50)
    [
      set wood-weight 0.1
    ]
    ifelse count berries > desired-berries + 5
    [
      set berries-weight 1
    ]
    [
      if count berries < desired-berries - 5
      [
        set berries-weight 0
      ]
    ]
    ifelse count animals > desired-animals + 5
    [
      set hunt-weight 1
    ]
    [
      if count animals < desired-animals - 5
      [
        set hunt-weight 0
      ]
    ]
  ]
  [
    set berries-weight 0
    set hunt-weight 0
    if count trees > desired-trees + 5
    [
      set wood-weight 1
    ]
  ]
  if count trees < desired-trees - 5 or (count houses * (house-capacity * 0.9)) >= count villagers
  [
    set wood-weight 0
  ]
  if tiredness > 60
  [
    set rest-weight 1
  ]
end 

to villager-reproduce

  let house-space 0
  if my-house != nobody [ ask my-house [ set house-space house-capacity - count links ] ]
  if energy > 80 and random-float 100 < villager-reproduction-rate and my-house != nobody and age > reproductive-age
  [
    set energy energy - 40
    let newborn-berries-weight base-berries-weight - 0.025 + random-float 0.05
    let newborn-wood-weight base-wood-weight - 0.025 + random-float 0.05
    let newborn-hunt-weight base-hunt-weight - 0.025 + random-float 0.05
    if newborn-berries-weight > 0.8 [set newborn-berries-weight 0.8]
    if newborn-wood-weight > 0.8 [set newborn-wood-weight 0.8]
    if newborn-hunt-weight > 0.8 [set newborn-hunt-weight 0.8]
    if newborn-berries-weight < 0.2 [set newborn-berries-weight 0.2]
    if newborn-wood-weight < 0.2 [set newborn-wood-weight 0.2]
    if newborn-hunt-weight < 0.2 [set newborn-hunt-weight 0.2]

    let newborn-desired-berries desired-berries - 0.5 + random-float 1
    let newborn-desired-animals desired-animals - 0.5 + random-float 1
    let newborn-desired-trees desired-trees - 0.5 + random-float 1

    if newborn-desired-berries < 5 [set newborn-desired-berries 5]
    if newborn-desired-animals < 5 [set newborn-desired-animals 5]
    if newborn-desired-trees < 5 [set newborn-desired-trees 5]

    let newborn-house 0
    if house-space > 0 [
      set newborn-house my-house
    ]

    hatch 1
    [
      rt random-float 360 fd 1
      set age 0
      set energy 100
      ifelse evolve-naturally = true
      [
        set base-berries-weight newborn-berries-weight
        set base-wood-weight newborn-wood-weight
        set base-hunt-weight newborn-hunt-weight
        set desired-berries newborn-desired-berries
        set desired-animals newborn-desired-animals
        set desired-trees newborn-desired-trees
      ]
      [
        set base-berries-weight initial-berries-weight
        set base-wood-weight initial-wood-weight
        set base-hunt-weight initial-hunt-weight
        set desired-berries initial-desired-berries
        set desired-animals initial-desired-animals
        set desired-trees initial-desired-trees
      ]
      ifelse my-house != nobody and house-space > 0 [
        set my-house newborn-house
      ]
      [
        set my-house nobody
      ]
      ask myself [
        if house-space > 0 [
          ask my-house [ create-link-with myself ]
        ]
      ]
    ]
  ]
end 

; set initial villagers stats

to set-agent-stats
  set age 0
  set size 1
  set energy 100
  set tiredness 0
  set base-berries-weight initial-berries-weight
  set base-wood-weight initial-wood-weight
  set base-hunt-weight initial-hunt-weight
  set desired-berries initial-desired-berries
  set desired-animals initial-desired-animals
  set desired-trees initial-desired-trees
  set rest-weight 0
  set my-house nobody
end 

to setup-village
  set village-wood initial-village-wood
end 

to calculate-food
  set village-meat 0
  set village-berries 0
  ask houses [
    if house-meat > max-meat-per-house [ set house-meat max-meat-per-house ]
    if house-berries > max-berries-per-house [ set house-berries max-berries-per-house ]
    set village-meat village-meat + house-meat
    set village-berries village-berries + house-berries
  ]
end 

to build-house

  if (village-wood >= wood-required-for-house) and (count houses * (house-capacity * 0.6) < count villagers) [

    set village-wood village-wood - wood-required-for-house
    hatch 1 [ house-position ]

  ]
end 

There is only one version of this model, created about 3 years ago by Ryan Winton.

Attached files

File Type Description Last updated
Sustainable Village Group 7.png preview Preview for 'Sustainable Village Group 7' about 3 years ago, by Ryan Winton Download

This model does not have any ancestors.

This model does not have any descendants.