In-radius работает в Netlogo 6.1.0 иначе, чем в предыдущей версии - PullRequest
1 голос
/ 12 июня 2019

У меня есть следующий код, который создает сетку агентов и размещает связи между парами, если они находятся на расстоянии помехи.

breed [ readers reader ]
undirected-link-breed [ rris rri ]

globals [
  interf-rri-radius
  num-readers
  distance-var-x
  distance-var-y
  readers-per-row
  readers-per-column
  num-checkouts
]


to setup
  ca
  setup-globals
  ask patches [ set pcolor blue - 3 ]
  spawn-by-row-col
  reset-ticks
end

to setup-globals
  set  interf-rri-radius 1005
  set num-readers 40
  set distance-var-x 12
  set distance-var-y 22
  set readers-per-row 8
  set readers-per-column 5
  set num-checkouts 0
end

to spawn-by-row-col
  let half-step 0.5 * distance-var-x
  let d-vals ( range ( min-pxcor + half-step ) ( min-pxcor + (readers-per-row * distance-var-x)) distance-var-x )

  let dc-vals ( range ( min-pxcor + half-step ) ( min-pycor + (readers-per-column * distance-var-y)) distance-var-y )
  show dc-vals
  ; Create an empty list to build into
  let possible-coords []

  ; For each possible vertical value, map all horizontal values in order and
  ; combine these into an ordered list starting at the lowest px and py coords

  foreach dc-vals [
    d ->
    set possible-coords ( sentence possible-coords map [ i -> (list i d) ] d-vals )
  ]

  show (word "possible-coords = " possible-coords)
  ; Use the number of readers to sublist the possible coordinates, and
  ; create a turtle at each of the coordinate combinations left.
  let max-positions length possible-coords
  if max-positions > (num-readers + num-checkouts) [ set max-positions (num-readers + num-checkouts) ]
  let use-coords sublist possible-coords num-checkouts max-positions
  foreach use-coords [
    coords ->
    create-readers 1 [
      setxy item 0 coords item 1 coords
      set shape "square 2"
      set size 2
      set color 15
    ]
  ]
  ask readers [ create-rris-with other readers in-radius (interf-rri-radius / 10) ]
end

Соседи считывателя 0:

show [sort [who] of rri-neighbors] of reader 0
[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39]

Однако расстояние между считывателем 0 и считывателем 39 составляет

show [distance reader 0] of reader 39
121.6552506059644

, а радиус соединения равен 1005/10 = 100,5, поэтому их не следует соединять с помощью связи rri.

Обратите внимание , я использую ориентированный на происхождение мир от -50 до 50 в измерениях X и Y.

Я тестировал код в предыдущей версии Netlogo 6.0.4и читатель 39 не является соседом читателя 0. Я не знаю, в чем может быть проблема.Я считаю, что это новая версия, но я хотел бы быть уверен.

1 Ответ

2 голосов
/ 14 июня 2019

В случае, если кто-то еще столкнется с этим, в версии NetLogo 6.1.0 есть подтвержденная ошибка с in-radius, а подробности в отчете об ошибках на GitHub .

Эта проблема влияет только на in-radius при использовании в неупакованном мире и только при использовании на черепахах и только при использовании с радиусом, который составляет значительный% от ширины мира.Если вы используете мир с переносом, или in-radius с патчами, или используете маленький радиус по отношению к размеру мира, ваши данные будут правильными, и вам не нужно обходное решение ниже.

В качестве обходного пути, если ваша модель подвержена уязвимости, вы можете использовать простую определяемую пользователем процедуру NetLogo в вашей модели до публикации исправления.Это не будет супер-быстрым, если ваши черепахи вычисляют in-radius много раз за тик, но если у вас мало черепах или вы просто используете их во время настройки, все должно быть в порядке:

to-report temp-in-radius [agentset r]
  report agentset with [ distance myself <= r ]
end

Тогдавместо create-rris-with other readers in-radius (interf-rri-radius / 10) вы бы сделали create-rris-with (temp-in-radius other readers (interf-rri-radius / 10)).

Или, в общем, вместо чего-то вроде count other turtles in-radius 5 станет count temp-in-radius (other turtles) 5.

...