NetLogo:foreach语法

时间:2019-07-09 12:02:15

标签: netlogo agent-based-modeling

一个非常基本的问题,我看不到为什么我的foreach代码什么都不做(没有错误消息但没有任何效果)。因此,我的海龟有一个3维变量(意图),其预设为[0 0 0]。我的最后一个问题要比这复杂得多,但是用简单的术语来说,我现在正试图使此向量的每个维度更改为一个维度,即[1 1 1]

我创建了一个名为change-intention的过程,该过程使用foreach来产生该过程,但无效:

to change-intention
ask turtles [
    (foreach intention [ x -> set x 1])
    ]
end

我已经在观察者和乌龟命令行以及单个乌龟上尝试了此操作,没有结果也没有错误。

谢谢!

1 个答案:

答案 0 :(得分:3)

几个问题。首先是列表是不可变的-如果要更改列表中的值,则必须使用该值创建一个新列表。第二个是您不能使用set来执行此操作,而必须使用replace-item

代码是独立的-打开一个新模型并尝试一下,将testme过程中的调用更改为不同的实现。过程change-intention1是您当前正在考虑的过程(无论如何,我的解释)。更改解释过程2是实现您的方法,替换每个项目并创建新列表(解决已发现的问题)的方法。

但是,执行此操作的更好方法是使用map过程而不是foreach,因为所有值都立即更改,而不是遍历列表并处理每个值。当然,在您的实际模型中实现起来可能并不容易。

turtles-own [intention]

to testme
  clear-all
  create-turtles 1
  [ set intention [0 0 0]
  ]
  ask turtles [ type "before call:" print intention ]
  change-intention2
  ask turtles [ type "after call:" print intention ]
  reset-ticks
end

to change-intention1
ask turtles
[ foreach intention
  [ x ->
      print "here"
      set intention 1
  ]
]
end

to change-intention2
ask turtles
[ foreach intention
  [ x ->
      let pp position x intention
      type "here:" print pp
      set intention replace-item pp intention 1
  ]
]
end

to change-intention3
ask turtles
[ set intention map [ x -> 1 ] intention
]
end