Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NetLogo:在不调用链接超过1次的情况下,存储链接值和扣除死链接值的好方法是什么?_Netlogo - Fatal编程技术网

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

NetLogo:在不调用链接超过1次的情况下,存储链接值和扣除死链接值的好方法是什么?,netlogo,Netlogo,很抱歉,我一直在问链接,但我要添加到我的模型中的一个特性是,在村庄未来的关系中考虑不同村庄的人的集体相互关系 我有几千个链接,当村庄想要做出决定时,调用链接并获取它们的价值是没有效率的(每48次在0点钟做出一次决定) 代理商自己所属的是一个“Village1”Village2“Village3”或“Village4” 链接具有关系的价值 这是我用来更新链接值的函数: to Update_link_Values [Other_Agent Value] if self != Other_Age

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

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

代理商自己所属的是一个
“Village1”Village2“Village3”或“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毫秒才能执行

  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"]
        ]

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

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

我认为每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  

另一种思考方式

为村庄创造一个品种

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

赋予村庄联系可变的相互义务价值 给村庄一个可变的自我义务值——这是为了处理两个人来自同一个村庄的情况——遗憾的是,netlogo不允许自我链接

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

从两个方向将所有村庄相互连接起来

一个人所属的村庄里有一只海龟

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

set belongs-to one-of villages
因此,现在,不必大量计算共同义务的价值,你可以直接改变它,因为它会改变

无论何时更改链接的值,都可以更改村庄链接的VOMO变量。您可以使用村庄的who编号来计算链接ID,或者在特殊情况下使用自我义务版本

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”内容。是的,谢谢您的回答,我也在考虑同样的问题,但我不确定新品种是否会增加复杂性。但是你的答案真的很有帮助是的,这取决于,有时增加一点结构复杂性(比如使用额外的品种作为数据结构)可以降低代码复杂性(比如现在不需要使用复杂的基于列表的代码来存储和操作值)。
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