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