Использование «я» для изменения переменных - PullRequest
0 голосов
/ 11 июня 2018

У меня есть 200 черепах, которые могут быть либо отправителями, либо получателями сообщений и связаны друг с другом в случайной сети.Я прошу получателей выяснить, есть ли к ним подключенные отправители, и если да, то значение их знаний, представляющее собой набор из 3 значений, относящихся к 3 элементам, обновляется с добавлением значения знаний о соседе.

проблемаis 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

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Если вы должны сделать это таким образом, вот один из вариантов.При такой настройке:

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
0 голосов
/ 11 июня 2018

Проблема не в myself.Проблема в том, что вы пытаетесь set значение в list, тогда как set используется для переменных.Взгляните на replace-item.

И вам нужно сделать что-то вроде ask myself set ....

...