1

在 NetLogo 5.x 中处理递归过程的简单练习似乎出现了一个问题。该模型模拟海龟一次游荡一个补丁并从补丁中收集 M&M。目标是使用递归过程调用来允许找到 M&M 的海龟获得额外的两个回合。这可以通过非递归方法轻松完成,其中我们使用变量来跟踪转数。但是,这种情况下我们需要用到递归,而递归似乎会导致一个莫名其妙的问题:

patches-own [MM]
turtles-own [collection]

to setup ;; observer
  ca
  random-seed 1234
  ask patches [ set MM random 6 ]
  ask patches [ set plabel-color grey - 3 
                set plabel MM ]
  crt 10 [ set color grey 
                       set heading (random 4 * 90) 
                       set collection 0 
                       set label-color yellow ]
end


to go ;; observer
 ask turtles [ collect ]
 if max [ MM ] of patches = 0 [ stop ]
end

to collect ;; turtles 
 rt (90 * random 4)
 fd 1

 if [ MM ] of patch-here > 0
  [ set collection collection + 1
   set MM MM - 1 
   set label collection
   set plabel  MM
   collect
   collect
  ]
end

如果此代码正常运行,那么每次海龟遇到 M&M 时,都应该生成并运行两个 collect 子实例。这可能正在发生,然而,发生的事情是海龟一旦击中零 M&M 的补丁就会停止收集狂欢。因此,此代码产生的结果与 collect 仅调用自身一次以及 collect 调用自身 3 次或更多次时的结果相同。

这使我相信if递归运行的条件可能会导致问题,因为将递归调用放在条件之外会起作用。NetLogo 似乎不以某种方式尊重递归。例如,如果您collect collect在过程末尾的行周围插入调试代码:

   show "!"
   collect
   show "two"
   collect
   show "three"
  ]
show "four"
end

然后只!打印four到指挥中心,但其他人从不执行。关于为什么以这种方式工作的任何帮助都会很有用。看起来更像是错误而不是功能。

4

1 回答 1

0

如果你打了一个没有 MM 的补丁,就没有递归调用,collect 过程移动海龟并结束。您的递归调用位于 if 子句的主体内,如果条件为假,则跳过它们。

于 2016-02-05T13:34:23.030 回答