Netlogo: заставить черепаху взаимодействовать с другим человеком после оценки сходства по заданной переменной - PullRequest
1 голос
/ 05 апреля 2019

У меня есть несколько черепах, каждая из которых имеет три переменных: мнение1, мнение2 и мнение3.Мне нужно, чтобы они:

  1. идентифицировали, какая из этих трех переменных имеет наибольшее значение
  2. , чтобы найти другую черепаху в своей сети со значением, по крайней мере, таким же, как значение, найденное в 1.
  3. обновить свое собственное значение, найденное в 1., относительно значения черепахи, найденного в 2.

То, что я сделал, на самом деле не работает, потому что оно только обновляет, глядя на o1не смотря на то, какое дерево (мнение1, мнение2 или мнение3) является самым высоким, а затем ищет соседа.

to update-opinion
  ask turtles [
    let my-nearby-turtles nw:turtles-in-radius 1
    let my-opinion1 opinion1
    set neighbour one-of my-nearby-turtles with [ opinion1 > my-opinion1 ]
    if neighbour != nobody [
      let opinion_n [opinion1] of neighbour
        set opinion1 ((opinion1 + opinion_n) / (2))
    ]
  ]
end

1 Ответ

1 голос
/ 07 апреля 2019

Я не знаю простого способа сделать это с уникальными переменными, такими как opinion1 и т. Д., Но, возможно, будет иметь список мнений вместо отдельных переменных для каждого мнения.Например, с этой настройкой:

extensions [ nw ]

turtles-own [ 
  opinions
]

to setup
  ca
  resize-world -5 5 -5 5
  set-patch-size 30
  crt 30 [
    set shape "dot"
    set opinions n-values 3 [ precision random-float 10 2]
    set color scale-color blue sum opinions -5 35
    while [ any? other turtles-here ] [
      move-to one-of neighbors4
    ]
  ]
  ask turtles [
    create-links-with turtles-on neighbors4
  ]
  reset-ticks
end

Вы получите что-то вроде этого:

enter image description here

Где у каждой черепахи есть opinions Переменная списка длиной три элемента.Теперь вы можете сделать так, чтобы каждая черепаха определяла свое наибольшее значение мнения, используя max, получая положение индекса максимального значения в списке, используя position, а затем запрашивала соседей этой черепахи, чтобы увидеть, имеют ли какие-либо из них более высокое значение в том же самомпозиция индекса.Если они это сделают, измените список запрашиваемых черепах opinions, используя replace-item, чтобы получить среднее значение для двух значений:

to go
  ask turtles [
    ; Get adjacent turtles
    let my-nearby-turtles nw:turtles-in-radius 1

    ; Identify the highest highest value variable of 
    ; the current turtle, and get its list position
    let my-opinion max opinions
    let my-op-ind position my-opinion opinions

    ; Pick one of the turtles whose value in the same indexed
    ; position is higher than my-opinion
    let influence one-of my-nearby-turtles with [ 
      item my-op-ind opinions > my-opinion
    ]

    ; If that turtle exists, update my own opinions list as appropriate
    if influence != nobody [
      let new-opinion  precision ( 
        ( [ item my-op-ind opinions ] of influence + my-opinion ) / 2
      ) 2
      set opinions replace-item my-op-ind opinions new-opinion
    ]
    set color scale-color blue sum opinions -5 35
  ]
  tick
end

Надеюсь, что это на правильном пути, но не уверен, что список будетработать на то, что вам нужно.Если вы должны иметь переменные в качестве отдельных значений на каждом тике, я полагаю, что вы можете преобразовать их в список, а затем выполнить процедуру, описанную выше.Если они нужны только для вывода, вы можете просто обновить свои уникальные переменные по мере необходимости на основе значений в списке (если вы соответствуете порядку).

...