新的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
答案 0 :(得分:1)
是的,self
和myself
一开始很混乱,但是一旦掌握了它,它就不那么难了。您需要了解的是,每一块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
或切换周围的东西,以便运行程序的乌龟是进食的程序。 (命名很重要!)