Time 如何在Netlogo中访问以前的turtles交互?

Time 如何在Netlogo中访问以前的turtles交互?,time,netlogo,history,interaction,Time,Netlogo,History,Interaction,我正在写一个模型,在这个模型中,代理相互作用,他们要么合作,要么背叛。然后,他们根据与合作伙伴的互动情况,更新与合作伙伴的合作水平,我成功地实现了以下目标: to random-matching ; randomly match agents while [not matched?] [ ; check that I have not been matched yet set partner one-of agents with [not matched?] ; select one

我正在写一个模型,在这个模型中,代理相互作用,他们要么合作,要么背叛。然后,他们根据与合作伙伴的互动情况,更新与合作伙伴的合作水平,我成功地实现了以下目标:

to random-matching ; randomly match agents
  while [not matched?] [ ; check that I have not been matched yet
    set partner one-of agents with [not matched?] ; select one agent from those who have not been matched yet
    if (partner != nobody and [myID] of partner != myID) [ ; if there is still someone who has been matched and who is not myself
      set matched? true ; then record that I have been matched
      set color white
      set partner-ID [myID] of partner ; save the ID of my partner for the future
      ask partner [ ; and do the same for my partner
        set matched? true
        set color white
        set partner-ID [myID] of myself
        set partner myself
      ]
    ]
  ]
  
  
end

; access the cooperation level of the agent toward the partner
to-report coop-agent-partner
  let coop-agent table:get cooperation-matrix myID  
  let coop table:get coop-agent partner-ID
  report coop
end

; access the cooperation level of the partner toward the agent
to-report coop-partner-agent
  let coop-partner table:get cooperation-matrix partner-ID
  let coop table:get coop-partner myID
  report coop
end
  


to interact ; define whether the interaction is a cooperation or not
  ; check that I did not interact already with my partner
  if not interacted? [
    
  ; let's check what I do
    let j random-float 1 * 100
    let coop-% cooperation-level + coop-agent-partner
    ifelse (j <= coop-%) [
      set action-self "C"
      ask partner [set action-partner "C" ]
    ][
      set action-self "D"
      ask partner [set action-partner "D" ]
    ]
    
  ; and what my partner does
    let k random-float 1 * 100
    let coop-partner-% [cooperation-level] of partner + coop-partner-agent
    
    ifelse (j <= coop-partner-%) [
      ask partner [set action-self "C" ]
      set action-partner "C"
    ][
      ask partner [set action-self "D" ]
      set action-partner "D"
    ]
    
  ;save the outcome of the interaction
    ifelse (action-self = "C" and action-partner = "C")[
      set interaction-outcome "C"
      set current-goal (current-goal + 1)
    ]
    [
      set interaction-outcome "D"
    ]  
  ]
end

; update the agents cooperation according to the current interaction

to update-cooperation
  
  if not updated-coop? [
    ifelse (action-partner = "C")[ ; if the partner cooperated
      let coop-agent table:get cooperation-matrix myID  
      let coop-a-p table:get coop-agent partner-ID
      set coop-a-p (coop-a-p / 2) + update_cooperation_direct
      
      if debug-int? [print coop-a-p]
    ][
      let coop-agent table:get cooperation-matrix myID  
      let coop-a-p table:get coop-agent partner-ID
      set coop-a-p (coop-a-p / 2) - update_cooperation_direct
      
    ]
    ifelse (action-self = "C")[
      ask partner[ ; if the interaction was a cooperation
        let coop-agent table:get cooperation-matrix myID  
        let coop-a-p table:get coop-agent partner-ID
        set coop-a-p (coop-a-p / 2) + update_cooperation_direct
      
      ]
    ][
      ask partner [
        let coop-agent table:get cooperation-matrix myID  
        let coop-a-p table:get coop-agent partner-ID
        set coop-a-p (coop-a-p / 2) - update_cooperation_direct
        
      ]
    ]
    
    ; record that both the agent and the partner have updated their cooperation score
    
    set updated-coop? true
    ask partner [set updated-coop? true]
  
  ]

end
随机匹配;随机匹配代理
而[未匹配?][;检查我是否尚未匹配
使用[未匹配?]设置一个代理的合作伙伴;从尚未匹配的代理中选择一个代理
如果(partner!=nobody和partner的[myID]=myID)[;如果仍然有匹配的人,而不是我自己
设置匹配?为真;然后记录我已匹配
将颜色设置为白色
设置合作伙伴的合作伙伴ID[myID];保存我的合作伙伴ID以备将来使用
问我的搭档,对我的搭档也这样做
是否匹配?是吗
将颜色设置为白色
设置我自己的合作伙伴ID[myID]
我自己找搭档
]
]
]
结束
; 访问代理对合作伙伴的合作级别
向合作社代理合伙人报告
let coop agent表:获取合作矩阵myID
让合作社表:获取合作社代理合作伙伴ID
报告合作社
结束
; 向代理访问合作伙伴的合作级别
向合作伙伴代理人报告
let coop partner表:获取合作矩阵合作伙伴ID
let coop table:获取合作伙伴myID
报告合作社
结束
互动;定义交互是否为合作
; 检查我是否已经与我的搭档互动
如果没有互动?[
;让我们看看我在做什么
让j随机浮动1*100
让合作社-%合作级别+合作社代理合作伙伴

如果有(j)您可以继续使用由合作伙伴索引的表,存储的值是一个包含您想要的所有详细信息的列表。但是,转移到其他语言的通常目的是因为新语言更好地将问题概念化。在这种情况下,您尝试复制Matlab结构,该结构使用矩阵,因为它不包含有代理的概念。如果你把所有东西都表示为代理,那么你可以使用链接进行交互,链接可以存储时间和动作信息。谢谢Jen的建议。你能提供一个例子吗?我对Netlogo非常陌生,我很难理解如何使用代理专业版perly(本例中还有链接)模型库中有一个n-player迭代囚徒困境的例子,这可能是最好的起点。然后你可以看看OpenABM——搜索词“囚徒”得到14个结果(参见)