NetLogo:在不调用链接超过1次的情况下,存储链接值和扣除死链接值的好方法是什么?

时间:2013-11-27 11:37:18

标签: netlogo

我很遗憾不断询问链接,但我要添加到我的模型中的一个功能是考虑村庄未来关系中不同村庄的人们的集体相互关系,

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

代理商拥有的belongs_to是一个"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 MS来计算所有相互关系值

 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 MS,

  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  

1 个答案:

答案 0 :(得分:2)

另一种思考方式。

为村庄创建一个品种。

breed [ villages village ]

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

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

给村庄链接一个可变的互为价值义务 给村庄一个可变的自我价值责任 - 这是为了处理两个人来自同一个村庄的情况 - 遗憾的是,netlogo不允许自我链接。

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

将所有村庄彼此连接起来。

一个人所属的包含一只村龟。

e.g。随机分配一个村庄:

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”东西了。 / p>