2

我正在尝试制作一个 NetLogo 模型来模拟木材燃料的竞争。该模型由两个海龟品种组成:“家庭”和“树木”,随机分布在世界各地。家庭拥有的[燃料储存目标半径]。当fuel-store = 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  [

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

4

1 回答 1

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 [
      ...
    ]
  ]
]

再次,第一个targetiftarget被问户的。 myself指问户,所以[target] of myself指与上例中所指相同的事物target1。(如果您替换myselfself,则表示被询问的家庭。)

另一种方法是让树木存储针对它的任何家庭的标识。例如,如果树有一个targetted变量总是指向一个以树为目标的家庭,您可以执行以下操作:

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

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

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

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

and除非之前的测试是,否则不会评估之后的测试and

于 2014-10-09T15:19:34.077 回答