使用 "myself" 改变变量
Using "myself" to change variables
我有 200 只海龟,它们可以是消息的发送者或接收者,并且在随机网络中相互连接。我要求接收者查看是否有发送者连接到他们,如果有,他们的知识值是一个包含 3 个值的集合,关于 3 个项目将更新为添加到他们的邻居的知识值。
问题是 myself
可以很容易地用于分配给一个变量,但在我的情况下,它不能用于更改预定义集中的项目,因为我遇到了一个错误,说这是不是我可以使用的东西!
有什么建议吗?
谢谢
Turtles-own [
knowledgeValue
receiver?
sender?
]
;Network is already constructed and turtles are connected.
to go
ask turtles [
set knowledgeValue []
]
ask turtles [
repeat 3 [
set knowledgeValue lput random-float 1 knowledgeValue
]
]
ask turtles with [receiver?] [
ask (turtles-on neighbors) with [sender?] [
; the knowledge of receiver gets updated
set [item 0 [knowledgeValue]] of myself [item 0 [knowledgeValue]] of myself + knowledgeValue
]
]
end
问题不在于myself
。问题是您正在尝试 set
list
中的值,而 set
用于变量。请改为查看 replace-item
。
而且你需要做类似 ask myself set ....
的事情
如果您必须这样做,这里有一个选项。使用此设置:
turtles-own [
knowledgeValue
receiver?
sender?
]
to setup
ca
resize-world -3 3 -3 3
set-patch-size 70
ask patches [
sprout 1 [
set receiver? false
set sender? false
ifelse random-float 1 > 0.5 [
set receiver? true
set color green
set knowledgeValue [0 0 0]
] [
set sender? true
set color red
set knowledgeValue []
repeat 3 [
set knowledgeValue lput random-float 1 knowledgeValue
]
]
]
]
reset-ticks
end
这会生成一个世界,其中所有 receivers
都以 [0 0 0]
作为他们的 knowledgeValue
列表(以证明 senders
是增加价值的)。现在,让所有接收者让他们的邻居 sender?
到 ask
请求接收者更新该接收者的列表。我不太喜欢这个解决方案,但它在某种程度上是从您概述的相同方法来解决问题的。
to option-1
ask turtles with [ receiver? ] [
; ask senders to ask 'myself' (receiver)
ask ( turtles-on neighbors ) with [sender?] [
ask myself [
; note that the second myself (below) actually refers to the 'sender'
set knowledgeValue replace-item 0 knowledgeValue ( item 0 knowledgeValue + item 0 [knowledgeValue] of myself)
]
]
]
end
一种替代方法是简单地求和所需的值并直接将它们相加:
to option-2
ask turtles with [ receiver? ] [
let my-senders ( turtles-on neighbors ) with [ sender? ]
if any? my-senders [
; get the sum of their item 0 knowledgeValue
let to-add sum [ item 0 knowledgeValue ] of my-senders
; add it to the knowledgeValue
set knowledgeValue replace-item 0 knowledgeValue ( item 0 knowledgeValue + to-add )
]
]
end
我有 200 只海龟,它们可以是消息的发送者或接收者,并且在随机网络中相互连接。我要求接收者查看是否有发送者连接到他们,如果有,他们的知识值是一个包含 3 个值的集合,关于 3 个项目将更新为添加到他们的邻居的知识值。
问题是 myself
可以很容易地用于分配给一个变量,但在我的情况下,它不能用于更改预定义集中的项目,因为我遇到了一个错误,说这是不是我可以使用的东西!
有什么建议吗?
谢谢
Turtles-own [
knowledgeValue
receiver?
sender?
]
;Network is already constructed and turtles are connected.
to go
ask turtles [
set knowledgeValue []
]
ask turtles [
repeat 3 [
set knowledgeValue lput random-float 1 knowledgeValue
]
]
ask turtles with [receiver?] [
ask (turtles-on neighbors) with [sender?] [
; the knowledge of receiver gets updated
set [item 0 [knowledgeValue]] of myself [item 0 [knowledgeValue]] of myself + knowledgeValue
]
]
end
问题不在于myself
。问题是您正在尝试 set
list
中的值,而 set
用于变量。请改为查看 replace-item
。
而且你需要做类似 ask myself set ....
如果您必须这样做,这里有一个选项。使用此设置:
turtles-own [
knowledgeValue
receiver?
sender?
]
to setup
ca
resize-world -3 3 -3 3
set-patch-size 70
ask patches [
sprout 1 [
set receiver? false
set sender? false
ifelse random-float 1 > 0.5 [
set receiver? true
set color green
set knowledgeValue [0 0 0]
] [
set sender? true
set color red
set knowledgeValue []
repeat 3 [
set knowledgeValue lput random-float 1 knowledgeValue
]
]
]
]
reset-ticks
end
这会生成一个世界,其中所有 receivers
都以 [0 0 0]
作为他们的 knowledgeValue
列表(以证明 senders
是增加价值的)。现在,让所有接收者让他们的邻居 sender?
到 ask
请求接收者更新该接收者的列表。我不太喜欢这个解决方案,但它在某种程度上是从您概述的相同方法来解决问题的。
to option-1
ask turtles with [ receiver? ] [
; ask senders to ask 'myself' (receiver)
ask ( turtles-on neighbors ) with [sender?] [
ask myself [
; note that the second myself (below) actually refers to the 'sender'
set knowledgeValue replace-item 0 knowledgeValue ( item 0 knowledgeValue + item 0 [knowledgeValue] of myself)
]
]
]
end
一种替代方法是简单地求和所需的值并直接将它们相加:
to option-2
ask turtles with [ receiver? ] [
let my-senders ( turtles-on neighbors ) with [ sender? ]
if any? my-senders [
; get the sum of their item 0 knowledgeValue
let to-add sum [ item 0 knowledgeValue ] of my-senders
; add it to the knowledgeValue
set knowledgeValue replace-item 0 knowledgeValue ( item 0 knowledgeValue + to-add )
]
]
end