我有学生(海龟)和 30 所学校(补丁)。对于每个学生,我从包含每个学校效用的效用函数创建了一个变量(效用)(因此每个学生有 30 个值)。问题是我无法生成一个新变量来对每个学生的 30 个效用值求和。
turtles-own
[
utilities; schools' utilities for each individual
cumul;
]
patches-own
[
schoolachievement_2 ; overall mean school achievement
]
to go
ask turtles [ utility ]
to utility
set utilities [ school-utility ] of patches with [ schoolachievement_2 > 0 ]
set cumul reduce + [ utilities ] of turtles
end
end
reduce +
给出错误:“+预期输入是数字,但得到了列表”。
如果我使用
sum
而不是 reduce +
,我所有学生都会得到 0。
如果我使用 reduce +
代替 map sum
,我会收到错误:“SUM 预期输入是一个列表,但得到的是数字 0”。
LeirsW 关于语法问题的说法是正确的。但这里实际上存在很多问题。首先,我假设
school-utility
是补丁(学校)变量或使用其他补丁变量返回数字的报告者。由于它似乎不知道海龟叫它什么,所以所有海龟的答案可能都是相同的。这是你想要的,还是我错过了什么?接下来,在 utility
例程中,第一行让海龟创建一个实用程序列表(如果没有补丁满足 with
条件,则该列表可能为空)。在下一行中,每只海龟尝试对所有海龟的效用求和,而不仅仅是它自己的效用。因此,您正在对一个列表的列表进行求和,而不仅仅是一个简单的列表。有几种方法可以做到这一点。
第一个是
let cumul sum [sum utilities] of turtles
每只海龟将其效用相加,并将其传递给累积求和。 另一种方法是使用
sentence
将列表列表折叠为简单列表,然后对其求和。
let cumul sum sentence [utilities] of turtles
但是,这两种解决方案都回避了一个问题:为什么每只乌龟都被要求做同样的事情。累积量的计算应该在
utility
之外进行,因此只进行一次。
当然也许
cumul
应该只针对个体海龟?如果是的话,你只需要
let cumul sum utilities
show cumul
你把它放在正确的地方了。
查尔斯