Netlogo :: Bloodthirsty Cannibalistic Turtles&我自己/自我混乱

时间:2016-02-24 14:59:00

标签: hashtable netlogo

新的NetLogo用户和第一次在这里张贴海报,手上有一些吃人的海龟。

关于我的模特:

我的海龟有一个体型(bsize)和一个品种(雄性,雌性,幼龟)。它们以随机方式移动并在补丁上相遇。当两只乌龟落在同一块地上时,我的小型野兽彼此相互大小,并且取决于特定于较大的海龟品种的同类相食(PrCan)的概率和两只之间的体型比例(bsize_ratio),较大的一个吃较小的一个。

我不认为这是相关的,但是我创建了一个包含两个键(体型比例,品种和同类相似概率)的3个列表的表(PrCanTable),使用表格:根据我发现的说明制作{ {3}}

要继续,较大的海龟会在表格(PrCanTable)中查找相关概率(PrCanT),然后选择一个随机数(随机浮动)并将其与概率(PrCanT)进行比较。如果随机数小于或等于概率,则小乌龟死亡。好难过!

不幸的是,我嗜血的乌龟行为不端。我遇到了一个问题:

MYSELF没有代理商参考。 fa 25运行MYSELF时出错   由程序CANNIBALIZE调用   由程序GO调用   按钮' go'

NetLogo在我的代码中帮助突出了我自己的最后一个实例......但我不知道为什么。我认为这是我自己对自己与自我的理解的问题。我尽可能多地阅读,但说实话,我仍然难过。任何人都可以看一下这段代码并告诉我吗?

to-report get-PrCan_T [ bsize_ratio_T breed_T ]
report table:get (table:get PrCanTable bsize_ratio_T) breed_T
end

to cannibalize
if ( any? turtles-here with [bsize > [bsize] of myself])
and ( random-float 1 <= get-PrCan_T ( precision( bsize / bsize of myself ) 1 ) ( [breed] of self ) )
[die]
end

1 个答案:

答案 0 :(得分:1)

是的,selfmyself一开始很混乱,但是一旦掌握了它,它就不那么难了。您需要了解的是,每一块NetLogo代码都会遇到“上下文”。默认情况下,该上下文是观察者,但是一些基元可以引入新的上下文。

ask是引入新上下文的最明显方式:传递给ask的命令块(由[]分隔)将NetLogo放入乌龟的背景。在该上下文中,self指的是当前的乌龟。

但有时你会在现有的乌龟上下文中引入一个新的乌龟上下文 !在新的上下文中,self改变了意义:它现在指的是来自内部环境的乌龟。但是,如果你仍然想从外部环境中引用乌龟呢?这就是myself的用途。

假设cannibalize是由乌龟运行的过程,您在myself中使用turtles-here with [bsize > [bsize] of myself]是正确的:运行with块的乌龟是{{ 1}}(你不需要指定)和运行self(“外”乌龟)的海龟是cannibalize。内部上下文由myself引入。

但是在with条件的第二部分(if之后的所有内容)中,不再存在内部上下文:您不再位于and块内。因此with不再定义。只有myself

由于您尝试将所有内容打包在相同的长self条件中,因此您的代码也变得更难调试。尝试使用多个局部变量将其拆分:

if

最后一点说明:在你的版本和我的版本中,运行to cannibalize let bigger-turtles-here turtles-here with [ bsize > [ bsize ] of myself ] if any? bigger-turtles-here [ let cannibal one-of bigger-turtles-here let ratio precision ([ bsize ] of cannibal / bsize) 1 let p get-PrCan_T ratio breed if random-float 1 <= p [ die ] ] end 程序的乌龟都是被吃掉的!这令人困惑。我要将程序重命名为cannibalize或切换周围的东西,以便运行程序的乌龟是进食的程序。 (命名很重要!)