Netlogo 如何在不初始化的情况下更新变量

Netlogo 如何在不初始化的情况下更新变量,netlogo,Netlogo,在我上一篇文章之后,我想问一下当我试图更新变量的值时为什么要初始化变量。我正在设法解决这个问题。 我希望做的是通过添加一个小的随机量来更新变量的原始值q=random float 0.1,仅当我将此项添加到邻居的列表中时。 我的预期产出是: 原始属性为0.147 neigh:0的(对象16)(对象16) 更新属性为0.167,随机浮动为0.02 i、 e.在不初始化原始值的情况下: 原始属性为0.147 neigh:0的(对象16)(对象16) 更新属性为0.02,随机浮动为0.02 后者是我当

在我上一篇文章之后,我想问一下当我试图更新变量的值时为什么要初始化变量。我正在设法解决这个问题。 我希望做的是通过添加一个小的随机量来更新变量的原始值
q=random float 0.1
,仅当我将
此项添加到邻居的列表中时。
我的预期产出是:

原始属性为0.147 neigh:0的(对象16)(对象16) 更新属性为0.167,随机浮动为0.02

i、 e.在不初始化原始值的情况下:

原始属性为0.147 neigh:0的(对象16)(对象16) 更新属性为0.02,随机浮动为0.02

后者是我当前的输出,这是错误的

我不知道如何在我的代码中解决这个问题。我仍在努力理解出了什么问题,但我还没有找到解决问题的方法,所以我希望你能帮助我了解更多。 我的代码如下:

       if breed = breed1 [
          set selected people

          hatch-items 1 [
            hide-turtle
            set chosen selected
            set attribute1 random-float 1
            set attribute2 attribute1

            set this-item self
            print (word " attribute1 " attribute1 " attribute2 " attribute2)
            ask myself [
              set my-list fput this-item my-list
            ] ;; close ask myself
         ] ;; close hatch

           ; ADD NEW ITEM TO NEIGHBOURS' LISTS ;
            print (word " Before updating value, attribute1 " attribute1 " attribute2 " attribute2)
            ask link-neighbors with [breed = breed1] [
                   let q random-float 0.1
                   set attribute1 (attribute1 + q)
            print (word " After updating value, attribute1 " attribute1 " attribute2 " attribute2 " q " q)
   ] ;; close ask link-neighbors
] ;; close if
我设置了一些打印功能以查看输出:

  • 第一次打印返回我
    attribute1 0.85和attribute2 0.85

    打印(单词“attribute1”attribute1“attribute2”attribute2)

  • 第二个输出返回me
    attribute10和attribute20

    打印(word“更新值前,属性1”attribute1“attribute2”attribute2)

  • 第三个输出返回me
    attribute1 0 attribute2 0和q 0.08

    打印(更新值后的单词“attribute1”attribute1“attribute2”attribute2“q”q)

发生的情况是,
attribute1
ask链接邻居中初始化,因此我将数量
q
添加到
0
,而不是添加到图案填充中定义的属性的原始值。 你能不能帮我更新一下,不要初始化值


非常感谢

没有初始化任何内容。你的问题是你有两个不同的作用域

在图案填充块中设置的变量“attribute1”属于图案填充代理。“询问链接邻居”块中同名“attribute1”的变量属于链接邻居

所以你的“询问链接邻居”声明

  set attribute1 (attribute1 + q)
要求每个链路邻居将其自己的“attribute1”设置为其自己的attribute1加上q。相反,您需要要求每个链接邻居将其自己的attribute1设置为最近填充的代理变量“attribute1”加上q

如果我们有点符号,而我们没有,你会想要类似的东西

set neigbhor.attribute1  ( hatched_agent.attribute1 + q )
由于ask-link-neighbor代码不在阴影代理的范围内,因此无法使用类似“self”或“imf”的内容来指向该名称的正确变量

解决这个问题的一种方法是定义一个新的全局变量,可能称之为“passed ball”

然后在舱口内你可以

      set passed-ball attribute1
然后在代码块中,你可以说

set attribute1 (passed-ball + q)
或者,您可以使用另一种方法在图案填充块和“询问链接邻居”块之间保留所需的值:“传递的球”,而不是使此传递的球完全全局(这违反了使用尽可能少的全局变量的准则)可能是代理所拥有的变量,该变量在您发布的代码的最顶端引用,关于该变量,您询问的是breed=breed1


我认为hatch代码和ask-link-neights代码都可以看到并隐式引用这个高级代理拥有的名为“passed-ball”的变量。只是不要再将其命名为“attribute1”,否则会有三种不同的“attribute1”含义浮动,更可能的是,您或以后修改代码的人会犯一些错误,并隐式引用错误的代码。

没有初始化任何内容。你的问题是你有两个不同的作用域

在图案填充块中设置的变量“attribute1”属于图案填充代理。“询问链接邻居”块中同名“attribute1”的变量属于链接邻居

所以你的“询问链接邻居”声明

  set attribute1 (attribute1 + q)
要求每个链路邻居将其自己的“attribute1”设置为其自己的attribute1加上q。相反,您需要要求每个链接邻居将其自己的attribute1设置为最近填充的代理变量“attribute1”加上q

如果我们有点符号,而我们没有,你会想要类似的东西

set neigbhor.attribute1  ( hatched_agent.attribute1 + q )
由于ask-link-neighbor代码不在阴影代理的范围内,因此无法使用类似“self”或“imf”的内容来指向该名称的正确变量

解决这个问题的一种方法是定义一个新的全局变量,可能称之为“passed ball”

然后在舱口内你可以

      set passed-ball attribute1
然后在代码块中,你可以说

set attribute1 (passed-ball + q)
或者,您可以使用另一种方法在图案填充块和“询问链接邻居”块之间保留所需的值:“传递的球”,而不是使此传递的球完全全局(这违反了使用尽可能少的全局变量的准则)可能是代理所拥有的变量,该变量在您发布的代码的最顶端引用,关于该变量,您询问的是breed=breed1

我认为hatch代码和ask-link-neights代码都可以看到并隐式引用这个高级代理拥有的名为“passed-ball”的变量。只是不要再将其命名为“attribute1”,否则会有三种不同的“attribute1”含义浮动,更可能的是,您或稍后修改代码的人会犯一些错误,并隐式引用错误的代码