【问题标题】:NetLogo: Asking a limited number of turtles, ranked by the value of a variableNetLogo:询问有限数量的海龟,按变量的值排序
【发布时间】:2017-05-01 18:32:02
【问题描述】:

我正在尝试在 NetLogo(5.3.1,Mac Sierra 上)中对容量限制和优先级进行建模。归结为要求有限数量的海龟(比如n)做某些事情,并选择这些海龟,以便(1)它们满足一定的条件,(2)它们是具有最大值的n海龟变量my-variable

我正在尝试这样做:

let subset-of-turtles turtles with [ condition-variable = some-value ]
ask max-n-of n subset-of-turtles [ my-variable ] [< do something >]

但它有多个问题。

首先,如果没有乌龟满足[ condition-variable = some-value ]的条件,NetLogo会抛出一个错误

从仅有 0 个代理的集合中请求 n 个随机代理。

我尝试通过在ask 命令之前插入一行来解决:

let subset-of-turtles turtles with [ condition-variable = some-value ]
if subset-of-turtles != nobody [
  ask max-n-of n subset-of-turtles [ my-variable ] [< do something >]
  ]

但它不起作用:

observer> show turtles with [ condition-variable = some-value ]
observer: (agentset, 0 turtles)
observer> let subset-of-turtles turtles with [ condition-variable = some-value ] show subset-of-turtles != nobody
observer: true 

NetLogo 认为空的代理集仍然是代理集,所以它会通过不同于nobody 的测试。

其次,即使有一些海龟满足条件,如果它们小于n,NetLogo 也会抛出同样的错误。我的模型是一个增长模型,其中容量意味着一开始就足够,然后达到约束。因此,这将在模型的每一次运行中发生。

我希望 NetLogo 最多执行ask 块中的命令n 次。假设有满足条件的m海龟: 1.如果m &lt;= n,对所有m海龟执行命令 2.If m &gt; n,执行n乌龟的命令,最高值为my-variable。有人可以建议吗?

【问题讨论】:

    标签: constraints netlogo ranking


    【解决方案1】:

    一般来说,我不建议测试count &lt;agentset&gt; = 0,因为NetLogo 仍然需要构建agentset 来计算它。但是,有一个非常方便的any? 记者来完成这项任务。因此,请尝试对您的原始代码进行以下修改:

    let subset-of-turtles turtles with [ condition-variable = some-value ]
    if any? subset-of-turtles [
      ask max-n-of n subset-of-turtles [ my-variable ] [< do something >]
      ]
    

    【讨论】:

    • 谢谢仁。现在就试试。 :-)
    • 哦,对,当然。这是更好的方法,谢谢 Jen。
    【解决方案2】:

    假设这个设置:

    turtles-own [
      condition-variable
      my-variable
    ]
    
    
    
    to setup
      ca
      reset-ticks
      crt 10 [
        setxy random 30 - 15 random 30 - 15 
        set condition-variable random 2
        set my-variable 1 + random 10
      ]
    
    end
    

    首先,您可以使用count 快速检查代理集是否为空,并将其用作您的条件。

    不要这样做;正如@JenB 在接受的答案中所建议的那样,请改用any? 原语。

    其次,您可以使用ifelse 表示“如果子集中的海龟数量少于 n 个,则只询问子集中的海龟。否则,询问子集中的 n 个海龟。”

    to go
    
      let n 5
      let subset-of-turtles turtles with [ condition-variable = 1 ]
    
      ;;  obtain the number of turtles in the subset
      let subcount count subset-of-turtles
    
      ;; If there are more than 0 turtles in the subset, do the following
      if subcount > 0 [
        ;; If n is greater than the number in the subset, only ask the subset
        ifelse n >= subcount [
          ask max-n-of subcount subset-of-turtles [ my-variable ] [
            set size 2
          ]
        ]
        ;; If n is NOT greater than the number in the subset, ask n of the subset
        [
          ask max-n-of n subset-of-turtles [ my-variable ][
            set size 2
          ]
        ]
      ]  
    end
    

    【讨论】:

    • 卢克,我不知道该怎么感谢你。这是一个非常仔细,解释清楚的答案。我将立即尝试在模型的上下文中实现它并回复您。我投了赞成票,但我的声誉太低,无法公开影响它的得分。
    • 没问题 Alberto - 我希望它有效。如果没有,请随时提出后续问题。如果答案确实解决了您的问题,您应该接受它以“关闭”问题。
    • 我还有问题。感谢您的报价!我的大脑现在被炸了——我会睡在上面,明天再试调试。
    • 卢克,我已经在模型的准系统版本中测试了代码并且它可以工作,所以我接受了你的回答,非常感谢。我的模型本身行为不规律,动作 在你不期望的地方执行,反之亦然。我一定有另一个我不知道的问题。确定问题后,我可以提出一个新问题吗?
    • Alberto,不客气,但我认为一般来说最好问一个新问题,首先是每个项目一个问题,而且因为更多的人会看到一个新问题而不是一个新评论。
    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多