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

最佳答案

是的,起初selfmyself令人困惑,但是一旦掌握了这个要诀,这实际上并不难。您需要了解的是,每段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/

10-10 14:54