Вложенные запросы if в контексте исправления NetLogo - PullRequest
0 голосов
/ 28 мая 2020

Я хочу изменить цвет пятен на зеленый при следующих условиях:

-Если в одном столбце есть два любых синих пятна, и их расстояние меньше 25 И

-если там любые желтые пятна в том же столбце и между этими выбранными синими пятнами

-Затем измените цвет всех участков, удовлетворяющих этим условиям, на зеленый.

Я изо всех сил пытаюсь сделать это в NetLo go, пытался использовать вложенный l oop, но не смог найти способ. Спасибо за любую помощь. И я добавил образец изображения, которого хочу достичь, и отметил пример синих пятен.

enter image description here

В качестве дополнения, чтобы показать, что я хочу сделать в код (извините за код):

     if any? patches with [pcolor = blue and
      (if any? patches with [pcolor = blue and pycor = ?(selected_first_blue's_pycor)
        if any? patches with [pcolor = yellow and pycor < ??(selected_first_blue's_pycor) and pycor > ?(selected_second_blue's_pycor)))
    [ask patches [set pcolor green]]

1 Ответ

2 голосов
/ 28 мая 2020

Как вы к этому подходите, вам нужны довольно запутанные утверждения вроде:

let upper-blues patches with [color = blue and
   any? other patches with [color = blue and pxcor = [pxcor] of myself
        and pycor < [pycor] of myself and pycor > [pycor] of myself - 25]

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

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

to setup
  clear-all
  ask patches [set pcolor white]
  ask n-of 100 patches [set pcolor blue]
  ask n-of 100 patches [set pcolor yellow]
end

to convert-to-green
  let turn-green nobody
  ask patches
  [ let my-column patches with [pxcor = [pxcor] of myself]
    let above-yellow min-one-of my-column with [pcolor = yellow and pycor >= [pycor] of myself][pycor]
    let above-blue ifelse-value (above-yellow != nobody) [min-one-of my-column with [pcolor = blue and pycor > [pycor] of above-yellow][pycor]][nobody]
    let below-yellow max-one-of my-column with [pcolor = yellow and pycor <= [pycor] of myself][pycor]
    let below-blue ifelse-value (below-yellow != nobody) [max-one-of my-column with [pcolor = blue and pycor < [pycor] of below-yellow][pycor]][nobody]
    if above-blue != nobody and below-blue != nobody and ([pycor] of above-blue - [pycor] of below-blue < 25)
    [ set turn-green (patch-set self turn-green)
    ]
  ]
  ask turn-green [sprout 1 [set color red]]
end

Как только вы убедитесь, что он работает правильно, измените ask turn-green [sprout 1 [set color red]] на ask turn-green [set pcolor green].

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

...