Как обновить пропорции, используемые для выбора среди черепах в цикле? - PullRequest
0 голосов
/ 25 января 2019

В моей модели черепах есть два пола, и есть две потенциальные стратегии "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 

1 Ответ

0 голосов
/ 26 января 2019

Поскольку вам не нужно, чтобы они выбирались последовательно, вам следует подумать о весовом эквиваленте n-of из расширения rnd. Следующий код представляет собой полную модель, которая использует взвешенный выбор, чтобы показать вам, как он может работать. Но это не даст таких же результатов, как ваш подход. Ваша математика в основном заставляет один выбор или другой, основанный на пропорции каждого. Я думал, что это может сработать для вас в любом случае, так как взвешивание - это просто демонстрация непропорциональности.

extensions [rnd]

turtles-own
[ sex
  mates
  strategy
] 
breed [males male]
breed [females female]

to setup
  clear-all
  create-males 50 [set color red set sex "M"]
  create-females 1 [set color blue set sex "F"]
  ask turtles
  [ setxy random-xcor random-ycor
    set strategy one-of [1 0]
    set mates nobody
  ]
  reset-ticks 
end 

to go 
  ask males
  [ ; fd 1
  ]
  ask females [choose]
  tick
end 

to choose
  let availa-males males in-radius 5
  let max-mate-count min (list 5 count availa-males)
  if max-mate-count < 5 [ print  "Fewer available males than mates" ]
  let new-mates rnd:weighted-n-of max-mate-count availa-males [ strategy-weight strategy ]
  set mates (turtle-set mates new-mates)
  ask new-mates
  [ set mates (turtle-set mates myself)
  ]
end

to-report strategy-weight [ #strategy ]
  if #strategy = 1 [ report 0.2 ]
  if #strategy = 0 [ report 0.8 ]
  report 0
end

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

...