Netlogo:如何计算列表中列表项的总和?
我想将总和=一种植物从其他植物(Donnors)获得的花粉总数,存储在列表列表中(每只海龟拥有=植物)。 以下代码(计算总和时)出错: 预期输入的个数为代理或代理集,但已获取列表 [[119.05593 50 50] [301.25853 50 50] [30.23906 50 50] [460.525845 50 50][55.16717 50][301.25853 50][50] 有人能帮我解决“设置Tot_pol sum…”一行中的错误吗? 非常感谢你的帮助Netlogo:如何计算列表中列表项的总和?,netlogo,Netlogo,我想将总和=一种植物从其他植物(Donnors)获得的花粉总数,存储在列表列表中(每只海龟拥有=植物)。 以下代码(计算总和时)出错: 预期输入的个数为代理或代理集,但已获取列表 [[119.05593 50 50] [301.25853 50 50] [30.23906 50 50] [460.525845 50 50][55.16717 50][301.25853 50][50] 有人能帮我解决“设置Tot_pol sum…”一行中的错误吗? 非常感谢你的帮助 to check-pol [m
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
检查pol[m];;我们检查这两种变体接收到的花粉
设置Donnors[];;花粉囊空列表
用[morph=m]询问ZSP;;花粉接受器的形态
[
设置为0
;;在半径范围内检查花粉覆盖和变形的兼容性:
用[distance if询问ZSP我不能100%确定你在这里想要什么(你可能想看一下),但是如果我读对了,你需要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
要转换为唐纳语,请尝试:
set Tot_pol sum map first Donnors
这应该行得通,但如果没有可复制的代码示例,我无法检查。我不能100%确定您在这里想要什么(您可能想看看),但如果我读对了,您需要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
要转换为唐纳语,请尝试:
set Tot_pol sum map first Donnors
这应该行得通,但没有可复制的代码示例,我无法检查。卢克的答案很好,应该可以解决您的问题。然而,我怀疑您将要进行大量此类求和。您可能希望设置一个来报告,您只需传递项目编号,就可以用于任何要求和的项目r和列表的名称。它将如下所示:
to-report sum-item [#pos #listoflists ]
let items map [ x -> item #pos x ] #listoflists
report reduce [ [a b] -> a + b] items
end
第一行将相关项(记住0中的索引)提取到一个新列表中,第二行对该列表求和
然后,您可以将其用于设置Tot_pol sum item 0 Donnors
卢克的答案很好,应该可以解决您的问题。但是,我怀疑您将要进行大量此类求和。您可能希望设置一个来报告,只需传递项目编号,就可以用于任何您想要求和的项目以及列表的名称。它将如下所示:
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
一起使用。这里的答案实际上并没有回答您的问题。相反,它是一种更为网络化的方式,我认为您正试图用您的代码进行操作
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
检查pol[m]
用[morph=m]询问ZSP
[让发件人使用[distance If来回答你的问题。相反,这是一种更为网络化的方式,我认为你正试图用你的代码来做这件事
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
检查pol[m]
用[morph=m]询问ZSP
[让发件人ZSPs(距离我自己亲爱的卢克和Jen),你们的两个回答对我的工作都有很大帮助。现在,在我的代码中,一切都很好。感谢你们在我的代码中运行得很好。感谢你们的努力和时间。处理列表对于C++程序员来说,在NETLogo上不是一件容易的/显而易见的任务……(相当神秘,不是吗?).问候,Patrick.基于代理的建模(因此NetLogo)对于动作和代码有一种非常不同的思考方式。我个人很少使用列表-它们只有在顺序很重要的情况下才是真正必要的。一旦你获得了代理透视图,它就会变得更容易。你可能希望在开始时有大量的打印语句,以观察变量的变化,并确保它们在做你想做的事情请看我的另一个答案,我想你在NetLogo做的事情,亲爱的卢克和Jen,你的回答对我的工作都有很大帮助。现在,我的代码中的一切都很好。感谢你的努力和时间。在NeLogo中处理列表不是一个简单的C++任务。Grammer…(相当神秘,不是吗?)。关于,Patrick。基于代理的建模(以及NetLogo)对于动作和代码有一种非常不同的思考方式。我个人很少使用列表-它们只有在顺序很重要的情况下才是真正必要的。一旦你获得了代理透视图,它就会变得更容易。你可能希望在开始时有大量的打印语句,以观察变量的变化,并确保它们在做你想做的事情xpect.请参阅我的补充答案,了解更多NetLogo方法,我认为您正在尝试这样做是的,您是正确的。我的目标是从接收器的vew点跟踪花粉唐纳人。感谢您对代码的评论。这是一个严重错误。是的,您是正确的。我的目标是从o点跟踪花粉唐纳人收件人的传真。谢谢您对代码的评论。这是一个严重的错误。