у меня странная проблема в netlogo с оператором ifelse - PullRequest
1 голос
/ 01 декабря 2019

Я спрашиваю о проблеме с сетевым логотипом, поскольку я делаю проект в нем. Я делаю имитацию стека, но когда я пытался внедрить другие поведения, используя операторы ifelse, но когда я помещал в них оператор ifelse, они не следовали никаким поведениям, а просто двигались.

Воткод:

breed [Birds Bird] breed [Hawks Hawk]

to Setup   clear-all   reset-ticks   create-Birds Number_of_Birds[
    setxy random-xcor random-ycor]   create-Hawks Number_of_Hawks[
    setxy random-xcor random-ycor] end

 to Start   ask Birds[
    set color white
    ifelse (Hawks in-radius Reaction_Distance = 0)
    [
      set heading Migration_Direction
      let closest-Birds max-n-of Target_Group_Size (other Birds) [distance myself]
      let Group_Heading mean [heading] of closest-Birds
      let centroidx mean [xcor] of closest-Birds
      let centroidy mean [ycor] of closest-Birds
      set heading (Migration_Direction +( attraction * (Group_Heading)))
      fd 1
      set heading ( attraction * (towardsxy centroidx centroidy) )
      fd 1
    ]
    [
      let Closest_Hawks max-n-of 1 (Hawks) [distance myself]
      set heading (mean [heading] of Closest_Hawks + 180)
      fd 1
    ]   ] end

1 Ответ

3 голосов
/ 02 декабря 2019

Давайте посмотрим на определение in-radius в словаре NetLogo:

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

В нем говорится, что in-radius сообщает об наборе агентов .

Теперь давайте посмотрим на ваш ifelseусловие:

ifelse (Hawks in-radius Reaction_Distance = 0)

Определение говорит нам, что часть Hawks in-radius Reaction_Distance сообщает набор агентов (то есть всех ястребов, находящихся в радиусе). Затем знак = сравнивает этот набор агентов с числом 0. Но набор агентов - это не число! Он никогда не может быть равен нулю.

Я полагаю, что вы хотите сравнить число ястребов в радиусе с числом 0.

Один из способов сделать это - использовать примитив count, который сообщает о количестве агентов в наборе агентов:

ifelse (count Hawks in-radius Reaction_Distance = 0)

Это будет работать, ноЯ бы так не писал. NetLogo имеет гораздо более приятный any? примитив, который вы можете использовать следующим образом:

ifelse (not any? Hawks in-radius Reaction_Distance)

Это выражает ваши намерения гораздо яснее.

Вы можететакже измените порядок пунктов ifelse, чтобы избежать not:

ifelse (any? Hawks in-radius Reaction_Distance)
[
  ; get away from hawks...
]
[
  ; flock normally...
] 
...