我有两个品种,买家和供应商,买家正在建立供应商列表(sup_list),这些供应商的列表'att'中存储的属性大于列表'b'中存储的标准列表.以下行为第一个标准执行此操作 - 是否有一种简单的方法可以添加所有其他标准?
ask buyers [set sup_list suppliers with [item 0 att > [item 0 b] of myself]]
Run Code Online (Sandbox Code Playgroud)
所以在英语中,标准是:项目0>项目0和项目1>项目1和项目2>项目3等.
谢谢.
Nic*_*tte 11
你想要的表达是:
suppliers with [ reduce and (map > att [ b ] of myself) ]
Run Code Online (Sandbox Code Playgroud)
这是一个棘手的功能编程.让我们看看它是如何工作的.
我们的第一个目标是获取两个数字列表并将其转换为单个布尔值列表,其中每个项目将是true买方列表中同一位置的项目大于供应商中相同位置的项目名单.例如,如果我们有:
[1 1 1 1][2 1 1 1]...只有供应商列表中的第一项符合我们的标准,因此我们希望结果列表为:
[true false false false]每当我们想要将一个或多个事物列表转换为单个事物列表时,要使用的NetLogo原语就是map.该map原语记者和一个或多个列表.它将报告者应用于从列表中获取的项目,并从中构建新的列表.这正是我们所需要的.在NetLogo命令中心中尝试:
observer> show (map > [2 1 1 1] [1 1 1 1])
observer: [true false false false]
Run Code Online (Sandbox Code Playgroud)
有几点需要注意:
map,因此我们需要将整个表达式放在括号内.>作为记者传递.这也可以写成[ [a b] -> a > b ].现在我们有了布尔值列表,我们想检查是否所有这些值都是true,即所有供应商项目是否符合买方的标准.NetLogo有一个all?原语可以为代理集做类似的事情,但我们不能在这里使用它,因为我们正在处理一个列表.我们将不得不使用reduce.
在reduce原始的方法是使用每当我们想要把一个列表转换成一个单一的价值之一.在这里,我们希望将布尔值列表转换为单个布尔值,即true如果列表中的所有值都是true,false否则将是.
正如NetLogo文档所说,"对于什么reduce做出直觉可能很难".(我强烈建议您阅读文档并尝试使用原语.)简而言之,它遍历列表并将记者应用于每个项目和"累加器"值,将该操作的结果存储在累加器中.列表的第一项用于初始化累加器.
在我们的例子中,所使用的记者reduce会and,因为我们要检查的第一个项目是true,和第二项是true,和第三项是true等
让我们尝试减少我们以前获得的布尔列表:
observer> show reduce and [true false false false]
observer: false
Run Code Online (Sandbox Code Playgroud)
(并非我们再次使用简洁的语法and作为记者传递.这可能已经写好了[ [p q] -> p and q ].)
最终结果是false,因为并非所有值都是真的.让我们一步一步看看它是如何工作的:
true.and报告者.累加器是true第二项false.结果true and false是false,所以它存储false在累加器中.and报告者.累加器现在false,第二个项目也是false.结果false and false是false,它再次存储false在累加器中.false,第四步也是false.结果false and false是false,它再次存储false在累加器中.一旦我们用完了列表项reduce,在这种情况下报告累加器的值false.它报告的唯一情况true是列表中的所有值是否true导致一系列true and true比较都导致存储true在累加器中.这正是我们想要的:
observer> show reduce and [true true true true]
observer: true
Run Code Online (Sandbox Code Playgroud)
如果你将所有这些放在一起,你应该能够看到:
suppliers with [ reduce and (map > att [ b ] of myself) ]
Run Code Online (Sandbox Code Playgroud)
...为您提供符合买方所有标准的供应商代理商!
(注意,with返回一个代理集,而不是一个列表,所以你应该重命名你的sup_list变量...)