Как выбрать максимальное количество черепах с помощью выбора колеса рулетки - PullRequest
0 голосов
/ 05 июня 2018

В моей модели у черепах есть два пола, где у мужчин есть две потенциальные тактики.Самки подсчитывают количество самцов в заданном радиусе.

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

У меня уже есть код вероятности выбора из мужчин (matingPoolProbAnad и matingPoolProbRes), но я не знаю, как его реализовать, хотя расширение rnd кажется правильнымконкретно rnd:weighted-n-of size agentset [ reporter ].

Это сложно из-за трех вещей: (1) самцы могут спариваться с более чем одной самкой, но (2) только один раз с данной самкой, и (3) самки могут спариваться только с максимум пятью самцами.

to count-mates ; ask the females to count the number of males in a 10 patch radius & then 
                ; determine the frequency of the resident males in their patch

  ask turtles with [sex = "female"]
  [
    if any? turtles with [sex = "male"] in-radius 10
    [ set potentialMates turtles with [sex = "male"] in-radius 10
       ifelse any? potentialMates with [anadromousM = 1]
    [ set FA count potentialMates with [anadromousM = 1] / count potentialMates ]
    [ set FA 0]
      ifelse any? potentialMates with [anadromousM = 0]
    [ set FR count potentialMates with [anadromousM = 0] / count potentialMates ]
    [ set FR 0]
    ]
    ]
end

to mating-pool-prob ; negative frequency dependency which is based on the number of male 
                    ; resident turtles 

  ask turtles with [sex = "female"]
  [
  ifelse (FA = 1) and (FR = 0)[
      set matingPoolProbAnad 1
      set matingPoolProbRes 0
  ]
  [ifelse (FA > 0) and (FR < 1)
    [
        set matingPoolProbRes exp(a - b * (FR - c ))/(1 + exp(a - b * (FR - c)))
        set matingPoolProbAnad 1 - matingPoolProbRes 

    ]
    [
        set matingPoolProbAnad 0
        set matingPoolProbRes  1
        ]
  ]
  ]
end

1 Ответ

0 голосов
/ 07 июня 2018

Этот пример может приблизиться к тому, к чему вы стремитесь, но, очевидно, его необходимо адаптировать к этой игрушечной версии.Эта установка дает 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

Теперь вы можете запуститьстолько раз, сколько захотите и не должны видеть распечатку «Меньше доступных мужчин, чем партнеров».

...