如何在 Netlogo 中满足条件之前多次调用列表进行更新
How to call a list for update multiple times until a condition is fulfilled in 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 ]
我已经完成了下面的删除代码,它删除了第一个子列表,但我可能有很多子列表,我想知道一次删除后如何才能再次获得更新的列表(在这种情况下我应该以某种方式获取代码中的最终列表)并使用这些条件再次控制它。
例如,我想做一个报告程序和一个 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
我不确定程序结束时要报告什么以及如何再次调用列表,所以我可以删除所有这些子列表。
感谢任何想法,谢谢
这是使用递归最容易解决的问题:
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]]
如果我了解您的目标,则可以通过逐项构建新列表但在出现重复项时对其进行修剪来捕获您的核心需求。对于单个新项目,这是:
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
我是 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 ]
我已经完成了下面的删除代码,它删除了第一个子列表,但我可能有很多子列表,我想知道一次删除后如何才能再次获得更新的列表(在这种情况下我应该以某种方式获取代码中的最终列表)并使用这些条件再次控制它。 例如,我想做一个报告程序和一个 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
我不确定程序结束时要报告什么以及如何再次调用列表,所以我可以删除所有这些子列表。
感谢任何想法,谢谢
这是使用递归最容易解决的问题:
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]]
如果我了解您的目标,则可以通过逐项构建新列表但在出现重复项时对其进行修剪来捕获您的核心需求。对于单个新项目,这是:
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