我正在尝试制作一个NetLogo模型来模拟木材燃料的竞争。该模型由两个海龟品种组成:"家庭"和"树"随机分布在世界各地。家庭拥有的[燃料储存目标半径]。当燃料储存= 0时,家庭"找到"最小半径为1的新树,如果在达到最大半径之前没有树,则将半径增加1,使用以下步骤:
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 [
首先至少要识别具有相同变量的任何家庭,但这并不起作用。任何想法都将不胜感激。
答案 0 :(得分:1)
[target] of me
返回单个值(您可以在这里使用target
),而[target] of others
返回值列表。以下是我认为可行的一些方法:
ask households [
let target1 target
ask other households [
if target = target1 [
...
]
]
]
if
中的比较将其他家庭的target
与target1
进行比较 - 这是进行询问的家庭的目标。你也可以这样做:
ask households [
ask other households [
if target = [target] of myself [
...
]
]
]
同样,target
之后的第一个if
指的是被询问家庭的target
。 myself
指的是询问家庭,因此[target] of myself
指的是target1
在前一个示例中提到的相同内容。 (如果您将myself
替换为self
,则会引用被询问的家庭。)
另一种方法是让树存储任何针对它的家庭的身份。例如,如果树有一个targetted
变量,它总是指向一个以树为目标的家庭,你可以这样做:
ask households [
if target != nobody [
if ([targetted] of target != self) [
...
]
]
]
(如果您在原始示例中添加了self
,me
也可以替换为let me self
。)我不确定这是否符合您的要求,但如果不,你能够弄清楚如何修改它。
与问题中的原始表述相关的另一个提示。您还可以将上一个示例中的两个if
替换为:
if target != nobody and [targetted] of target != self [
...
]
and
之后的测试不会被评估,除非and
之前的测试是。