更新 Netlogo 中的列表
Updating a list in Netlogo
我正在尝试更新 netlogo 上列表中的值。
这里的代码是我的碰撞函数:一个品种与另一个品种发生碰撞,将圆圈变成黑色,然后我希望它在列表中存储 'found' 圆圈的 'who' 编号。
它目前只输出每个找到的人的编号,并且每次打印一个 'list' 的编号。
这是代码。
to collide2
if any? circles2-on neighbors [
set mylist [] ; not sure why I need this but
;doesn't work otherwise
set whovalue [who] of circles2-on neighbors
set mylist lput whovalue mylist
ask circles2-on neighbors [set color black]
output-print mylist
]
end
如果有多个circles-on neighbors
,那么代码[who] of circles-2 on neighbors
将return列出它们的值的who
ID。您需要 sentence
命令来连接两个列表,使用 lput
会将列表添加为列表中的一个项目。例如:print lput [1 2] [3 4]
将打印出列表 [3 4 [1 2]]。在您的情况下,您将其添加到一个空列表中,因此创建的列表只有一个元素,而该元素本身就是一个列表。
但如果您的目标是获取 who
值的列表,则无需执行任何复杂的操作。代码 let whovalues [who] of circles2-on neighbors
将自动创建一个列表,因为 of
创建一个列表。
因此您的代码可以替换为:
to collide2
if any? circles2-on neighbors
[ set whovalues [who] of circles2-on neighbors
ask circles2-on neighbors [set color black]
output-print whovalues
]
end
但是,看看您如何必须跟踪 who
值,然后单独 re-find 所有相邻的海龟?这是因为您正在存储 who
值而不是存储代理本身。直接引用代理而不是通过它们的 who
值来识别它们几乎总是更好,这样您就可以避免笨拙的代码,例如:ask turtle with [who = <some value>] [do-something]
.
因此,切换到海龟而不是 who
,并且切换到代理集而不是列表(不是必需的,但列表仅在您需要跟踪订单或有多个实例等时才相关):
to collide2
if any? circles2-on neighbors
[ set colliders circles2-on neighbors
ask colliders [set color black]
output-print colliders
]
end
所以现在很明显,同样的海龟被发现并变黑了。更好的是,您可以这样做,以便仅创建一次代理集(效率更高且更易于阅读):
to collide2
let colliders circles2-on neighbors
if any? colliders
[ ask colliders [set color black]
output-print colliders
]
end
我正在尝试更新 netlogo 上列表中的值。 这里的代码是我的碰撞函数:一个品种与另一个品种发生碰撞,将圆圈变成黑色,然后我希望它在列表中存储 'found' 圆圈的 'who' 编号。
它目前只输出每个找到的人的编号,并且每次打印一个 'list' 的编号。
这是代码。
to collide2
if any? circles2-on neighbors [
set mylist [] ; not sure why I need this but
;doesn't work otherwise
set whovalue [who] of circles2-on neighbors
set mylist lput whovalue mylist
ask circles2-on neighbors [set color black]
output-print mylist
]
end
如果有多个circles-on neighbors
,那么代码[who] of circles-2 on neighbors
将return列出它们的值的who
ID。您需要 sentence
命令来连接两个列表,使用 lput
会将列表添加为列表中的一个项目。例如:print lput [1 2] [3 4]
将打印出列表 [3 4 [1 2]]。在您的情况下,您将其添加到一个空列表中,因此创建的列表只有一个元素,而该元素本身就是一个列表。
但如果您的目标是获取 who
值的列表,则无需执行任何复杂的操作。代码 let whovalues [who] of circles2-on neighbors
将自动创建一个列表,因为 of
创建一个列表。
因此您的代码可以替换为:
to collide2
if any? circles2-on neighbors
[ set whovalues [who] of circles2-on neighbors
ask circles2-on neighbors [set color black]
output-print whovalues
]
end
但是,看看您如何必须跟踪 who
值,然后单独 re-find 所有相邻的海龟?这是因为您正在存储 who
值而不是存储代理本身。直接引用代理而不是通过它们的 who
值来识别它们几乎总是更好,这样您就可以避免笨拙的代码,例如:ask turtle with [who = <some value>] [do-something]
.
因此,切换到海龟而不是 who
,并且切换到代理集而不是列表(不是必需的,但列表仅在您需要跟踪订单或有多个实例等时才相关):
to collide2
if any? circles2-on neighbors
[ set colliders circles2-on neighbors
ask colliders [set color black]
output-print colliders
]
end
所以现在很明显,同样的海龟被发现并变黑了。更好的是,您可以这样做,以便仅创建一次代理集(效率更高且更易于阅读):
to collide2
let colliders circles2-on neighbors
if any? colliders
[ ask colliders [set color black]
output-print colliders
]
end