Практика 4. Лабораторна. Некооперативні ігри.

Взяти за основу модель матричної гри з ненульовою сумою

globals[
  A
  B
]

patches-own [
  strategy       ;; current strategy of patch
  old-strategy   ;; old strategy of patch
  score            ;; score resulting from interaction of neighboring patches
]

to setup
  clear-all
  ask patches [
    ifelse random-float 1.0 < (initial-strategy-A / 100)
      [ setup-strategy 1]
      [setup-strategy 2]
    establish-color
  ]
  reset-ticks
end

to setup-strategy [value]
  set strategy value
  set old-strategy value
end

to go
  ask patches [interact]          ;; to play with a neighboring patch
  ask patches [select-strategy]   ;; adopt the strategy of the neighbor (who had the highest score)
  tick
 end

to go-once
  ask patches [interact]          ;; to play with a neighboring patch
  ask patches [select-strategy]   ;; adopt the strategy of the neighbor (who had the highest score)
  tick
 end

to interact  ;; patch procedure
let randpatch one-of patches
let strategy1 [strategy] of randpatch
let strategy2 [strategy] of self

  if (not interact?) [set randpatch one-of neighbors]
    ifelse (strategy2 = 1)
      [ifelse (strategy1 = 1)
        [set score A-A * coordination-award]
        [set score A-B]
      ]
     [ifelse (strategy1 = 1)
      [set score B-A ]
      [set score B-B * coordination-award]
     ]

end

to select-strategy  ;; patch procedure
  set old-strategy strategy

  set strategy [strategy] of max-one-of neighbors [score]

  establish-color
end

to establish-color  ;; patch procedure
  ifelse (old-strategy = 1)
  [ifelse (strategy = 1)
    [set pcolor blue]
    [set pcolor orange ]
  ]
    [ifelse (strategy = 1)
    [set pcolor grey]
    [set pcolor red]
    ]
end

Завдання: розв’язати свій варіант

  1. Перетворити гру на біматричну (тобто додати інший тип гравця з іншими платежами для стратегій А та B): задати платежі обох гравців, що приймають участь у взаємодії. Запропонувати власне рішення як уникнути подвійного обходу гравців.

  2. Додати затримку на зміну стратегії, створити можливість двох популяцій з різними затримками. Дослідити зміну динаміки для різних значень затримки.

  3. Додати третій варіант стратегій - С, змінити матрицю гри та модель відповідним чином.

  4. Додати окрему популяцію, яка завжди використовує максимінну стратегію (для ігор з нульовою сумою).

Практика 5. Лабораторна. Навчання у іграх з повторенням.

Взяти за основу модель взаємодії у грі ділема ув’язненого (назва у бібліотеці моделей PD N person iterated)

globals [
  ;;number of turtles with each strategy
  num-random
  num-cooperate
  num-defect
  num-tit-for-tat
  num-unforgiving
  num-unknown

  ;;number of interactions by each strategy
  num-random-games
  num-cooperate-games
  num-defect-games
  num-tit-for-tat-games
  num-unforgiving-games
  num-unknown-games

  ;;total score of all turtles playing each strategy
  random-score
  cooperate-score
  defect-score
  tit-for-tat-score
  unforgiving-score
  unknown-score
]

turtles-own [
  score
  strategy
  defect-now?
  partner-defected? ;;action of the partner
  partnered?        ;;am I partnered?
  partner           ;;WHO of my partner (nobody if not partnered)
  partner-history   ;;a list containing information about past interactions
                    ;;with other turtles (indexed by WHO values)
]


;;;;;;;;;;;;;;;;;;;;;;
;;;Setup Procedures;;;
;;;;;;;;;;;;;;;;;;;;;;

to setup
  clear-all
  store-initial-turtle-counts ;;record the number of turtles created for each strategy
  setup-turtles ;;setup the turtles and distribute them randomly
  reset-ticks
end

;;record the number of turtles created for each strategy
;;The number of turtles of each strategy is used when calculating average payoffs.
;;Slider values might change over time, so we need to record their settings.
;;Counting the turtles would also work, but slows the model.
to store-initial-turtle-counts
  set num-random n-random
  set num-cooperate n-cooperate
  set num-defect n-defect
  set num-tit-for-tat n-tit-for-tat
  set num-unforgiving n-unforgiving
  set num-unknown n-unknown
