gpt4 book ai didi

netlogo - 如何比较Netlogo中的两个列表?

转载 作者:行者123 更新时间:2023-12-04 22:28:17 25 4
gpt4 key购买 nike

我有两个品种,买家和供应商,买家正在建立一个供应商列表(sup_list),这些供应商的属性存储在列表att中大于列表b所存储的条件列表。下一行针对第一个条件执行此操作-是否有一种简单的方法可以添加所有其他条件?

ask buyers [set sup_list suppliers with [item 0 att > [item 0 b] of myself]]

因此,用英语来说,标准是:项目0>项目0 AND项目1>项目1 AND项目2>项目3依此类推。

谢谢你。

最佳答案

您想要的表达式是:

suppliers with [ reduce and (map > att [ b ] of myself) ]

这是函数编程的一个棘手的问题。让我们看看它是如何工作的。

我们的第一个目标是将两个数字列表转换为一个 bool 值列表,如果购买者列表中相同位置的商品大于商品中相同位置的商品,则每个商品均为 true。供应商 list 。例如,如果我们有:
  • 采购商列表:[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]

    需要注意的几件事:
  • 由于我们将多个列表传递给 map ,因此需要将整个表达式放在括号内。
  • 我们使用简洁的语法将>作为报告程序传递。这也可以写成[ [a b] -> a > b ]

  • 现在我们有了 bool 值列表,我们想检查所有这些值是否均为 true,即是否所有供应商项目都符合买方的条件。 NetLogo有一个 all? 原语,它对代理集执行类似的操作,但由于要处理列表,因此在此不能使用它。我们将不得不使用 reduce 代替。

    reduce 原语是我们想要将列表转换为单个值时使用的原语。在这里,我们想将一个 bool 值列表转换为单个 bool 值,如果列表中的所有值都是 true,则它将为 true,否则将为 false

    正如NetLogo文档所说,“很难理解 reduce的作用。” (我强烈建议您阅读文档,并尝试使用该原语。)简而言之,它遍历一个列表,并将一个报告程序应用于每个项目和一个“累加器”值,并将该操作的结果存储在累加器中。列表的第一项用于初始化累加器。

    在我们的例子中,用于 reduce的报告程序将是 and,因为我们要检查第一项是 true,第二项是 true,第三项是 true,等等。

    让我们尝试减少我们先前获得的 bool 值列表:
    observer> show reduce and [true false false false]
    observer: false

    (并不是我们还是在使用简洁的语法作为报告者传递 and。这本可以写为 [ [p q] -> p and q ]。)

    最终结果是 false,因为并非所有值都为true。让我们一步一步看一下它是如何工作的:
  • 它将列表中的第一项存储在累加器中,因此累加器现在拥有值true
  • 它将累加器的值和第二项的值传递给and报告器。累加器是true,但是第二项是falsetrue and false的结果是false,因此它将false存储在累加器中。
  • 它将累加器的值和第三项的值传递给and报告器。现在,累加器为false,第二项也是falsefalse and false的结果是false,因此再次将false存储在累加器中。
  • 第四步就像第三步:累加器保存false,第四项也是falsefalse and false的结果是false,因此再次将false存储在累加器中。

  • 一旦我们用完列表项, reduce将报告累加器的值,在本例中为 false。唯一会报告 true的情况是,列表中的所有值都是 true,从而导致一系列 true and true比较,所有比较结果都导致将 true存储在累加器中。这正是我们想要的:
    observer> show reduce and [true true true true]
    observer: true

    如果将所有这些放在一起,您应该能够看到如何:
    suppliers with [ reduce and (map > att [ b ] of myself) ]

    ...为您提供了符合买方所有条件的供应商代理!

    (请注意, with返回一个代理集,而不是列表,因此您应该重命名 sup_list变量...)

    关于netlogo - 如何比较Netlogo中的两个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45858405/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com