эффект памяти в PDG - PullRequest
       10

эффект памяти в PDG

0 голосов
/ 01 марта 2019

Я пытаюсь смоделировать с Netlogo PDG и изучить эффект памяти в сотрудничестве.Я хочу, чтобы память была коэффициентом m <1, который умножил бы сумму выплат в то время плюс совокупную историческую выплату.Я хочу изучить влияние памяти в модели кооперации и увидеть частоту кооператоров в мире с памятью и без нее, заранее спасибо </p>

globals [payoffs]
patches-own [payments]
to setup
clear-all
; green: cooperate, red: defect
ask patches [
set payments []
set pcolor green
ifelse ( random-float 1.0 < cooperative-probability) [
  set pcolor green
] [
   set pcolor red
  ]
;; cooperate: 0, defect 1
set payoffs [[3 0] [4 1]]
]
 reset-ticks
end

to-report get-payment [my-color her-color]
  let my-action ifelse-value (my-color = green) [0] [1]
  let her-action ifelse-value (her-color = green) [0] [1]
  report item her-action (item my-action payoffs)
end

to go
  ask patches [
    play
  ]
  ask patches [
    update
 ]
  tick
end

; returns the first x elements in l, or fewer.
to-report first-x [x l]
  let result []
  if (length l = 0) [report []]
  repeat x [
    set result lput (first l) result
    set l butfirst l
    if (length l = 0) [
      report result
    ]
  ]
 report result
 end

; patches methods
to play
  let chosen-one one-of neighbors
  set payments fput (get-payment pcolor [pcolor] of chosen-one) payments
end

to-report gain
  report sum first-x history-length payments
end

to update
  let chosen-one one-of neighbors
  if ([gain] of chosen-one > gain) [
    set pcolor [pcolor] of chosen-one
  ]
end

1 Ответ

0 голосов
/ 01 марта 2019

Моя интерпретация вашего вопроса заключается в том, что вы хотите иметь способ расчета убывающей совокупной величины переменной (выплаты).Способ сделать это состоит в том, чтобы сохранить текущее значение переменной и каждый тик обновлять это значение с суммой новой выплаты и дисконтированной стоимости старой совокупной выплаты.Это означает, что, например, выплата, равная двум тикам в прошлом, была дважды дисконтирована в накоплении.

Вот полная модель в качестве примера.Я установил выплату до 5 за каждый тик, чтобы вы могли видеть эффект памяти.

globals [ memory ] ; how much to retain each tick
turtles-own [ payoff ]

to setup
  clear-all
  set memory 0.9
  create-turtles 1
  inspect one-of turtles
  reset-ticks
end

to go
  ask turtles
  [ let new-payoff 5
    set payoff new-payoff + memory * payoff
  ]
end

После первого тика выплата составляет 5. После второго тика выплата составляет 9,5 (= 5 + 0,9* 5).После третьего тика выплата составляет 13,55 (= 5 + 0,9 * 9,5, что также составляет 5 + 0,9 * 5 + 0,9 * 0,9 * 5)

...