共享turtles自身变量的NetLogo测试
我试图制作一个NetLogo模型来模拟木材燃料的竞争。该模型由两个海龟品种组成:“家庭”和“树”随机分布在世界各地。家庭拥有[燃料库目标半径]。当燃料存储=0时,住户使用以下程序在最小半径1内“找到”一棵新树,如果没有树,则将半径增加1,直到达到最大半径:共享turtles自身变量的NetLogo测试,netlogo,unique-values,Netlogo,Unique Values,我试图制作一个NetLogo模型来模拟木材燃料的竞争。该模型由两个海龟品种组成:“家庭”和“树”随机分布在世界各地。家庭拥有[燃料库目标半径]。当燃料存储=0时,住户使用以下程序在最小半径1内“找到”一棵新树,如果没有树,则将半径增加1,直到达到最大半径: to FindFuelGo ask households [ if fuel-store = 0 [ set target min-one-of trees in-radius radius [ distance my
to FindFuelGo
ask households [
if fuel-store = 0 [
set target min-one-of trees in-radius radius [ distance myself ]
if not any? trees in-radius radius [
if radius != max-radius [
set radius radius + 1
]
]
然而,由于该模型模拟竞争,我如何测试一个家庭是否与另一个家庭共享相同的目标(在模型运行时不可避免地会共享),以及是否将目标分配给距离目标最短的家庭?我试过:
ask households [
let me self
let others other households
if target != nobody [
if [ target ] of me = [ target ] of others [
首先,至少要确定任何具有相同变量的家庭,但这不起作用。任何想法都将不胜感激。
[target]我的
只返回一个值(您可以在这里使用target
),而其他人的则返回一个值列表。以下是一些我认为有效的方法:
ask households [
let target1 target
ask other households [
if target = target1 [
...
]
]
]
if
中的比较将另一个家庭的target
与target1
进行比较,后者是提出请求的家庭的目标。您也可以这样做:
ask households [
ask other households [
if target = [target] of myself [
...
]
]
]
同样,在if
之后的第一个target
指被询问家庭的target
我自己
指的是询问的家庭,因此我自己的[target]与前面示例中提到的target1
指的是相同的事情。(如果您将本人
替换为本人
,则它将指向被询问的家庭。)
另一种方法是让树木存储目标家庭的身份。例如,如果树有一个targeted
变量,该变量始终指向以树为目标的家庭,则可以执行以下操作:
ask households [
if target != nobody [
if ([targetted] of target != self) [
...
]
]
]
(self
也可以被me
替换,如果您添加了let me self
,就像您原来的示例一样。)我不确定这是否符合您的要求,但如果不是,您将能够找到如何修改它的方法
还有一个提示与问题中的原始公式有关。您还可以将上一个示例中的两个if
s替换为:
if target != nobody and [targetted] of target != self [
...
]
除非和前面的测试正确,否则和后面的测试不会被评估。回答得很好谢谢!我使用了你的第二个建议,即创建一个目标变量,该变量应允许我比较家庭和目标之间的距离,以及树和目标对象之间的距离。