end

;;setup the turtles and distribute them randomly
to setup-turtles
  make-turtles ;;create the appropriate number of turtles playing each strategy
  setup-common-variables ;;sets the variables that all turtles share
end

;;create the appropriate number of turtles playing each strategy
to make-turtles
  create-turtles num-random [ set strategy "random" set color gray - 1 ]
  create-turtles num-cooperate [ set strategy "cooperate" set color red ]
  create-turtles num-defect [ set strategy "defect" set color blue ]
  create-turtles num-tit-for-tat [ set strategy "tit-for-tat" set color lime ]
  create-turtles num-unforgiving [ set strategy "unforgiving" set color turquoise - 1 ]
  create-turtles num-unknown [set strategy "unknown" set color magenta ]
end

;;set the variables that all turtles share
to setup-common-variables
  ask turtles [
    set score 0
    set partnered? false
    set partner nobody
    setxy random-xcor random-ycor
  ]
  setup-history-lists ;;initialize PARTNER-HISTORY list in all turtles
end

;;initialize PARTNER-HISTORY list in all turtles
to setup-history-lists
  let num-turtles count turtles

  let default-history [] ;;initialize the DEFAULT-HISTORY variable to be a list

  ;;create a list with NUM-TURTLE elements for storing partner histories
  repeat num-turtles [ set default-history (fput false default-history) ]

  ;;give each turtle a copy of this list for tracking partner histories
  ask turtles [ set partner-history default-history ]
end


;;;;;;;;;;;;;;;;;;;;;;;;
;;;Runtime Procedures;;;
;;;;;;;;;;;;;;;;;;;;;;;;

to go
  clear-last-round
  ask turtles [ partner-up ]                        ;;have turtles try to find a partner
  let partnered-turtles turtles with [ partnered? ]
  ask partnered-turtles [ select-action ]           ;;all partnered turtles select action
  ask partnered-turtles [ play-a-round ]
  do-scoring
  tick
end

to clear-last-round
  let partnered-turtles turtles with [ partnered? ]
  ask partnered-turtles [ release-partners ]
end

;;release partner and turn around to leave
to release-partners
  set partnered? false
  set partner nobody
  rt 180
  set label ""
end

;;have turtles try to find a partner
;;Since other turtles that have already executed partner-up may have
;;caused the turtle executing partner-up to be partnered,
;;a check is needed to make sure the calling turtle isn't partnered.

to partner-up ;;turtle procedure
  if (not partnered?) [              ;;make sure still not partnered
    rt (random-float 90 - random-float 90) fd 1     ;;move around randomly
    set partner one-of (turtles-at -1 0) with [ not partnered? ]
    if partner != nobody [              ;;if successful grabbing a partner, partner up
      set partnered? true
      set heading 270                   ;;face partner
      ask partner [
        set partnered? true
        set partner myself
        set heading 90
      ]
    ]
  ]
end

;;choose an action based upon the strategy being played
to select-action ;;turtle procedure
  if strategy = "random" [ act-randomly ]
  if strategy = "cooperate" [ cooperate ]
  if strategy = "defect" [ defect ]
  if strategy = "tit-for-tat" [ tit-for-tat ]
  if strategy = "unforgiving" [ unforgiving ]
  if strategy = "unknown" [ unknown ]
end

to play-a-round ;;turtle procedure
  get-payoff     ;;calculate the payoff for this round
  update-history ;;store the results for next time
end

;;calculate the payoff for this round and
;;display a label with that payoff.
to get-payoff
  set partner-defected? [defect-now?] of partner
  ifelse partner-defected? [
    ifelse defect-now? [
      set score (score + 1) set label 1
    ] [
      set score (score + 0) set label 0
    ]
  ] [
    ifelse defect-now? [
      set score (score + 5) set label 5
    ] [
      set score (score + 3) set label 3
    ]
  ]
end

