Netlogo:代码要求补丁移动,但指令在询问乌龟上

Netlogo: Code is asking patches to move, but the instructions are on ask turtle

因此,我之前曾询问过没有存储特定邻居值的补丁,多亏了 Matteo、JenB 和 Lena,我才能够取得进一步的进展。 Sicen 然后代码进步了一点,因此我遇到了一个新的错误。

首先,如果复制和粘贴代码可以工作,但有两件事是必要的,我没有底片,所以有必要将中心更改为角落,我不知道如何不创建设置按钮,所以它会需要。

现在,代码生成了3个区域,3种颜色,每个边界根据一个随机数移动。有了这个,靠近边界的海龟应该同时改变补丁的颜色和它自己的颜色,同时随机转动和移动。

问题是我不知道我缺少什么但是补丁确实改变了颜色,但是乌龟没有改变或移动,说指令正在被补丁应用并且补丁不移动,这是有道理的。但为什么?我设定的条件是,如果海​​龟有一定的能量,那么它们应该按照我的要求去做。

问题再次出现在 move-potrero 中,分号中的部分。

turtles-own [energia]
 patches-own
[bordear
abandono
reforestado
potrerizado
temperatura
humedad
dosel
]
breed [ potreros potrero ]  
breed [ bordes borde ] 
breed [ bosques bosque ]

to setup
  clear-all

  ask patches with [
    pxcor <= 30 and
    pxcor >= min-pxcor and
    pycor <= 60 and
    pycor >= min-pycor ] [
    set pcolor 35
    set temperatura 26.5
    set dosel 1
   set humedad 90.4
  ]
 ;Potrero
  ask patches with [
    pxcor <= 60 and
    pxcor >= 30 and
    pycor <= 60 and
    pycor >= min-pycor ] [
    set pcolor 44
    set temperatura 29
    set dosel 84.3
   set humedad 79.3;
  ]
  ;Borde
  ask patches with [
    pxcor <= 90 and
    pxcor >= 60 and
    pycor <= 60 and
    pycor >= min-pycor ] [
    set pcolor 66
   set temperatura 26.3
   set dosel 85.2
   set humedad 94 ;
  ]
  ;Bosque

 ;se establece la forma de la rana
 
 ; Se establecen las condiciones de las ranas, tamaño color y lugar de aparicion. La energia sera igual en todas las ranas en el set up.

   create-potreros 50

  [ set size 3        ;; easier to see
    set color yellow
setxy random xcor random ycor
move-to one-of patches with [pcolor = 35]
    set heading random 45 + 45
    set energia 50
 ]   ;; red = not carrying food

 ;Potrero


 
    reset-ticks
end

to go
  ask potreros [
    if energia < 50 [descansar-potrero]
    if energia >= 50 and energia <= 80 [move-potrero]
    if energia > 80 [ if ticks mod 50 = 0 [reproducirse]]
    set heading random 270
      fd 1
 set energia energia - 2
  morir]

  ask patches [ reforestacion ]
  ask patches [ deforestacion ]
  ask patches [abandonacion]
  ask patches [borderizacion]


if ticks >= 500 [stop]
tick
end

to reforestacion
  if pcolor = 44 [
     set reforestado count neighbors with [pcolor = 66] ]
  if reforestado >= 3 [if random 100 <= 50 [
    set pcolor 66
    set temperatura 27 + random 3
    set humedad 90 + random 5
    set dosel 70 + random 10 ]
  ]


end


to deforestacion
  if pcolor = 44 [
     set potrerizado count neighbors with [pcolor = 35] ]
  if potrerizado >= 3 [if random 100 <= 50 [
    set pcolor 35
    set temperatura 26.5 + random 3
    set humedad 80 + random 10
    set dosel 40 + random 10]
  ]


end

