Этот пример может приблизиться к тому, к чему вы стремитесь, но, очевидно, его необходимо адаптировать к этой игрушечной версии.Эта установка дает 75% мужчин со стратегией A, а остальные - стратегией B, и дает всем черепахам пустой набор агентов для начала:
breed [ males male ]
breed [ females female ]
turtles-own [ mates ]
males-own [ strategy ]
females-own [ max-mate-count mate-count ]
to setup
ca
ask n-of 200 patches [
sprout-males 1 [
ifelse random-float 1 < 0.75 [
set strategy "A"
set color orange
] [
set strategy "B"
set color violet
]
]
]
ask n-of 50 patches with [ not any? turtles-here ] [
sprout-females 1 [
set color green
]
]
ask turtles [
set mates ( turtle-set )
]
reset-ticks
end
Используйте цикл while, чтобы каждая самка итеративно оценивалапропорции стратегии мужчин, доступных ей, затем добавьте их в свой список "друзей".Более подробно в комментариях:
to choose-mates
ask females [
; set a cap on possible mates for females; 5, or the number
; available within the radius if less than 5
let availa-males males in-radius 10
let n-max count availa-males
set max-mate-count ifelse-value ( n-max < 5 ) [ n-max ] [ 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 B strategy in remaining available males
let prop_B ( count availa-males with [ strategy = "B" ] ) / n-max
; example probability choice, just meant to choose B males
; with a frequency disproportionate to availability
let proba_B ifelse-value ( prop_b * 2 < 0.6 ) [ prop_b * 2 ] [ 0.6 ]
; 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 = "B" ] ]
[ one-of availa-males with [ strategy = "A" ] ] )
; 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 )
]
]
end
Чтобы проверить, что самцы "B" выбираются непропорционально их доступности:
to check-values
let all-mates map [ i -> [strategy] of i ] [mates] of females
print word "Average proportion of 'B' mates chosen: " mean map b-proportion all-mates
print word "Actual proportion of 'B' males: " ( ( count males with [ strategy = "B" ] ) / count males )
end
to-report b-proportion [ input_list ]
let tot length input_list
let nb length filter [ i -> i = "B" ] input_list
report nb / tot
end
Я не уверен на 100%, что это то, что вы "После - возможно, вы можете использовать пакет rnd
для очистки цикла.
Редактировать в ответ на комментарий
Если вы измените конец `выберите-пары, например, так:
...
...
; 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
А ваш go
выглядит так:
to go
choose-mates
end
Вы можете запускать setup
и go
столько раз, сколько хотите, и вам следуетникогда не видеть распечатку "Меньше доступных мужчин, чем партнеров":
to repeat-1000
repeat 1000 [
setup
go
]
end
Я запускал это несколько раз и никогда не считал availa-males
меньше, чем счет mates
.Однако, если вы добавляете движение, не позволяя females
сбросить их mates
агентский набор, вы начинаете его видеть - например, попробуйте запустить его несколько раз:
to go
choose-mates
ask turtles [ fd 1 ]
end
Сейчас, потому чтоЧерепахи движутся, у вас есть несколько случаев, когда females
удерживали своих партнеров из предыдущего вызова функции, а затем перемещались в пространство, где было меньше availa-males
.Быстрое и простое решение состоит в том, чтобы женщины каждый раз очищали своих партнеров.От того, где вы это делаете, зависит цель вашей модели (как часто женщины выбирают партнеров? Они забывают только некоторые из своих предыдущих? И т. Д.), Но вот очень простой способ:
to go
ask turtles [ set mates ( turtle-set ) ]
choose-mates
ask turtles [ fd 1 ]
end
Теперь вы можете запуститьстолько раз, сколько захотите и не должны видеть распечатку «Меньше доступных мужчин, чем партнеров».