Exploitation vs. Protection HubNet Model Blass Final Project

No preview image

1 collaborator

Default-person Joe Blass (Author)

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by everyone
Model was written in NetLogo 5.2.0 • Viewed 248 times • Downloaded 34 times • Run 0 times
Download the 'Exploitation vs. Protection HubNet Model Blass Final Project' 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

globals [
  shape-options
  social-gain
]

turtles-own [
  ;;; internal setting variables
  user-id
  my-shape
  social-currency
  
  ;;; turn variables
  take-action
  my-neighbors
  got-away?
  already-moved?
  action-selected?
  next-xcor
  next-ycor
  
  ;;; lifetime variables
  my-thefts
  my-placids
  my-protects
  how-many-times-I-got-away
  
  ;;; helper variables
  my-count ;; this is just a placeholder variable; not at all necessary for logic but is handy to avoid retyping code bloacks
  ]

to startup
  hubnet-reset
  setup
end 

to setup
  ca
  
  ask patches [ set pcolor grey ]
  set social-gain 10 ;; the one global; might want to make the increment greater or smaller

  reset-ticks
end 

to play
  update-active-turtles
  display
  if (any? turtles) [
  
    ;;; first code block resets internals, moves the turtles, and picks what to do
    ask turtles [
      ;;; reset some information at each tick
      send-player-info
      set got-away? false 
      set already-moved? false
      set action-selected? false
      set my-neighbors other turtles in-radius 10 ;; this is a smaller radius than the baseline netlogo model since we want to give turtles a chance to avoid thieves
    ]
    
    if any? turtles with [color = red] [
      hubnet-broadcast-message "thieves who were caught stealing last turn (red turtles) move (10 seconds)"
      move-thieves ;;; thieves move first so that others can avoid them
      ask turtles with [color = red] [
        setxy next-xcor next-ycor
      ]
      display ;; have to tick multiple times per round; in this function we also update user info
    ]
    hubnet-broadcast-message "everyone else moves (10 seconds)"
    move-others ;;; then everyone else
    ask turtles with [not (color = red)] [
      setxy next-xcor next-ycor
    ]
    display
    
    hubnet-broadcast-message "Everyone: pick what you're going to do next. You have 10 seconds"
    get-actions ;;; after everyone has moved, they choose what to do
    
    resolve ;;; and they resolve the consequences of their actions, including color change
    
    tick
  ]
end 

to resolve
  ;;; this is only its own function out of convenience; could be in-line with go
  ask turtles [
    ifelse (take-action = "steal")
    [ steal 
      if (random 100 < probability-of-getting-away) 
      [ set got-away? true
        set how-many-times-I-got-away how-many-times-I-got-away + 1]
      set my-thefts my-thefts + 1] ;;; thieves have a chance of getting away with it
    [ ifelse (take-action = "protect") 
      [ protect 
        set my-protects my-protects + 1]
      [ do-nothing 
        set my-placids my-placids + 1]
    ]
  ]
end 

to steal
  ;;; note that steal actually handles MOST of what happens to turtles, i.e., both thieves and protectors  
 
  ;;; in this implementation, a successful thief takes TOTAL social-gain divided amongst the victims. another possibility would be to have it take a social-gain from EACH victim
  ifelse (got-away? or not any? my-neighbors with [take-action = "protect"]) ;; if no one is watching out for thieves or you get away with it
  [ set my-count (count my-neighbors)
    if (my-count > 0) ;; provided you have neighbors
    [ set social-currency (social-currency + social-gain) ;; get social-gain from chumpy neighbors
      ask my-neighbors [set social-currency (social-currency - (social-gain / [my-count] of myself))] ];; each neighbor loses social-gain/count neighbors                                                                                                    ;;; if you have no neighbors, don't sweat it, you do nothing.
    set color green ;;; it looks like you did nothing
  ] 
  
  ;;; otherwise, someone is watching out for thieves AND you got caught
  [ set my-count (count my-neighbors with [take-action = "protect"])
    set social-currency (social-currency - social-gain) ;; lose social-gain
    ask my-neighbors with [take-action = "protect"]
      [ set social-currency (social-currency + (social-gain / [my-count] of myself))]  ;;; protectors don't each get social-gain, since the more protectors you have, the less each protection matters
   
    set color red ;;; labeled a thief
  ]
end 

to protect
  set my-count (count my-neighbors with [take-action = "steal" and not got-away?])
  if (my-count = 0) ;; if none of your neighbors tried to steal and did not get away with it, then you are being a busybody
    [ set social-currency (social-currency - social-gain) ;; lose social-gain 
      ask my-neighbors [set social-currency (social-currency + (social-gain / [count my-neighbors] of myself))]] ;;; all your neighbors are smugly satisfied with themselves and each other
  set color blue ;;; protectors turn blue regardless of whether they are nosy or not
end 

to do-nothing
  ;;; the only thing we need to do within this function is change the color a bit
  set color green
end 

