我想将其总和=一种植物从其他植物(堂)获得的花粉总量,该花粉存储在列表的列表中(每只乌龟拥有的=植物)。 以下代码会导致错误(计算总和时):
OF个预期输入是业务代表或业务代表集,但获得了清单 [[119.05593 50 50] [301.25853 50 50] [30.23906 50 50] [460.525845 50 50] [55.16717 50 50] [301.25853 50 50]]。
有人可以帮我解决“ set Tot_pol sum ...”行中的错误吗? 非常感谢您的帮助。
to check-pol [m] ;; we check the pollen recieved by the two morphs
set Donnors [] ;; empty list of pollen donnors
ask zsps with [morph = m] ;; morph of the pollen reciever
[
set totpol 0
;; check for pollen donnors and morph for compatiblity within a radius :
ask zsps with[distance myself <= 20 and morph != m]
[
set totpol (NMaleFlowers * 100 * item round (distance myself) pollination-list) ;; the farther the less pollen
set Donnors lput [ (list totpol NMaleFlowers NFemFlowers)] of myself Donnors
]
set Tot_pol sum [ item (position 0 Donnors) Donnors ] of Donnors ;; total of pollen recieved
]
end
答案 0 :(得分:2)
卢克的回答很好,应该可以解决您的问题。但是,我怀疑您将要进行许多此类总和。您可能希望设置to-report
,将其用于要汇总的任何项目,只需传递项目编号和列表列表的名称即可。看起来像这样:
to-report sum-item [#pos #listoflists ]
let items map [ x -> item #pos x ] #listoflists
report reduce [ [a b] -> a + b] items
end
第一行将相关项(从0记下索引)提取到新列表中,第二行将其相加。
然后将其与set Tot_pol sum-item 0 Donnors
答案 1 :(得分:2)
这是一个实际上未回答您问题的答案。相反,它是一种更像NetLogo式的方式,可以完成我认为您要使用的代码。
to check-pol [m]
ask zsps with [morph = m]
[ let senders zsps with [distance myself <= 20 and morph != m]
set totpol sum [NMaleFlowers * 100 * round (distance myself)] of senders
]
end
您的代码进入了ask
级别,我认为这是不必要的。我认为您在处理清单时正在跟踪花粉捐赠者。但是代理集是一种更清洁的方法,然后您可以使用of
从代理集中提取所需的信息。
此外,当您在代码中从ask zsps with[distance myself <= 20 and morph != m]
到set
变量值时,则THOSE代理(不是接收代理)是已更改其变量的变量。我认为您正在尝试从花粉接收者的角度出发,后者会四处张望并从其他距离足够近的代理商处接收花粉。因此,接收代理应更改其值。
这未经测试。
答案 2 :(得分:1)
我不是100%知道您在这里要做什么(您可能想看看Minimum, Complete, and Verifiable Example guidelines),但是如果我没看错,您希望每个条目的第一项的总和在Donners
列表中。
关于您的方法为什么不起作用的原因-NetLogo告诉您该错误,您已将of
与列表一起使用,但是of
仅适用于代理或代理集。相反,您必须使用列表处理方法。最简单的方法可能是将sum
与map first
结合使用以获得所需的内容:
to sum-first-item
let example-list [ [ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ] ]
let sum-of-firsts sum map first example-list
print sum-of-firsts
end
要翻译为Donnors
,请尝试:
set Tot_pol sum map first Donnors
这应该可以,但是没有可复制的代码示例,我无法检查。