Netlogo,如何捕获海龟变量的值,并添加每个海龟值,映射它们,并将它们简化为单个海龟#
我试图写一个程序,某个品种的海龟在一定距离内询问同一品种的海龟某个变量的值。然后提问的海龟将捕获这些值并将它们添加到自己的值中,映射+它们,然后将+减少为单个数字。这是密码Netlogo,如何捕获海龟变量的值,并添加每个海龟值,映射它们,并将它们简化为单个海龟#,netlogo,Netlogo,我试图写一个程序,某个品种的海龟在一定距离内询问同一品种的海龟某个变量的值。然后提问的海龟将捕获这些值并将它们添加到自己的值中,映射+它们,然后将+减少为单个数字。这是密码 ask Teams [ if AsgnE = "E 1" [ ask Teams with [ distance myself < 25] [ ; assuming that there are no more then 2 teams wit
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 ]
]
]
]
询问团队
[如果AsgnE=“E 1”
[
询问[距离自己<25]的团队
[
;假设距离内不超过2个团队
让Val1[]
让Val2[]
让Val3[]
设置Val1值
设置Val2值
设置自身的Val3[值]
设Val4(map+Val1 Val2 Val3)
设置Val4(减少+Val4)
设置史诗0的故事1[故事]
如果故事1>0[设置为TotValue1值4]
]
]
]
只要按下go按钮,每个团队的值就会不断更新。问题是,结果数字永远不会与所有值的总和匹配。随着数字的更新,他们永远不会与单独团队的总数相匹配。有时,在返回到更高的数字之前,数字会下降到一个较低的数字(我假设它代表一个团队值)
你知道怎么解决这个问题吗
谢谢
鲁迪我猜这是一个同步性问题。
ask
将(以随机顺序)遍历所有海龟。假设它以turtle 1开始-turtle 1将其值更新为其旧值和附近turtle的所有值之和。然后问到海龟2,海龟2正好在海龟1附近。这意味着海龟2会再次将所有数字相加,海龟1会调整其值。只有这两个海龟,海龟2的值会增加两次,因为海龟1的新值中也隐藏了海龟2的值
如果这不是您想要的行为,那么最简单的方法是使用一个名为next value之类的额外变量。计算每只海龟的下一个值作为适当的总和。然后,在一个新的ask
中,让每只海龟设置下一个值
以同时更新它们
此外,您的map和reduce看起来不必要地复杂。如果您试图实现的是将一个变量的值添加到一堆海龟上,那么您只需在构建相关海龟代理集后对变量进行求和即可。但可能是为了问题的目的而简化了,在这种情况下,请忽略这一点
更新----添加了完整的模型示例
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
谢谢JenB这么快的回复。如何计算每个海龟的下一个值,如何分离每个海龟的输入以计算它们的值?参见我添加的示例-通过使用不同的变量存储计算结果来进行分离,并且在所有计算完成之前不要将其移回主变量中。我没有更快地响应,我在旅行。明天我将尝试代码。嗨,JenB,如果我使用“1”作为myval变量的值,代码会起作用,但是我的代码要求myval的值(或者在我的情况下,变量“value”代替“myval”)是来自另一个Netlogo模型(通过Levelspace连接)的连续输入。当我这样做时,我得到运行时错误:“LPUT期望输入是一个列表,但得到的是数字0。”我知道Levelspace连接模型正在提供信息,但由于某种原因,利用您的代码,无法识别信息。有什么想法或解决办法吗?谢谢我根本没有和levelspace合作过对不起。但也许您可以尝试打印来自levelspace的信息,以确保其格式符合您的想法。这听起来像是一个单独的问题,如果能看到使用levelspace信息(并生成错误)的代码就好了