问题描述
我正在尝试编写一个程序,其中某个品种的海龟在一定距离内询问某个品种的海龟某个变量的值。然后,询问的乌龟将捕获这些值并将其添加到自己的值,将它们映射+,然后将+减少为单个数字。这是代码
ask Teams
[ if AsgnE = "E 1"
[
ask Teams with [ distance myself < 25]
[
; assuming that there are no more then 2 teams within distance
let Val1 []
let Val2 []
let Val3 []
set Val1 Value
set Val2 Value
set Val3 [Value] of self
let Val4 (map + Val1 Val2 Val3)
set Val4 (reduce + Val4)
set Storys1 [Stories] of Epic 0
if Storys1 > 0 [ set TotValue1 Val4 ]
]
]
]
只要按下执行按钮,每个团队的值就会不断更新。问题在于结果数永远不会与所有值的总和匹配。随着数字的更新,它们永远不会匹配各个团队的总数。有时,在跳回较高的数字之前,该数字会降低至较低的数字(我假设它代表一个团队的价值)。
关于如何解决此问题的任何想法?
谢谢
鲁迪
解决方法
我的猜测是这是一个同步性问题。 ask
将遍历所有乌龟(以随机顺序)。假设它以乌龟1开头-因此,乌龟1将其值更新为其旧值与附近乌龟的所有值之和。然后要价继续前进到乌龟2,而乌龟2恰好在乌龟1附近。这意味着乌龟2再次加上了所有数字,乌龟1的值已调整。仅使用这两只乌龟,乌龟2的值就被添加了两次,因为乌龟1也将其隐藏在其新值中。
如果这不是您想要的行为,那么最简单的事情就是拥有一个名为next-value之类的额外变量。计算每只海龟的下一个值作为适当的总和。然后,在新的ask
中,将每只乌龟放到set value next-value
中,以同时更新它们。
此外,您的map和reduce似乎不必要地复杂。如果您要实现的目的是在一堆乌龟上添加变量的值,则可以在构造相关的乌龟代理集之后简单地对变量进行sum
。但这可能是出于问题的目的而简化的,在这种情况下,请忽略此!
UPDATE ----添加了完整的模型示例
turtles-own
[ team
myval
nextval
]
to setup
clear-all
create-turtles 20
[ setxy random-xcor random-ycor
set team one-of ["A" "B"]
set myval 1
]
reset-ticks
end
to go
ask turtles
[ let myteam turtles with [team = [team] of myself]
set nextval sum [myval] of myteam
]
type "total before: " print sum [myval] of turtles
ask turtles
[ set myval nextval
]
type "total after: " print sum [myval] of turtles
end