Netlogo:使用foreach迭代两个填充变量的列表

时间:2018-03-08 16:13:48

标签: foreach netlogo

这可能是一个初学者的问题,但在使用NetLogo Progamming指南后,我无法找到解决方案...

我正在尝试迭代一对列表,并根据测试条件有条件地更新这些值。

Netlogo论坛中的

This thread给了我一个使用LIST原语记者的提示,但我仍然无法获得预期的输出。

这是一个描述我的问题的简化示例。 请注意,listA和listB都填充了变量。

to test  
 let a1 1
 let a2 5
 let listA (list a1 a2)  
 let b1 6
 let b2 3 
 let listB (list b1 b2)

 (foreach (list listA) (list listb) [ 
  [a b] -> ifelse a < b [set a "a"][set b "b"]])

 show lista
 show listb

end

;expected Output
;observer: [a 5] 
;observer: [6 b]  

有人能给我一个暗示吗?我究竟做错了什么?

1 个答案:

答案 0 :(得分:2)

NetLogo中的列表是不可变的 - 您不能像这种方法那样更改值。 map可能更适合这个:

to test2
  let a1 1
  let a2 5
  let listA (list a1 a2)  
  let b1 6
  let b2 3 
  let listB (list b1 b2)

  show ( map [ [ a b ] -> 
    ifelse-value ( a < b ) [ "a" ] [ a ] ] 
    listA listB ;; pass the lists [ 1 5 ] and [ 6 3 ]
  )
  show ( map [ [ a b ] -> 
    ifelse-value ( a > b ) [ "b" ] [ b ] ] 
    listA listB ;; pass the lists [ 1 5 ] and [ 6 3 ]
  )
end

请注意,我认为lista的预期输出应为["a" 5]而不是["a" 0] - 这是正确的吗?

如果您想使用foreach来修改原始列表,我会创建一个索引(列表长度为0)以传递给replace-item

to test3
  let a1 1
  let a2 5
  let listA (list a1 a2)  
  let b1 6
  let b2 3 
  let listB (list b1 b2)

  let indexer ( range 0 length listA )

  foreach indexer [ ind ->
    let current_a item ind listA
    let current_b item ind listB
    ifelse current_a < current_b [
      set listA replace-item ind listA "a"
    ] [
      set listB replace-item ind listB "b"
    ]
  ]
  print listA
  print listB

end