使用“foreach”命令的过程偶尔会导致模型崩溃。 “用 [x] 询问海龟”是否会单独影响每只海龟?

问题描述 投票:0回答:1

我的 NetLogo 模型从物种 = 1 的海龟初始种群开始,这些海龟随机分布在具有 5 个栖息地(模型中称为扇区)的世界上。海龟可以在所有区域自由移动并繁殖,但有控制其饮食和表型的变量。我的检查物种形成程序是基于海龟的表型变量(表型值)及其所在的部门。它计算每个扇区的平均表观值,然后计算每个扇区之间的平均表观值的差异。如果这种差异超过设定的阈值,则该区域的所有海龟都会成为新物种,并且它们的物种价值会增加。

每运行 2-4 个模型,我都会收到此错误的不同变体“无法找到列表 [0 0 0 0 0] 的元素 5,其长度仅为 5”,因为我在此使用了“foreach”命令代码。我可以进行任何编辑以使其运行更一致吗?

为了更新海龟的物种,我使用“用 [sector = s] 询问海龟”。我希望它改变该区域中每只海龟的物种,从而产生 1 个由该区域中的海龟组成的新物种;然而,我认为它为该领域的每只海龟赋予了新的独特物种价值,从而产生了与海龟一样多的新物种。 “问海龟”如何对海龟群起作用?有没有办法让一个扇区中的所有海龟都以同样的方式变化?

这是我的代码:

to check-speciation
  let sector-list sort remove-duplicates [sector] of patches with [ any? turtles-here ]
  let turtle-counts-per-sector []
  let avg-pheno-per-sector []
  let max-turtle-count 0
  let max-sector 0
  let sector-differences []
  foreach sector-list [
    s ->
    let count-turtles count turtles with [sector = s]
    set turtle-counts-per-sector lput count-turtles turtle-counts-per-sector
    let avg-pheno mean [ pheno-value ] of turtles with [ sector = s ]
    set avg-pheno-per-sector lput avg-pheno avg-pheno-per-sector
    if count-turtles > max-turtle-count [
      set max-turtle-count count-turtles
      set max-sector s
    ]
    let difference ( max avg-pheno-per-sector ) - item (s - 1) avg-pheno-per-sector  
    set sector-differences lput difference sector-differences
    if item ( s - 1 ) sector-differences >= speciation-threshold
    [ask turtles with [ sector = s ] [
      let new-species ( 1 + max species-list )
      set species new-species
      set species-list lput new-species species-list
      set pheno-value 0
      ]
    ]
  ]
end

我将“item s”更改为“item ( s - 1 )”,因为每次模型运行时都会出现“找不到列表元素”错误。这解决了大多数模型运行的问题,但我会经常收到错误,而且我不知道如何阻止它。

物种列表保存模型中存在的所有物种值,并使用“1 + 最大物种列表”确保在物种形成发生时使用新的物种值(否则,如果 2 个海龟区域最初的物种 = 1,则它们'尽管属于不同的部门,但 d 都变为物种 = 2)。这就是为什么我认为“[询问海龟与[部门= s][”正在单独影响一个部门内的每只海龟,因为我会随机获得大量新物种。如何让一个区域中的所有海龟具有相同的新物种值?非常感谢任何想法和建议!!

netlogo agent-based-modeling
1个回答
0
投票

我没有花时间仔细查看你的代码,但我立即怀疑问题陈述是:

let sector-list sort remove-duplicates [sector] of patches with [ any? turtles-here ]

会不会偶尔有一个或多个扇区没有海龟,所以这个列表的成员少于 5 个?如果是这样:

  • 尝试将扇区列表设置为始终保存扇区值的全局变量

  • 更改此代码:

    foreach 扇区列表 [ s-> 让 count-turtles 计算 [sector = s] 的海龟 设置每个扇区的海龟计数 lput count-turtles 每个扇区的海龟计数 令 avg-pheno 表示具有 [ector = s] 的海龟的 [pheno-value]

所以它处理的是没有海龟的扇区号:

let turtles-on-sector turtles with [sector = s]
ifelse any? turtles-on-sector
[ do this ]
[ or do this if no turtles ]

否则,你的方法看起来总体很好!

史蒂夫·R.

© www.soinside.com 2019 - 2024. All rights reserved.