无法在 NetLogo 中为每个品种生成多个 'species'

Unable to generate multiple 'species' per breed in NetLogo

我是 NetLogo 的新手,我正在尝试在每个品种中创建 2 个子品种(用不同的形状表示),总共 2 个品种(即鲨鱼和鱼)。当 运行 单独时,代码块按预期工作,但是,当 运行 两个块时,鱼的第一个子品种似乎没有在界面选项卡中初始化。出于某种原因,鲨鱼品种的初始化似乎干扰了鱼类品种的初始化。

知道我做错了什么吗?下面的代码。

; Create the agents
breed [sharks shark]
breed [fishes fish]

; Create the agents' variables

fishes-own
[
  x0                 
  y0                 
]

globals
[
  species             
  species-f
]

to setup

  ; Always start with this
  clear-all
  reset-ticks

  ; Create sharks and species

  create-sharks N-sharks ; N-sharks is a slider
    [
      set color blue
      
      setxy random-xcor random-ycor 

      set species N-sharks
      ask sharks
        [
          set shape "default"          
          set size 2.5
        ]

      ask sharks with [who >= (species * (1 / 2))]
        [
          set shape "square"          
          set size 2
        ]

      ask sharks with [who < (species * (1 / 6))]
        [
          set shape "star"            
          set size 3
        ]
    ] ; End create sharks and species

  ; Create fishes

  create-fishes N-fishes
    [
      setxy random-xcor random-ycor
      set x0 xcor
      set y0 ycor

      set species-f (N-fishes * species-ratio)    
      ifelse who <= species-f
        [
          set shape "sheep"
          set size 5
        ]
        [
          set shape "cow"
          set size 3
        ]

      set color white

    ] ; End create fishes


end

问题是您正在使用 who 来确定您的目标。引用 Netlogo programming guide:“无论品种如何,都会分配给谁编号。如果您已经有一只青蛙 0,那么第一只老鼠将是老鼠 1,而不是老鼠 0,因为编号 0 已经被占用。”。 =17=]

因此,您需要考虑鲨鱼的数量来确定鱼类的分界点

set species-f (N-fishes * species-ratio) + N-sharks - 1

我对您的代码的另一个评论是您使用了以下结构:

create-sharks N-shark [
   ask sharks [...]
]

每只鲨鱼执行create-sharks的整个命令块。这意味着每只鲨鱼都要求每只鲨鱼做某事。因此,每条鲨鱼都将其形状设置为默认 N-shark 次。 使用以下结构之一效率更高

create-sharks N-shark [...]
ask sharks [...]

create-sharks N-shark [
   if <condition> [<reshape-self>]
]

关于 NetLogo 的 运行 代码是什么,以及某些代码片段的作用,似乎存在许多误解:当您使用 create-turtles *number* [*commands*] 时(或使用 breeds,如在您的case), commands 是 运行 一次 被创建的每个乌龟 (first the new turtles are created, then they run the commands in turn).

这意味着每次您在 create-sharks' 命令块中使用 ask sharks 时,每条新鲨鱼都会要求所有其他鲨鱼设置形状和大小。例如,如果您创建 100 条鲨鱼,而不是只设置一次形状和大小,您需要执行 10,000 次 (100 * 100)。

所以你需要将所有这些命令从它们各自的 create-<breed> 命令块中取出;例如:

create-sharks N-sharks [
  set color blue
  setxy random-xcor random-ycor
]

ask sharks [
  set size 2.5
]

ask sharks with [who >= (species * (1 / 2))] [
  set shape "square"
  set size 2
]

ask sharks with [who < (species * (1 / 6))] [
  set shape "star"
  set size 3
]

这仍然是可改进的代码,但它展示了如何通过执行一次而不是执行 N-sharks ^ 2 次来实现完全相同的事情。

更好的方法是将这些命令带回 create-<breed> 的命令块中,但让每个代理只为自己执行任务。即不使用ask sharks而是使用ifelse,这样每只鲨鱼都会检查自己的条件:

create-sharks N-sharks [
  set color blue
  setxy random-xcor random-ycor

  (ifelse
    who >= (species * (1 / 2))         ; the first condition
      [set shape "square" set size 2]
    who < (species * (1 / 6))          ; the second condition
      [set shape "star" set size 3]
    ; else
      [set size 2.5])
]

所有这些也适用于其他品种。

一般说使用who是代码应该改进的标志,但我们现在先不关注这个。

你会注意到我省略了你 set species N-sharks 的部分。这是因为我认为这里还有另一个误解,我不清楚你想做什么:species(例如 species-f 代表其他品种)是一个全局变量。您基本上要求 100 条鲨鱼中的每一条(再次,例如 100 条)做同样的事情:将全局变量的值设置为等于另一个全局变量的值。在这种情况下,您要求每条鲨鱼 set species 100。这似乎非常不必要,特别是考虑到 N-sharks 是用于设置的滑块,因此在模拟期间可能不会更改(这意味着可能不需要存储 current N-sharks 的值作为单独的全局变量)。

为什么要根据 species 的值对 sub-breeds 进行重新分区?你想让 species 代表什么?将它作为 N-sharks 的单独变量是否正确?如果是,那么不清楚它的意义是什么;如果没有,则可以淘汰。

您需要确保使用 N-sharksspecies 以及 N-fishesspecies-f 可以更好地反映在您的代码中。

还因为我认为这就是您的第一条鱼 sub-breed 没有出现的原因。首先,什么是species-ratio?它不存在于您的示例中,但它似乎与您的问题相关。无论如何,如果你的第一条鱼 sub-breed 没有出现,这意味着没有 fish 满足条件 who <= species-f.

这并不让我吃惊。 who 海龟的数字是渐进的:如果你创造了 15 条鲨鱼,后来又创造了 10 条鱼......

  • ...最老的鲨鱼会有who = 0
  • ...最年轻的鲨鱼会有who = 14
  • ...最老的鱼会有who = 15
  • ...最小的鱼会有who = 24

如您在此示例中所见,who <= N-fishes(其中 N-fishes = 10)没有鱼。更不用说在你的情况下你 set species-f (N-fishes * species-ratio) 并且,虽然你没有告诉 species-ratio 是什么,但我想它是一个介于 0 和 1 之间的值 - 因此 species-f 的值甚至更小。