В моей модели черепах есть два пола, и есть две потенциальные стратегии "0" и "1".Самки подсчитывают количество самцов в заданном радиусе и выбирают из этого пула исходя из своих стратегий.
У самок есть предел их пула потенциальных партнеров, и они перебирают этот пул, чтобы выбрать самцов в соответствии со своей стратегией.Это все в процедуре to-choose
.
Одна проблема, на которую обратил внимание коллега, заключается в том, что следующую строку кода следует обновлять каждый раз, когда женщина выбирает другого партнера, чтобы пропорция отражала оставшихся потенциальных партнеров, а не n-max
, который был установлен внепетли.
set prop_B ( count availa-males with [ strategy = 0 ] ) / n-max
Для ясности сформулировать проблему, если n-max
равен 5, а женщина устанавливает prop_B
, используя это значение для первого помощника, а затем в следующей итерациицикла n-max
должно быть устаревшим на 1, потому что осталось только 4 мужчины.
Так что это должно быть что-то вроде: set prop_B ( count availa-males with [ strategy = 0 ] ) / (n-max - count mates-already-chosen)
Пожалуйста, посмотрите ниже для рабочего примера модели,Надеюсь, вы можете помочь.
turtles-own [sex availa-males mates mate-count max-mate-count strategy n-max prop_B proba_B]
breed [males male]
breed [females female]
to setup
clear-all
create-males 50
create-females 1
ask turtles [
setxy random-xcor random-ycor
ifelse random 2 = 1 [set strategy 1] [set strategy 0]
]
ask males [set color red]
ask females [set color blue]
reset-ticks
end
to go
ask males [
; fd 1
]
ask turtles [
set mates ( turtle-set )
]
ask females [choose]
tick
end
to choose
; set a cap on possible mates for females; 5, or the number
; available within the radius if less than 5
set availa-males males in-radius 5
set n-max count availa-males
set max-mate-count ifelse-value ( n-max < 5 ) [ n-max ] [ 5 ] ; 5 5
; Until a female has chosen up to her maximum number of mates:
while [ mate-count < max-mate-count ]
[; determine which available males are not already in her 'mates' agentset
set availa-males availa-males with [ not member? self [mates] of myself ]
; assess the proportion of the '0' strategy in remaining available males
set prop_B ( count availa-males with [ strategy = 0 ] ) / n-max
; example probability choice, just meant to choose '0 strategy' males
; with a frequency disproportionate to availability
set proba_B ifelse-value ( prop_B <= 0.1 ) [ 0.8 ] [ 0.2 ]
; use a random float to determine which strategy type is chosen
set mates ( turtle-set mates
ifelse-value ( random-float 1 < proba_B )
[ one-of availa-males with [ strategy = 0] ]
[ one-of availa-males with [ strategy = 1]] )
; count the current mates to break the while loop once
; the maximum number of mates is reached
set mate-count count mates
]
; have the female's males add her to their own mates agentset
ask mates [ set mates ( turtle-set mates myself ) ]
if n-max < count mates [ print "Fewer available males than mates" ]
end