如何以相同(非随机)顺序从 NetLogo 代理集中检索多个变量?
How to retrieve multiple variables from NetLogo agentsets in the same (not random) order?
我有一个 NetLogo 模型,其中代理从其他代理检索多个变量列表。这些列表的 returned 顺序很重要,因为每个列表中的变量都是相互关联的。但是,我相信列表每次都是 return 从其他代理以随机顺序编辑的。例如,采用以下简化的测试用例:
turtles-own [testlist1 testlist2 testlist3 testlist4]
to setup
random-seed 1
clear-all
create-turtles 5
ask turtles [
create-links-with other turtles
set testlist1 []
set testlist2 []
set testlist3 []
set testlist4 []
set testlist1 lput [who] of self testlist1
set testlist2 lput [who] of self testlist2] ;identical to testlist1
end
to go
ask turtles[
set testlist3 reduce sentence [testlist1] of link-neighbors
show testlist3
set testlist4 reduce sentence [testlist2] of link-neighbors
show testlist4]
end
对于我的用例,testlist3 和 testlist4 中的值应该以相同的顺序排列,但它们的顺序随机不同。输出:
(turtle 2): [0 3 1 4]
(turtle 2): [3 4 1 0]
(turtle 3): [4 1 0 2]
(turtle 3): [1 0 2 4]
(turtle 0): [4 2 3 1]
(turtle 0): [3 4 2 1]
(turtle 1): [0 4 2 3]
(turtle 1): [4 2 3 0]
(turtle 4): [0 2 1 3]
(turtle 4): [0 3 2 1]
我的问题:在给定过程中以相同顺序从代理集中 return 多个列表(例如上面的 testlist
和 testlist2
)的最佳方法是什么?
将link-neighbors
替换为turtle-set sort link-neighbors
不起作用,因为在将排序列表转换回代理集后,代理集中的代理将以随机顺序调用。如果可能的话,我宁愿不必使用 matrix
扩展将整个模型从列表重构为矩阵。
将代理集转变为列表的想法是正确的。唯一缺少的部分是使用 map
而不是将其变回乌龟集,然后再次使用 of
:
to go
ask turtles[
set testlist3 reduce sentence map [ t -> [ testlist1 ] of t ] sort link-neighbors
show testlist3
set testlist4 reduce sentence map [ t -> [ testlist2 ] of t ] sort link-neighbors
show testlist4
]
end
有关列表操作和代理集操作之间的并行性的更多详细信息,请参见。
我有一个 NetLogo 模型,其中代理从其他代理检索多个变量列表。这些列表的 returned 顺序很重要,因为每个列表中的变量都是相互关联的。但是,我相信列表每次都是 return 从其他代理以随机顺序编辑的。例如,采用以下简化的测试用例:
turtles-own [testlist1 testlist2 testlist3 testlist4]
to setup
random-seed 1
clear-all
create-turtles 5
ask turtles [
create-links-with other turtles
set testlist1 []
set testlist2 []
set testlist3 []
set testlist4 []
set testlist1 lput [who] of self testlist1
set testlist2 lput [who] of self testlist2] ;identical to testlist1
end
to go
ask turtles[
set testlist3 reduce sentence [testlist1] of link-neighbors
show testlist3
set testlist4 reduce sentence [testlist2] of link-neighbors
show testlist4]
end
对于我的用例,testlist3 和 testlist4 中的值应该以相同的顺序排列,但它们的顺序随机不同。输出:
(turtle 2): [0 3 1 4]
(turtle 2): [3 4 1 0]
(turtle 3): [4 1 0 2]
(turtle 3): [1 0 2 4]
(turtle 0): [4 2 3 1]
(turtle 0): [3 4 2 1]
(turtle 1): [0 4 2 3]
(turtle 1): [4 2 3 0]
(turtle 4): [0 2 1 3]
(turtle 4): [0 3 2 1]
我的问题:在给定过程中以相同顺序从代理集中 return 多个列表(例如上面的 testlist
和 testlist2
)的最佳方法是什么?
将link-neighbors
替换为turtle-set sort link-neighbors
不起作用,因为在将排序列表转换回代理集后,代理集中的代理将以随机顺序调用。如果可能的话,我宁愿不必使用 matrix
扩展将整个模型从列表重构为矩阵。
将代理集转变为列表的想法是正确的。唯一缺少的部分是使用 map
而不是将其变回乌龟集,然后再次使用 of
:
to go
ask turtles[
set testlist3 reduce sentence map [ t -> [ testlist1 ] of t ] sort link-neighbors
show testlist3
set testlist4 reduce sentence map [ t -> [ testlist2 ] of t ] sort link-neighbors
show testlist4
]
end
有关列表操作和代理集操作之间的并行性的更多详细信息,请参见