Как случайным образом изменять цвета патчей NetLogo

#colors #netlogo

#Цвет #netlogo

Вопрос:

Мои патчи инициализируются как зеленые (65), черные (0) или случайные базовые цвета. Каждые 5 тиков я хотел бы, чтобы зеленые менялись на случайный базовый цвет, черные оставались черными, а случайные цвета ЛИБО становились зелеными (65), либо менялись на другой случайный цвет (один из 55 базовых цветов).).

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

Я попробовал ifelse и просто разные операторы if, указав, что попросите n патчей somenumber стать зелеными, а остальные — случайным цветом. Это не сработало.

 to setup-patches  ;;PATCHES
  ask n-of 400 patches [ set pcolor 65]
  ask n-of 600 patches [ set pcolor one-of remove 55 base-colors ]
end
  

……

 to vary-patches
  if ticks > 0 and ticks mod 5 = 0 [ 
    ask patches [ 
      if pcolor = 65 [
        set pcolor one-of remove 55 base-colors ]
      if pcolor = black [
        set pcolor 0 ]
     if pcolor = one-of remove 65 base-colors [
        set pcolor ............................................. ]
end
  

Ответ №1:

Я думаю, что вы более или менее там, это просто if pcolor = one-of remove 65 base-colors проблематично. Каждый раз, когда этот оператор вычисляется, pcolor сравнивается со случайным one-of списком, сгенерированным remove 65 base-colors — он не проверяет, находится ли pcolor в этой группе. Для этого вам нужен member? примитив. Например, небольшая модификация ниже должна делать то, что вам нужно:

 to setup-patches  ;;PATCHES
  ca
  ask n-of 400 patches [ set pcolor 65]
  ask n-of 600 patches [ set pcolor one-of remove 55 base-colors ]
  reset-ticks
end

to vary-patches
  if ticks > 0 and ticks mod 5 = 0 [ 
    ask patches [ 
      if pcolor = 65 [
        set pcolor one-of remove 55 base-colors ]
     if member? pcolor remove 65 base-colors [
        set pcolor one-of base-colors
      ]
    ]
  ]
  tick
end
  

Редактировать:

 to vary-patches
  if ticks > 0 and ticks mod 5 = 0 [
    ask patches [
      ifelse pcolor = 65 [
        set pcolor one-of remove 55 base-colors 
      ] [
        if member? pcolor remove 65 base-colors [
          ifelse random-float 1 < ( 1 / 3 ) [
            set pcolor one-of base-colors
          ] [
            set pcolor 65
          ]
        ]
      ]
    ]
  ]
  tick
end
  

Комментарии:

1. Спасибо, Люк. Я не знал о примитиве member, и ваше применение его здесь имеет смысл. Однако мне все еще нужно больше зеленого! Идея в том, что мы изменим настройку участника? pcolor base-окрашивает патчи в 1. другой базовый цвет ИЛИ 2. зеленый (65). Надеюсь, мы могли бы сделать что-то вроде 1/3 или 1/2 из них зелеными… в конце концов, зеленого должно быть больше, чем любого другого цвета. Имеет смысл?

2. @MelonieRichey — Вы можете изменить код после if member? инструкции по мере необходимости — например, см. Отредактированное дополнение к моему ответу, которое использует random-float , чтобы определить, станет ли патч случайного цвета зеленым или другим базовым цветом.

3. Красивые. Большое спасибо!