to abandonacion
  if pcolor = 35 [
     set abandono count neighbors with [pcolor = 44] ]
  if abandono >= 3 [if random 100 <= 50 [
    set pcolor 44
    set temperatura 26.5 + random 3
    set humedad 80 + random 10
    set dosel 40 + random 10]
  ]

end

to borderizacion
  if pcolor = 66 [
     set bordear count neighbors with [pcolor = 44] ]
  if bordear >= 3 [if random 100 <= 50 [
    set pcolor 44
    set temperatura 27 + random 3
    set humedad 90 + random 5
    set dosel 70 + random 10]
  ]
end

to move-potrero
  ask neighbors in-radius 2
     [if temperatura >= 28.6 or temperatura <= 22.6 or dosel >= 5 or humedad <= 84
      [ set pcolor red
       ;facexy random 30 random 60
      ;fd 5
      ;set energia energia - 10]]
    ;[ask potreros [descansar-potrero]]
  ]]



end

to descansar-potrero
  ifelse pcolor = 35 [
    set energia energia + 6]
  [set energia energia + 1]

end

to reproducirse
  if energia > 80 [ if random 100 > 60 [set energia energia - 70
      hatch 1 [ rt random-float 360 fd 2
      set energia energia / 3]]]
end
  to morir
  if energia <= 1 [die]

end

1

问题是你要求补丁执行 turtle 命令(例如 facexyfd),因为 neighbors 报告补丁。来自 NetLogo dictionary:

Reports an agentset containing the 8 surrounding patches (neighbors) or 4 surrounding patches (neighbors4).

因此,诀窍是将 neighbors 替换为 turtles;

to move-potrero
  ask turtles in-radius 2 [
   if temperatura >= 28.6 or temperatura <= 22.6 or dosel >= 5 or humedad <= 84 [
     set pcolor red
     facexy random 30 random 30
     fd 5
     set energia energia - 10
    ] 
  ]
  
  ask potreros [descansar-potrero]
end

允许此代码 运行 的是海龟可以对它们所站立的补丁的变量进行操作(请参阅 User Manual > 编程指南 > 变量)。 因此,例如,要求海龟检查 temperatura 不会产生错误,即使 temperaturapatches-own.

另一种选择可能是要求补丁(即您使用 neighbors 调用的补丁)要求“他们的”海龟做事。您可以使用 turtles-here:

to move-potrero
  ask neighbors in-radius 2 [
   if temperatura >= 28.6 or temperatura <= 22.6 or dosel >= 5 or humedad <= 84 [
     ask turtles-here [
       set pcolor red
       facexy random 30 random 30
       fd 5
       set energia energia - 10
      ] 
    ]
  ]
  
  ask potreros [descansar-potrero]
end

有了这个设置,每个相邻的补丁都会检查那些与补丁相关的条件,如果其中一个为真,就要求那里的每只乌龟做点什么。 结果 将是 相同,尽管我认为前一个选项需要更少的计算时间:由您选择您喜欢的样式。

为什么我说“相同”?见下一点。

2

表达式neighbors in-radius 2在NetLogo中没有多大意义:neighbors将报告8个相邻的补丁,这些不会随着一定的半径而改变。我也可以写 neighbors in-radius 1000,但我总是会收到相同的 8 个补丁,因为只有这 8 个补丁是某个补丁的邻居。

知道这一点特别重要,因为 NetLogo 不会告诉你,即如果你写 neighbors in-radius 2 它不会给出错误消息(事实上这不是语法错误,因为 in-radius 出现在代理集之后和数字之前,就像它 requires): NetLogo 将仅通过仅报告相邻的补丁来继续。

因此,从上面的第 1 点中您应该更喜欢的选项是第一个选项,即带有 ask turtles in-radius 2 的选项。事实上,这是唯一能让你玩 in-radius.

的选项

3

请注意,存在 resize-world 命令(参见 here)。通过将 0 包含为 min-pxcormin-pycor,您将能够在您的代码中自动执行您的世界不包含负坐标的事实。