Function 代理集输入函数返回列表错误

Function 代理集输入函数返回列表错误,function,netlogo,Function,Netlogo,我试图在我的模型中创建一个新函数,代理依次对它的每个邻居执行该函数,并在执行过程中聚合总和。例如(从邻居1返回值)+(从邻居2返回值)+(从邻居3返回值) 然而,稍微复杂一点的是,该函数由两个已编程的代理集输入函数组成,事实上如下所示: 职能3: ((功能1[我自己的邻居1]*功能2[我自己的邻居1])+(功能1[我自己的邻居2]*功能2[我自己的邻居2])+(功能1[我自己的邻居3]*功能2[我自己的邻居3])……n?)` 我一直在尝试使用以下代码在Netlogo中实现此功能: let fun

我试图在我的模型中创建一个新函数,代理依次对它的每个邻居执行该函数,并在执行过程中聚合总和。例如(从邻居1返回值)+(从邻居2返回值)+(从邻居3返回值)

然而,稍微复杂一点的是,该函数由两个已编程的代理集输入函数组成,事实上如下所示:

职能3:

((功能1[我自己的邻居1]*功能2[我自己的邻居1])+(功能1[我自己的邻居2]*功能2[我自己的邻居2])+(功能1[我自己的邻居3]*功能2[我自己的邻居3])……n?)`

我一直在尝试使用以下代码在Netlogo中实现此功能:

let function3 (sum [function1 myself self] of neighbours) * ( sum [function2 myself self] of neighbours)
如果邻居被定义为:

let neighbours turtle-set other turtles in-radius neighbourhood
功能1是:

to-report function1 [ agent1 agent2 ]
let w2 square w
report exp (- function2 agent1 agent2 / w2)
功能2是:

to-report function2 [ agent1 agent2 ]
report ( (square ([a-rock] of agent1 - [rock] of agent2)) + (square ([a-hip-hop] of agent1 - [hip-hop] of agent2)) )
但是,每当我运行模型时,我都会收到一个错误,指出: “*预期输入为一个数字,但改为获取列表[0.1600000000000003 0.5000000000000001]。运行turtle 2时出错*由过程调用FIND-P由过程调用GO由按钮'GO'调用”

似乎我的新函数3——不是依次对每个邻居执行,而是在执行过程中聚合总和——实际上创建了一个(函数1*[我自己所有邻居一个接一个])列表,并尝试将其添加到另一个(函数2*[我自己所有邻居一个接一个])列表中。这导致如上所述接收到的乘法列表错误。上周我一直在研究这个问题,读了很多书,尝试了很多版本的新东西,但是运气不好


我只是想知道是否有人能就我的错误向我提供建议,或者告诉我一些相关信息?感谢您抽出时间。

请参阅赛斯的评论。一句话:我们不得不猜测太多的代码。但这里有一个猜测是正确的:

globals [neighbourhood w]
turtles-own [a-rock rock a-hip-hop hip-hop]

to setup
  ca
  set neighbourhood 3 
  set w 1
  ask patches [sprout 1]
end

to f3test
  setup
  ask turtle 1 [print function3]
end

to-report square [#x]
  report #x * #x
end

to-report function3  ;;turtle proc
  let nbrs other turtles in-radius neighbourhood 
  report (
    (sum [function1 myself self] of nbrs)
    *
    ( sum [function2 myself self] of nbrs)
  )
end

to-report function1 [ agent1 agent2 ]  ;;observer proc
let w2 square w
report exp (- function2 agent1 agent2 / w2)
end

to-report function2 [ agent1 agent2 ]  ;;observer proc
report ( 
  (square ([a-rock] of agent1 - [rock] of agent2)) 
  + 
  (square ([a-hip-hop] of agent1 - [hip-hop] of agent2)) 
)
end

我认为你发布的代码不可能给出那个错误。我认为问题一定出在你没有发布的东西上,或者你的实际代码和你发布的代码之间存在一些差异。我的理由是:
sum
不可能报告一个列表,因为
sum
总是报告一个数字;您发布的代码的格式为
sum…*总和…
;所以除了两个数字相乘之外,你不可能做任何事情。您的实际代码必须不同。您可以通过插入print语句来测试各种假设,例如,在执行
a*b
insert
print is number之前?一个
打印是数字吗?b
。它应该打印
true
true
。如果没有,问题就出在上游,所以在上游插入print语句,试图找到程序中实际值与预期值不同的第一个时间点。你好,Seth和Alan。非常感谢你发表了有益的评论。赛斯告诉我,求和不会导致这种错误,这是正确的。该错误来自另一个函数的上游,该函数几乎相同且命名类似,但不包括“sum”。使用sum,我不再收到错误,可以继续检查我工作的其他部分……通过Seth的修改和Alan的非常有用的示例,我能够制作一个模型,其中……(func1 me&Neigh1)+(func1 me&N2)+(func1 me&N3)……。在所有相邻区域,例如0.4+0.7+0.3可以求和(到1.4),然后乘以(func2 me&Neigh1)+(func2 me&N2)+(func2 me&N3)(例如0.1+0.3+0.1=0.5)之和。最终1.4*0.5=0.7然而(由于我拙劣的解释无助于澄清),这不是我的意图。相反,我希望得到(func1 me&Neigh1*func2 me&Neigh1)例如(0.4*0.1),然后将其添加到(func1 me&N2)*(func2 me&N2)例如(0.7*0.3),然后将其添加到(func1 me&N3)*(func2 me&N3)例如(0.3*0.1)这将最终得到0.04+0.21+0.003=0.253在过去的几天里,我一直在研究如何实现这一目标,并且读到使用数组可能是一种前进的方式。因此,我现在使用以下代码实现了此结果: