【问题标题】:Distance-based mortality model in netlogonetlogo 中基于距离的死亡率模型
【发布时间】:2017-05-23 23:34:49
【问题描述】:

我正在计算 netlogo 中的累积海龟死亡率,它是海龟(其中 100 只)从 netlogo 界面世界中的原点 (start-patch) 移动的距离的函数。在下面的代码中,“Pass-Away”程序链接到一个名为“space-death”的全局接口开关,该开关打开时会产生由名为“Pass-Away-Space”的程序承担的基于距离的死亡率,否则会保持定期的 per-由名为“Pass-Away-Time”的程序承担的时间步长 (tick) 死亡率:

    to Pass-Away-Time
  ask turtles [
    let chances 1 - exp( -1 * mortality * ticks )
    if chances >= 1 [die
      set dead-count dead-count + 1
    ]
  ]
end

to Pass-Away-Space
  ask turtles [
  let chances 1 - exp( -1 * mortality * [distance start-patch] of turtles)
    if chances >= 1 [die
      set dead-count dead-count + 1
    ]
  ]
end

to Pass-Away
  ask turtles [
     ifelse space-death [
     Pass-Away-Space][ 
     Pass-Away-Time
     ]
   ]
end

执行此操作时出现两个错误,都可能是由于“Pass-Away-Space”过程的编码问题。第一个是只有观察者可以询问所有海龟的集合。然后当我将let chances 1 - exp( -1 * mortality * [distance start-patch] of turtles) 移到ask turtles[] 括号之外时,这个错误得到解决,只产生另一个说**预期输入到是一个数字,但得到 list* 后跟一系列数字。可能是因为死亡率方程中读取* [distance start-patch] of turtles的部分被多个海龟调用(这正是我想要实现的——让每只随机游走的海龟使用它与原点的距离来计算它的累积每次-步死亡率和死亡超过阈值 - 对于不同距离的不同海龟在不同时间发生的事件)。关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: netlogo


    【解决方案1】:

    第一个错误是因为你问所有海龟问所有海龟。从您的Pass-Away 过程开始并假设space-death 设置为TRUE。发生什么了?您要求所有海龟运行Pass-Away-Space 程序。也就是说,每只海龟将依次运行该程序。该过程的第一步是ask turtles [ ]。所以乌龟要求所有的乌龟做某事。因此出现错误。

    要修复它,您需要重写Pass-Away-Space 过程,以便它运行需要为单个海龟运行的任何代码(同样适用于Pass-Away-Time)。你可能想要这样的东西:

    to Pass-Away-Space
      if exp( -1 * mortality * [distance start-patch]) < 0
      [ die
        set dead-count dead-count + 1
      ]
    end
    

    【讨论】:

    • 感谢您的想法,我能够弄清楚这一点,所以我重写了 Pass-Away-Space 和 Pass-Away-Time 而没有问乌龟。这消除了我的问题中所述的第一个错误(只有观察者可以询问所有海龟的集合),但第二个错误仍然是一个问题(** 预期输入是一个数字,但得到了列表**)。以下代码行的问题:let chances 1 - exp( -1 * mortality * [distance start-patch] of turtles.
    • 您将这行代码更改为if exp( -1 * mortality * [distance start-patch]) &lt; 0。为了正确理解您,您是否表明更改解决了问题并起作用,以便每只海龟计算其与原点的距离 (start-patch),然后使用该距离来计算其死亡率?
    • 不,我不知道你的代码中的 start-patch 是什么。我重写了代码只是为了修复我讨论过的关于嵌套问海龟的错误。 SO 协议是针对多个问题提出单独的问题,因为该站点旨在帮助其他有类似问题的人,而不仅仅是解决您的问题。因此,请创建一个标题专门针对您的问题的问题,并显示您现在拥有的代码。
    • 这就是我拥有的所有代码...... start-patch 是世界上的原点(点 (x,y) - (0,0)。我发布了两个问题(有使用相同的代码)在我原来的问题中。在我看来,您可能已经回答了一个问题,但要么忘记了,要么没有看到另一个!
    • 那么,您想让我们回答一个您懒得写的问题吗?您现在已经声明您提供的代码不是有问题的代码。此外,这不可能是完整的,因为您的代码中没有定义 start-patch。请写一个正确的问题,其中包含您遇到问题的代码和正在产生的错误。这样,我们就不必猜测了。
    【解决方案2】:

    所以这里的第一个问题是ask turtles [ ... ] 命令的嵌套使用,我们可以通过从to Pass-Away 过程中删除它来消除歧义,或者从嵌套在其中的其他两个(前面的)函数中删除它,如见下文(演示上述手段中的后者。

    let start-patch patch 0 0
    to Pass-Away-Time
      ask turtles [
        let chances 1 - exp( -1 * mortality * ticks )
        if chances >= 1 [die
          set dead-count dead-count + 1
        ]
      ]
    end
    
    to Pass-Away-Space
      ask turtles [
      ; let chances 1 - exp( -1 * mortality * [distance start-patch] of turtles)
      let chances 1 - exp( -1 * mortality * (distance start-patch))
        if chances >= 1 [die
          set dead-count dead-count + 1
        ]
      ]
    end
    
    to Pass-Away
       ifelse space-death [
         Pass-Away-Space][ 
         Pass-Away-Time
      ]
    end
    

    第二个错误可以通过将 to Pass-Away-Space 过程中注释的代码行 (;) 与紧随其后的行切换出来来解决,这样当每个海龟尝试执行 chances 时,每次距离累积 (使用[distance start-patch] of turtles 命令计算死亡率不是一组海龟机会,而是使用(distance start-patch) 计算每个海龟的概率,只要嵌套to Pass-Away 过程调用该过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 2016-10-11
      • 2017-12-25
      • 2019-10-24
      • 2022-06-14
      • 1970-01-01
      相关资源
      最近更新 更多