Как ограничить количество «съеденной» хищником добычи и пересчитать остатки?

В моей программе каждая черепаха (а именно глюкоза и бактерия) имеет собственную переменную, называемую массой. Процедура установки гласит, что исходная масса глюкозы и бактерий составляет 1 ммоль. Процедура to-go говорит о том, что глюкоза будет гидролизована и разделена. Таким образом, глюкоза_масса будет отличаться от исходного 1 ммоль. Процедура to-go для бактерий гласит, что когда бактерии съедают одну глюкозу, то масса бактерий будет расти от начального 1 ммоль плюс масса глюкозы (стохастическое число, определяемое в процедуре todivide_hydrolyzed_glucose), которую они потребили раз в год. фиксированное число (например, 0,3). Как я могу ограничить глюкозу_массу, которую бактерии могут потреблять (максимальная скорость поглощения) за каждый тик? (1 тик = 1 час) И как установить оставшуюся глюкозу_массы добычи? Например, если бактерии могут потреблять (поглощать) только 0,0207 ммоль глюкозы/час, но масса гидролизованной глюкозы составляет 0,6 ммоль; тогда бактерии могут использовать только 0,0207 массы глюкозы. Оставшаяся масса глюкозы должна быть пересчитана как (0,6 – 0,0207). Я использую примитивное «я» для обозначения агента из «внешнего» контекста — в данном случае «внешним» агентом являются бактерии. Однако ошибка говорит, что «Нет агента, к которому я мог бы обратиться».

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

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

glucose-own [glucose_mass] 
Bacteria-own [bacteria_mass uptake]

настроить
;;;ГЛЮКОЗУ;;;

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

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

Create-Bacteria (10) ;; Create the clostridiales in mmol
  [set batceria_mass (1)
   Set uptake (0.0207)
  ]
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
  [ 
    ifelse [glucose_mass] of prey > [ uptake ] of myself
    [
      set bacteria_mass bacteria_mass + [[ uptake] of myself * 0.3]
      ask prey [set glucose_mass glucose_mass – [uptake] of myself]
    ]
    [
      set bacteria_mass bacteria_mass + [glucose_mass * 0.3] of prey
      ask prey [die]
    ]
  ]

end

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


Ответы (1)


Как правило, вы можете использовать функции min и max для такого рода ограничений. Отсутствие ссылки на myself - отдельная проблема.

Что касается ограничения, то самый ясный способ — создать временную переменную (названную ниже «еда»), которая представляет собой количество, которое нужно скорректировать.

Проблема myself кажется (не тестировалась), потому что бактерии - это агенты, которые фактически запускают код. То есть нет никакого «внешнего» контекста. Вы оперируете set командами непосредственно с переменными бактериального агента. Внешний контекст был бы только в том случае, если бы бактерии попросили жертву что-то сделать, а затем жертве нужно было бы получить доступ к некоторой переменной, принадлежащей бактериям.

Если моя интерпретация верна, вы просто ссылаетесь на bacteria_mass, а не на [bacteria_mass] of myself.

to Bacteria_eat_glucose
  let prey one-of glucose-here
  if prey != nobody
  [ 
    ifelse [glucose_mass] of prey > uptake
    [ let food min (list uptake [glucose_mass] of prey)
      set bacteria_mass bacteria_mass + food * 0.3
      ask prey [set glucose_mass glucose_mass – 0.3]
    ]
    [
      set bacteria_mass bacteria_mass + [glucose_mass * 0.3] of prey
      ask prey [die]
    ]
  ]

end
person JenB    schedule 18.07.2018
comment
Уважаемый JenB, большое спасибо за ваш ответ. Я попробовал ваше предложение, но выскочили две проблемы: 1. для строки кода: пусть пища мин поглощает [глюкоза_масса] добычи, ошибка заключалась в том, что она ожидала команду. Затем я удалил [глюкоза_масса] жертвы из той же строки кода, но проблема заключалась в том, что MIN ожидал, что ввод будет списком, но вместо этого получил число 0,0207, которое является предельным числом для поглощения. Есть ли у вас какие-либо дополнительные предложения? - person V. Alvarado; 19.07.2018
comment
извините, у меня был неправильный формат. Попробуй это сейчас. Общая форма минимума — min (list val1 val2 val3....), на которую я ее изменил. Поскольку есть только два числа, вы также можете сделать min [val1 val2] - person JenB; 19.07.2018
comment
нет проблем. Обратите внимание, что я не применяла логику повсюду. Например, вам нужно будет изменить строку ask prey [set glucose_mass glucose_mass – 0.3] на ask prey [set glucose_mass glucose_mass – food] и любые другие подобные изменения. - person JenB; 19.07.2018