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”含义浮动,更可能的是,您或稍后修改代码的人会犯一些错误,并隐式引用错误的代码