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

时间:2018-06-20 13:38:48

标签: netlogo

我想将其总和=一种植物从其他植物(堂)获得的花粉总量,该花粉存储在列表的列表中(每只乌龟拥有的=植物)。 以下代码会导致错误(计算总和时):

  

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

3 个答案:

答案 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仅适用于代理或代理集。相反,您必须使用列表处理方法。最简单的方法可能是将summap 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

这应该可以,但是没有可复制的代码示例,我无法检查。