Dado un conjunto de agentes de dos o más tortugas, ¿cómo encuentro el color más frecuente?

Me gustaría hacer algo así, si es posible:

set my_color [mostfrequentcolor] of my_agentset
2
Marco Turna 9 sep. 2018 a las 20:23

3 respuestas

La mejor respuesta

Está buscando la primitiva modes (https: // ccl .northwestern.edu / netlogo / docs / dictionary.html # modos):

one-of modes [color] of my_agentset

Es "modos", plural, ya que podría haber un empate. Una forma de romper el empate es usar one-of para hacer una selección aleatoria.

1
Seth Tisue 12 sep. 2018 a las 21:14

Aquí hay dos opciones más, ambas haciendo uso de la extensión table:

extensions [ table ]

to-report most-frequent-color-1 [ agentset ]
  report (first first
    sort-by [ [p1 p2] -> count last p1 > count last p2 ]
    table:to-list table:group-agents turtles [ color ])
end

to-report most-frequent-color-2 [ agentset ]
  report ([ color ] of one-of first
    sort-by [ [a b] -> count a > count b ]
    table:values table:group-agents turtles [ color ])
end

No estoy muy segura de cuál prefiero ...

1
Nicolas Payette 10 sep. 2018 a las 19:01

Con este ejemplo de configuración:

to setup
  ca
  crt 10 [
    set color one-of [ blue green red yellow ]
  ]
  print most-frequent-color turtles 
  reset-ticks
end

Puede hacer uso de un procedimiento to-report para hacer esto; detalles en los comentarios:

to-report most-frequent-color [ agentset_ ]
  ; get all colors of the agentset of interest
  let all-colors [color] of agentset_

  ; get only the unique values
  let colors-used remove-duplicates all-colors

  ; use map/filter to get frequencies of each color
  let freqs map [ m -> length filter [ i -> i = m ] all-colors ] colors-used

  ; get the position of the most frequent color (ties broken randomly) 
  let max-freq-pos position ( max freqs ) freqs 

  ; use that position as an index for the colors used
  let max-color item max-freq-pos colors-used

  report max-color
end
1
Luke C 9 sep. 2018 a las 18:32