to update-active-turtles
  while [ hubnet-message-waiting? ]
  [
    hubnet-fetch-message
    ifelse hubnet-enter-message?
    [ create-new-member ]
    [
      if hubnet-exit-message?
      [ remove-member ]
    ]
  ]
end 

;; Create a turtle, set its shape, color, and position
;; and tell the node what its turtle looks like and where it is

to create-new-member
  crt 1
  [
    set user-id hubnet-message-source
    set social-currency 20 ;; they should start with something so they have something to lose.
    set my-shape one-of shapes
    set shape my-shape
    set size 3
    set color black
    hubnet-send-message user-id (word "You are a: " my-shape)
    send-player-info
  ]
end 

to move-thieves
  ask turtles with [(color = red)] [ ;;; just the people who stole last turn
    hubnet-send-message user-id "Click where you want to move next. You have 10 seconds."
  ]
  reset-timer
  while [timer < 10]
  [
    while [hubnet-message-waiting?]
    [ 
      hubnet-fetch-message    
      ifelse hubnet-enter-message?
      [ create-new-member ]
      [
        ifelse hubnet-exit-message?
        [ remove-member ]
        [
          ask turtles with [user-id = hubnet-message-source and color = red and not already-moved?]
          [
            ifelse hubnet-message-tag = "View"
            [ set next-xcor (item 0 hubnet-message)
              set next-ycor (item 1 hubnet-message)
              set already-moved? true]
            [hubnet-send-message user-id "Please click within the view screen."]
          ]
        ]  
      ]
    ]
  ]
end 

to move-others
  ask turtles with [ not (color = red)] [ ;;; just people who did not steal
    hubnet-send-message user-id "Click where you want to move next. You have 10 seconds."
  ]
  
  reset-timer
  while [timer < 10]
  [
    while [hubnet-message-waiting?]
    [ 
      hubnet-fetch-message    
      ifelse hubnet-enter-message?
      [ create-new-member ]
      [
        ifelse hubnet-exit-message?
        [ remove-member ]
        [
          ask turtles with [user-id = hubnet-message-source and not (color = red) and not already-moved?]
          [
            ifelse hubnet-message-tag = "View"
            [ set next-xcor (item 0 hubnet-message)
              set next-ycor (item 1 hubnet-message)
              set already-moved? true]
            [hubnet-send-message user-id "Please click within the view screen."]
          ] 
        ] 
      ]
    ]
  ]
end 

to get-actions
  reset-timer
  while [timer < 15]
  [
    while [hubnet-message-waiting?]
    [
      hubnet-fetch-message
      ifelse hubnet-enter-message?
      [ create-new-member ]
      [
        ifelse hubnet-exit-message?
        [ remove-member ]
        [
          ask turtles with [user-id = hubnet-message-source and not action-selected?] ;; just to stop people from changing their actions a lot and slowing things down
          [ 
            ifelse hubnet-message-tag = "View"
            [hubnet-send-message user-id "Please select an action using one of the buttons."]
            [ set take-action hubnet-message-tag 
              set action-selected? true]
          ]
        ]
      ]
    ]
  ]
end 

to remove-member
  ask turtles with [user-id = hubnet-message-source] [die]
end 

to send-player-info ;; player procedure
  ;;; global info
  hubnet-send user-id "Percent Chance of getting away with stealing" probability-of-getting-away
  hubnet-send user-id "Your social currency" social-currency
  hubnet-send user-id "How many times you've stolen" my-thefts
  hubnet-send user-id "How many times you've protected" my-protects
  hubnet-send user-id "How many times you've done nothing"  my-placids
  hubnet-send user-id "How many times you got away with stealing" how-many-times-I-got-away
  hubnet-send user-id "Richest Turtle" highest-score
  hubnet-send user-id "Poorest Turtle" lowest-score
end 

to-report highest-score
  report max [social-currency] of turtles
end 

to-report lowest-score
  report min [social-currency] of turtles
end 

to-report proportion-turtles-who-just-stole
  ifelse (count turtles = 0)
  [report 0]
  [ report turtles-who-just-stole / count turtles]
end 

to-report proportion-turtles-who-just-protected
  ifelse (count turtles = 0)
  [report 0]
  [ report turtles-who-just-protected / count turtles]
end 

to-report proportion-turtles-who-just-did-nothing
  ifelse (count turtles = 0)
  [report 0]
  [ report turtles-who-just-did-nothing / count turtles]
end 

to-report turtles-who-just-stole
  report count turtles with [take-action = "steal"]
end 

to-report turtles-who-just-protected
  report count turtles with [take-action = "protect"]
end 

to-report turtles-who-just-did-nothing
  report count turtles with [take-action = "do-nothing"]
end 

to-report num-thefts ;; turtle reporter
  report my-thefts
end 

to-report num-placidities
  report my-placids
end 

to-report num-protections
  report my-protects
end 

to-report times-gotten-away
  report how-many-times-I-got-away
end 

There are 3 versions of this model.

Uploaded by When Description Download
Joe Blass almost 9 years ago New Version with Info Tab filled in Download this version
Joe Blass almost 9 years ago Newer version with info tab filled in. Download this version
Joe Blass almost 9 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.