如何在Netlogo

时间:2015-06-18 18:41:43

标签: list procedure netlogo

我是Netlogo的新手还在学习,我想要做的是在更新完成后调用一个列表并对其进行另一次更新,直到达到条件,如果有一个列表

let xy [[-2 6][-1 6][0 6][-1 6][-2 6][1 5][2 5][-3 9][-4 9][-5 9][-6 9][-3 9]] 
let same true

我试图从列表中删除两个相同元素之间的第一个子列表[-2 6] [ - 1 6] [0 6] [ - 1 6] [ - 2 6]然后我还想删除子列表在另外两个相同的元素[-3 9] [ - 4 9] [ - 5 9] [ - 6 9] [ - 3 9]之间,直到没有更多元素重复,在这种情况下结果应该是[[1 5] [2 5]]并在删除具有以下条件的子列表后控制此列表:

if length xy = length remove-duplicates xy [ set same false ]

我已经完成了下面的删除代码,它删除了第一个子列表但我可能有很多子列表,我想知道如何在一次删除后再次获得更新列表(在这种情况下我应该以某种方式采取代码中的最终列表)并使用这些条件再次控制它。 我正在考虑做一个to-report程序和一个while循环,例如(也许我错了)

 to-report update-list [list]

 while [same != false ] 

 [ ; do the removal stuff 
   set list-xy item POSITION (FIRST MODES xy) xy xy
   let first-pos POSITION (FIRST MODES xy)  xy 
   set list-temp remove-item first-pos xy 
   set sec-pos position list-xy list-temp + 1
   set sublist-1 sublist xy 0 first-pos 
   set sublist-2 sublist xy sec-pos length xy
   set final-list sentence sublist-1 sublist-2
   set xy final-list



; the condition if i don't have any duplicates the size of two lists should have the same size , no duplicates

if length xy = length remove-duplicates xy 

   [ set same false ]


  ] 


 report update-list xy 

我不确定在程序结束时报告什么以及如何再次回忆该列表,所以我可以删除所有这些子列表。

任何想法都表示赞赏,谢谢

2 个答案:

答案 0 :(得分:1)

使用递归最容易解决:

to-report remove-fenced-sublists [xs]
  if empty? xs
    [ report [] ]
  let pos position first xs butfirst xs
  if not is-number? pos
    [ report fput first xs remove-fenced-sublists butfirst xs ]
  report remove-fenced-sublists sublist xs (pos + 2) length xs
end

示例运行:

observer> show remove-fenced-sublists [[-2 6][-1 6][0 6][-1 6][-2 6][1 5][2 5][-3 9][-4 9][-5 9][-6 9][-3 9]]
observer: [[1 5] [2 5]]

答案 1 :(得分:1)

如果我了解您的目标,则可以通过逐项构建新列表来捕获您的核心需求,但只要出现重复项就会对其进行修剪。对于单个新项目,这是:

to-report trim-or-grow [#list #item]
  let _i position #item #list
  report ifelse-value (_i != false) [sublist #list 0 _i] [lput #item #list]
end

然后您可以通过此记者减少:

to test
  let xy [[-2 6][-1 6][0 6][-1 6][-2 6][1 5][2 5][-3 9][-4 9][-5 9][-6 9][-3 9]]
  print reduce trim-or-grow fput [] xy
end