Netlogo 双foreach循环

Netlogo 双foreach循环,netlogo,Netlogo,我有以下代码 turtles-own [age] set list1 (list 2 1 4 6) set list2 (list (turtle 1) (turtle 0) (turtle 0) (turtle 0)) foreach list2 [ x -> foreach list1 [ y -> if (position x list2 = position y list1) [ ask x [ set age (item(position y

我有以下代码

turtles-own [age]

set list1 (list 2 1 4 6)
set list2 (list (turtle 1) (turtle 0) (turtle 0) (turtle 0))

foreach list2 [ x ->
  foreach list1 [ y ->
     if (position x list2 = position y list1) [
       ask x [ set age (item(position y list1) list1 ]
    ]
   ]
  ]
我想做的是反复浏览海龟列表和年龄列表。如果海龟的指数与该值的指数匹配,则将海龟的年龄设置为该值。我在某种程度上可以工作,但列表1中的值似乎以某种方式影响了foreach循环。例如,我使用滑块确定列表1中的年龄值。列表1的格式为
List1(列表a1 a2 a3 a4)
,对于每个a1、a2 a3、a4,我都有一个滑块。根据我在滑块上设置的值,一些海龟获得这些值,而另一些海龟没有。有时所有海龟都获得年龄值,所有这些都取决于我使用幻灯片设置的值

如果有更好的方法,那也会很有帮助。我所需要的就是使用一个循环,将年龄值设置为相应的海龟。我有一个更大的海龟列表,这就是为什么我需要使用循环


非常感谢。

位置
仅报告列表中项目的第一个值。在本例中,对于
foreach
循环中的每个
0
,位置x列表2将报告1。要让它按原样工作,我认为您需要让每个列表中的每个项目都是唯一的

我不太清楚您在这里想要什么,但我认为您可以通过在每个循环中包含一个计数器来解决问题,并使用它来比较索引值,以及使用
项设置
年龄

turtles-own [age]
globals [ list1 list2 ]

to setup
  ca
  crt 2
  set list1 (list 2 1 4 6)
  set list2 (list (turtle 1) (turtle 0) (turtle 1) (turtle 0))

  let l2counter 0
  foreach list2 [ x ->
    let l1counter 0
    foreach list1 [ y ->
      if l2counter = l1counter [
        ask x [
          set age item l1counter list1
          show ( word "my age is now " age )
        ]
      ]
      set l1counter l1counter + 1
    ]
    set l2counter l2counter + 1
  ]
  reset-ticks
end
编辑:

如果不需要使用索引,这可能是更好的方法:

to setup-2
  ca
  crt 2
  set list1 (list 2 1 4 6)
  set list2 (list (turtle 1) (turtle 0) (turtle 1) (turtle 0))

  ( foreach list2 list1 [
    [ _turt _age ] ->
    ask _turt [
      set age _age
    ]
    ]
  )  
end

position
仅报告列表中项目的第一个值。在本例中,对于
foreach
循环中的每个
0
,位置x列表2
将报告1。要让它按原样工作,我认为您需要让每个列表中的每个项目都是唯一的

我不太清楚您在这里想要什么,但我认为您可以通过在每个循环中包含一个计数器来解决问题,并使用它来比较索引值,以及使用
项设置
年龄

turtles-own [age]
globals [ list1 list2 ]

to setup
  ca
  crt 2
  set list1 (list 2 1 4 6)
  set list2 (list (turtle 1) (turtle 0) (turtle 1) (turtle 0))

  let l2counter 0
  foreach list2 [ x ->
    let l1counter 0
    foreach list1 [ y ->
      if l2counter = l1counter [
        ask x [
          set age item l1counter list1
          show ( word "my age is now " age )
        ]
      ]
      set l1counter l1counter + 1
    ]
    set l2counter l2counter + 1
  ]
  reset-ticks
end
编辑:

如果不需要使用索引,这可能是更好的方法:

to setup-2
  ca
  crt 2
  set list1 (list 2 1 4 6)
  set list2 (list (turtle 1) (turtle 0) (turtle 1) (turtle 0))

  ( foreach list2 list1 [
    [ _turt _age ] ->
    ask _turt [
      set age _age
    ]
    ]
  )  
end

这正是我想要的。谢谢你。@OctavianBordeanu很高兴能帮上忙!只是一个提示,我在第二种方法中进行了编辑,您可能希望看到,我认为它实现了相同的功能,但不必使用计数器。它应该更有效,因为它不会对
list2
中的每个值循环执行
list1
。这更干净、更容易阅读。这对我来说是一件值得学习的事情。谢谢这正是我想要的。谢谢你。@OctavianBordeanu很高兴能帮上忙!只是一个提示,我在第二种方法中进行了编辑,您可能希望看到,我认为它实现了相同的功能,但不必使用计数器。它应该更有效,因为它不会对
list2
中的每个值循环执行
list1
。这更干净、更容易阅读。这对我来说是一件值得学习的事情。谢谢