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

В моей программе каждая черепаха (а именно глюкоза и бактерия) имеет собственную переменную, называемую массой. Процедура установки гласит, что исходная масса глюкозы и бактерий составляет 1 ммоль. Процедура to-go говорит о том, что глюкоза будет гидролизована и разделена. Таким образом, глюкоза_масса будет отличаться от исходного 1 ммоль. Процедура to-go для бактерий говорит, что, когда бактерии съедают одну глюкозу, масса бактерий будет расти от начального 1 ммоль плюс масса глюкозы (стохастическое число, определяемое в процедуре todivide_hydrolyzed_glucose), которую они потребляют раз в год. фиксированное число (например, 0,3). Я попытался использовать команду «от себя», чтобы включить переменную другой черепахи в бактериальную черепаху. Тем не менее, это дает мне сообщение об ошибке, говорящее, что «OF ожидал, что этот ввод будет блоком репортера, но вместо этого получил переменную или что-то еще».

Есть замечания или предложения по этому вопросу?

Breed [glucose a-glucose];; Food
Breed [bacteria a-bacteria] ;; Predator

glucose-own [glucose_mass] 
Bacteria-own [Bacteria_mass]

установить

;;;ГЛЮКОЗА;;;

 set-default-shape glucose "circle"
  Create-glucose (8) ;; Create the glucose available in mmol/d, 
  [set glucose_mass (1) ;; in mmol
  ]

;;; БАКТЕРИИ;;;

Create-Bacteria (8) ;; Create the clostridiales in mmol
[set Batceria_mass (1)
]
end

to go

ask glucose
 [
Hydrolyse_glucose
Divide_hydrolyzed_glucose
 ]

  ask Bacteria
 [ Bacteria_eat_glucose]

to hydrolyse_glucose
  if (glucose_mass < 200) [
   set glucose_mass ((glucose_mass * 0.025 + random-float 32.975) / 24)
  ]
end

to divide_hydrolyzed_glucose
   if (glucose_mass > 1)
   [
    set glucose_mass (glucose_mass / 2)
    hatch 1
 ]
end

to Bacteria_eat_glucose
let prey one-of glucose-here
if prey != nobody
[ask prey [die]
  set Bacteria_mass (Bacteria_mass + ((glucose_mass of myself) * 0.3))
]
end

person V. Alvarado    schedule 26.03.2018    source источник


Ответы (1)


Поначалу сообщение об ошибке может показаться трудным для интерпретации, но оно говорит вам, что именно не так: примитиву of нужен блок репортера, но вместо этого вы дали ему переменную.

Итак, вам понадобится:

[ glucose_mass ] of myself

Квадратные скобки сообщают NetLogo, что glucose_mass следует заключить в «блок репортера», то есть то, что можно запустить в другом контексте (в этом случае [ glucose_mass ] будет выполняться в контексте myself).

Однако при более внимательном рассмотрении кода кажется, что myself — это не то, что вам нужно. Примитив myself используется для обращения к агенту из "внешнего "контекст... когда он есть, чего здесь нет.

Я бы посоветовал вам изменить структуру вашей Bacteria_eat_glucose процедуры следующим образом:

to Bacteria_eat_glucose
  let prey one-of glucose-here
  if prey != nobody [
    set Bacteria_mass Bacteria_mass + [ glucose_mass * 0.3 ] of prey
    ask prey [ die ]
  ]
end

Несколько вещей, на которые стоит обратить внимание:

  • myself заменено на prey;
  • блок репортера по-прежнему заключен в квадратные скобки;
  • Я поместил * 0.3 в блок репортера, потому что его легче читать, но [ glucose_mass ] of prey * 0.3 было бы так же хорошо;
  • Строка set Bacteria_mass ... должна появиться до того, как жертва умрет, иначе glucose_mass жертвы больше не будет доступна.
person Nicolas Payette    schedule 26.03.2018
comment
Большое спасибо за ответ Николай. Тем не менее, я попробовал ваше предложение, и появилась новая ошибка, в которой говорилось, что нет агента, на который я мог бы сослаться. Есть ли у вас какие-либо дополнительные советы? Спасибо! - person V. Alvarado; 26.03.2018
comment
Ты прав; Я не обратил внимания на общую картину. Я отредактировал свой ответ. - person Nicolas Payette; 26.03.2018