Netlogo:如何计算列表中列表项的总和?

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

我想将总和=一种植物从其他植物(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]                     ;; 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点跟踪花粉唐纳人收件人的传真。谢谢您对代码的评论。这是一个严重的错误。