NetLogo中如何为每个turtle计算utilities列表的总和?
NetLogo计算学生效用值总和问题
我用turtle代表学生,patch代表30所学校,给每个学生添加了utilities变量,用于存储每所学校的效用值(每个学生对应30个值),现在无法用新变量计算每个学生这30个效用值的总和。
现有代码
turtles-own [ utilities; 每个学生对应的各学校效用值 cumul; 效用值总和 ] patches-own [ schoolachievement_2 ; 学校整体平均成绩 ] to go ask turtles [ utility ] end to utility set utilities [ school-utility ] of patches with [ schoolachievement_2 > 0 ] set cumul reduce + [ utilities ] of turtles end
遇到的错误
- 使用
reduce +时报错:'+ expected input to be a number but got the list' - 改用
sum时,所有学生的cumul值均为0 - 使用
map sum时报错:'SUM expected input to be a list but got the number 0 instead'
问题根源
你错误地尝试对所有学生的utilities列表集合求和,而不是针对当前单个学生自己的utilities列表计算总和。
修正后的代码
直接对当前学生的utilities列表调用sum即可:
to utility set utilities [ school-utility ] of patches with [ schoolachievement_2 > 0 ] set cumul sum utilities ; 计算当前学生自身效用值列表的总和 end
补充说明
sum utilities:每个学生的utilities是一个数值列表,sum会直接计算该列表内所有数值的总和,完全匹配需求。- 之前用
sum结果为0,是因为错误地使用了sum [utilities] of turtles这类写法,求和对象变成了所有学生的列表集合,而非单个学生的列表。 - 也可以用
reduce + utilities实现同样效果(reduce +会依次对列表元素执行加法),但sum是NetLogo专门用于计算列表总和的命令,更直观易懂。
内容的提问来源于stack exchange,提问作者Nicola Pensiero
相关产品推荐
相关产品推荐

