NetLogo的新用户和新手发布者,我手上有些食人鱼。
关于我的模型:
我的海龟有一个体型(大小)和一个品种(雄性,雌性,幼龟)。他们以随机的方式四处走动,彼此碰面。当两只乌龟降落在同一块地上时,我的小兽彼此变大了,并取决于特定于较大的乌龟品种的同类相食的可能性(PrCan)和两者之间的体长比(bsize_ratio),较大的那只乌龟会吃掉较小的一个。
我不认为这是相关的,但我使用table:make从我发现的on this stack overflow answer.指令中创建了一个包含3个列表的表(PrCanTable),该表具有两个键(体重比,品种和食人概率)。
为了继续进行操作,较大的乌龟会在表(PrCanTable)中查找相食的概率(PrCanT),然后选择一个随机数(random-float),并将其与概率(PrCanT)进行比较。如果随机数小于或等于概率,则小乌龟死亡。好难过!
不幸的是,我的嗜血乌龟行为异常。我遇到了一个问题:
MYSELF没有代理可以参考。
fa 25运行MYSELF时出错
由过程CANNIBALIZE调用
通过过程GO调用
由Button'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
最佳答案
是的,起初self
和myself
令人困惑,但是一旦掌握了这个要诀,这实际上并不难。您需要了解的是,每段NetLogo代码都遇到一个“上下文”。默认情况下,该上下文是观察者,但是某些原语可以引入新的上下文。ask
是引入新上下文的最明显方法:传递给ask
的命令块(由[
和]
分隔)将NetLogo置于乌龟的上下文中。在该上下文中,self
指的是当前乌龟。
但是有时您会在现有的乌龟上下文中引入新的乌龟上下文!在新上下文中,self
更改了含义:现在,它从内部上下文中引用了乌龟。但是,如果您仍然想从外部环境中引用乌龟呢?这就是myself
的目的。
假定cannibalize
是由乌龟运行的过程,则在myself
中使用turtles-here with [bsize > [bsize] of myself]
是正确的:运行with
块的乌龟是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
过程的乌龟都被吃掉了!令人困惑。我可以将过程重命名为get-cannibalized
或切换周围的东西,以便运行该过程的乌龟可以吃东西。 (命名很重要!)关于hashtable - Netlogo::嗜血的食人海龟与自己/自我困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35605580/