NetLogo测试共享海龟自己的变量

时间:2014-10-09 13:50:57

标签: 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 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  [

首先至少要识别具有相同变量的任何家庭,但这并不起作用。任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:1)

[target] of me返回单个值(您可以在这里使用target),而[target] of others返回值列表。以下是我认为可行的一些方法:

ask households [
  let target1 target
  ask other households [
    if target = target1 [
      ...
    ]
  ]
]

if中的比较将其他家庭的targettarget1进行比较 - 这是进行询问的家庭的目标。你也可以这样做:

ask households [
  ask other households [
    if target = [target] of myself [
      ...
    ]
  ]
]

同样,target之后的第一个if指的是被询问家庭的targetmyself指的是询问家庭,因此[target] of myself指的是target1在前一个示例中提到的相同内容。 (如果您将myself替换为self,则会引用被询问的家庭。)

另一种方法是让树存储任何针对它的家庭的身份。例如,如果树有一个targetted变量,它总是指向一个以树为目标的家庭,你可以这样做:

ask households [
  if target != nobody [
    if ([targetted] of target != self) [
      ...
    ]
  ]
]

(如果您在原始示例中添加了selfme也可以替换为let me self。)我不确定这是否符合您的要求,但如果不,你能够弄清楚如何修改它。

与问题中的原始表述相关的另一个提示。您还可以将上一个示例中的两个if替换为:

if target != nobody and [targetted] of target != self [
  ...
]

and之后的测试不会被评估,除非and之前的测试是。