使用 "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