每当代理为他们正在执行的某些操作获取新值时,我希望他们将其添加到列表的末尾。如果列表上有十个或更多项,我希望他们删除列表中的第一项,以便该列表按顺序具有座席已查看的十个最新值。我该怎么办?(编辑:忘记提出实际问题。)
我希望能够对列表中的每个项目应用数学运算,因此,我不希望使用类似于cons单元格列表的列表,除非有一些简单的方法可以对列表中的每个项目应用数学运算,不知道。
让我们构建一个简单的示例,其中每只乌龟在每个刻度上以随机角度略微右转,并将这些角度的历史记录存储在列表中:
turtles-own [ history ]
to setup
clear-all
create-turtles 3 [
set history [] ; initialize history to an empty list
]
reset-ticks
end
to go
ask turtles [
let angle random 5
right angle
; add the angle of the most recent turn
; at the end of the list
set history lput angle history
if length history > 10 [
; remove the first item from the list
set history but-first history
]
forward 0.1
]
tick
end
Run Code Online (Sandbox Code Playgroud)
我不希望有一个像坏细胞一样的列表,除非有一些简单的方法可以将数学运算应用于我不知道的列表中的每个项目。
我不知道您的意思是“一系列类似于cons的单元格列表”,但是到目前为止,如果要进行数学运算,最好使用一个简单的列表,例如我们在此处构建的列表。
要将操作应用于每个项目,请使用map。然后,您可以使用sum或之类的功能mean对整个列表进行操作。例如:
to do-math
ask turtles [
let doubled-history map [ a -> a * 2 ] history
show history
show doubled-history
show mean doubled-history
]
end
Run Code Online (Sandbox Code Playgroud)
(请注意,这使用NetLogo 6.0.1语法。)
让我们看一个演示:
observer> setup repeat 5 [ go ] do-math
(turtle 2): [4 3 2 1 2]
(turtle 2): [8 6 4 2 4]
(turtle 2): 4.8
(turtle 1): [4 0 1 1 4]
(turtle 1): [8 0 2 2 8]
(turtle 1): 4
(turtle 0): [2 0 4 1 0]
(turtle 0): [4 0 8 2 0]
(turtle 0): 2.8
Run Code Online (Sandbox Code Playgroud)