【问题标题】:NetLogo : what is a good way for Storing link values and deducting the dead link values without calling links more than 1 time?NetLogo:存储链接值并扣除死链接值而不调用链接超过1次的好方法是什么?
【发布时间】:2013-11-27 11:37:18
【问题描述】:

我很抱歉一直询问链接,但我要添加到我的模型中的功能之一是在村庄的未来关系中考虑不同村庄的人的集体相互关系,

我有几千个链接,当村庄想要做出决定时调用链接并获得它们的价值效率不高(在时钟 0 时每 48 个滴答做出决定)

代理拥有属于一对一的"Village1" Village2" Village3" or "Village4" 链接具有关系的价值。

这是我用来更新链接值的函数:

to Update_link_Values  [Other_Agent Value]
  if self != Other_Agent
  [  
    ifelse  out-link-neighbor? Other_Agent
      [
        ask out-link-to Other_Agent  
        [ 
          set Value-Of-The-Relationship Value-Of-The-Relationship + Value  
          set-List-of-Mutual-Obligations 
        ]   
      ] 
      [
        create-link-to Other_Agent 
        [
          set Value-Of-The-Relationship Value-Of-The-Relationship + Value 
          set-List-of-Mutual-Obligations 
        ]   
      ]  
  ]
end

如果我使用以下公式来存储不同村庄的关系值之和,则计算所有相互关系值需要 0.003 毫秒

 if [belongs_to] of end1 = "Village1" and [belongs_to] of end2 = "Village2" 
     [
       set List-of-Mutual-Obligations replace-item 0 List-of-Mutual-Obligations (item 0 List-of-Mutual-Obligations  +  Value-Of-The-Relationship)   
       ]

虽然这需要 1.002 毫秒来执行,

  if [belongs_to] of end1 = "Village1" and [belongs_to] of end2 = "Village2" 
      [  
        set List-of-Mutual-Obligations replace-item 0 List-of-Mutual-Obligations sum [Value-Of-The-Relationship] of links with [[Belongs_to] of end1 = "Village1" and  [Belongs_to] of end2 = "Village2"]
        ]

我对第一个版本的问题是,它将每个链接的值添加到该组中先前链接的所有值的总和,并且不考虑链接是否已失效,但第二个更准确。

由于关系值是链接属性,因此我不想在代码中多次询问链接,并且每当更改或创建链接时,我都会更新总和值。

我认为每 48 个滴答声更新一次值可能会更好,因为许多代理可能会在每个滴答声中调用此函数,但为此我必须调用链接,但我不确定哪种方式更好?

更新:

我已经更改了我的代码,所以每当做出决定时我都会计算我需要的链接:

to-report Value-of-Mutual-Obligations [Village1 Village2]
  report sum [Value-Of-The-Relationship] of links with [[Belongs_to] of end1 = Village1 and  [Belongs_to] of end2 = Village2]       
end  

【问题讨论】:

    标签: netlogo


    【解决方案1】:

    另一种思考方式。

    为村庄创建一个品种。

    breed [ villages village ]
    

    创建新的链接品种,一种用于村庄,一种用于人。 (当您有任何自定义链接品种时,您不能使用内置链接品种):

    directed-link-breed [ village-links village-link ]
    directed-link-breed [ person-links person-link ]
    

    给村庄链接一个变量VALUE-OF-MUTUAL-OBLIGATIONS 给村庄一个可变的 VALUE-OF-SELF-OBLIGATIONS - 这是为了处理两个人来自同一个村庄的情况 - 遗憾的是,netlogo 不允许自我链接。

    为每个村庄创建一只村庄乌龟。它们可以被隐藏。您可以将村庄的名称(“村庄 1”)应用到村庄的标签上。

    在两个方向上将所有村庄相互连接起来。

    一个人的归属地包含一只村龟。

    例如随机分配一个村庄:

    set belongs-to one-of villages
    

    因此,现在,您不必计算相互义务的价值,而是可以直接改变它,因为它会发生变化。

    每当您更改链接的值时,您还可以更改村庄链接的 VOMO 变量。您可以使用村庄的编号来确定链接 ID,或者在这种特殊情况下使用 SELF-OBLIGATIONS 版本。

    to update-relationship-value [ #value ] ;; run by the person's LINK
       set value-of-the-relationship value-of-the-relationship + #value
       let from-village [ belongs-to ] of end1
       let to-village   [ belongs-to ] of end2
    
       ifelse from-village != to-village 
       [ ask village-link ([who] of from-village ) ([who] of to-village)
         [ set value-of-mutual-obligations value-of-mutual-obligations + #value
         ]
       ]
       [ ask from-village ;; update self-obligation value
         [ set value-of-self-obligations value-of-self-obligations + #value
         ]
       ]
    end
    

    因此,当您更新关系值时,您只触及共同义务的值一次。

    您可以通过提取村庄链接更新代码使其由海龟而不是链接运行,这样您就没有多余的“[stuff] of end1”内容,可能会稍微提高效率。

    【讨论】:

    • 是的,谢谢你的回答,我也是这么想的,但我不确定新品种是否会增加复杂性。但是你的回答真的很有帮助
    • 是的,这取决于,有时增加一点结构复杂性(比如使用额外的品种作为数据结构)会降低代码复杂性(比如现在不需要使用复杂的基于列表的代码来存储并操纵值)。
    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 2011-02-20
    • 2012-11-20
    • 2012-02-11
    • 2019-06-20
    • 2012-07-20
    • 2011-11-02
    • 2016-09-21
    相关资源
    最近更新 更多