;;update PARTNER-HISTORY based upon the strategy being played
to update-history
  if strategy = "random" [ act-randomly-history-update ]
  if strategy = "cooperate" [ cooperate-history-update ]
  if strategy = "defect" [ defect-history-update ]
  if strategy = "tit-for-tat" [ tit-for-tat-history-update ]
  if strategy = "unforgiving" [ unforgiving-history-update ]
  if strategy = "unknown" [ unknown-history-update ]
end


;;;;;;;;;;;;;;;;
;;;Strategies;;;
;;;;;;;;;;;;;;;;

;;All the strategies are described in the Info tab.

to act-randomly
  set num-random-games num-random-games + 1
  ifelse (random-float 1.0 < 0.5) [
    set defect-now? false
  ] [
    set defect-now? true
  ]
end

to act-randomly-history-update
;;uses no history- this is just for similarity with the other strategies
end

to cooperate
  set num-cooperate-games num-cooperate-games + 1
  set defect-now? false
end

to cooperate-history-update
;;uses no history- this is just for similarity with the other strategies
end

to defect
  set num-defect-games num-defect-games + 1
  set defect-now? true
end

to defect-history-update
;;uses no history- this is just for similarity with the other strategies
end

to tit-for-tat
  set num-tit-for-tat-games num-tit-for-tat-games + 1
  set partner-defected? item ([who] of partner) partner-history
  ifelse (partner-defected?) [
    set defect-now? true
  ] [
    set defect-now? false
  ]
end

to tit-for-tat-history-update
  set partner-history
    (replace-item ([who] of partner) partner-history partner-defected?)
end

to unforgiving
  set num-unforgiving-games num-unforgiving-games + 1
  set partner-defected? item ([who] of partner) partner-history
  ifelse (partner-defected?)
    [set defect-now? true]
    [set defect-now? false]
end

to unforgiving-history-update
  if partner-defected? [
    set partner-history
      (replace-item ([who] of partner) partner-history partner-defected?)
  ]
end

;;defaults to tit-for-tat
;;can you do better?
to unknown
  set num-unknown-games num-unknown-games + 1
  set partner-defected? item ([who] of partner) partner-history
  ifelse (partner-defected?) [
    set defect-now? true
  ] [
    set defect-now? false
  ]
end

;;defaults to tit-for-tat-history-update
;;can you do better?
to unknown-history-update
  set partner-history
    (replace-item ([who] of partner) partner-history partner-defected?)
end


;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Plotting Procedures;;;
;;;;;;;;;;;;;;;;;;;;;;;;;

;;calculate the total scores of each strategy
to do-scoring
  set random-score  (calc-score "random" num-random)
  set cooperate-score  (calc-score "cooperate" num-cooperate)
  set defect-score  (calc-score "defect" num-defect)
  set tit-for-tat-score  (calc-score "tit-for-tat" num-tit-for-tat)
  set unforgiving-score  (calc-score "unforgiving" num-unforgiving)
  set unknown-score  (calc-score "unknown" num-unknown)
end

;; returns the total score for a strategy if any turtles exist that are playing it
to-report calc-score [strategy-type num-with-strategy]
  ifelse num-with-strategy > 0 [
    report (sum [ score ] of (turtles with [ strategy = strategy-type ]))
  ] [
    report 0
  ]
end


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

Завдання: додати інші стратегії поведінки у багатокроковій дилемі ув’язненого. Провести моделювання попарних популяцій та зробити висновок про “найкращу” стратегію.

  1. Soft Grudger - кооперація поки опонент не почав обманювати, потім (щодо цього опонента запускаємо послідовність d,d,d,d,c,c). Потім знову приймаємо рішення.

  2. Gradual - кооперація поки опонент не почав обманювати, потім обманюємо кількість раз, що дорівнює загальній кількості обманів опонента (проти даного агента). Потім два раза кооперуємось.

  3. Pavlov / Random (repeat last choice if good outcome and Random) - Якщо в останньому раунді набрано 5 або 3 то повторюємо останній вибір. Якщо ні - перемикаємось на протилежний. Іноді робимо випадковий вибір.

  4. True Peace Maker (hybrid of Tit For Tat and Tit For Two Tats with Random Co-operation) - кооперуватись поки опонент не обмане два раунди поспіль, потім обманути раз і повернутись до кооперації. Іноді робити випадковий вибір.