Yellowfin tuna dynamics model with real catch data

Yellowfin tuna dynamics model with real catch data preview image

1 collaborator

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by everyone
Model was written in NetLogo 7.0.3 • Viewed 8 times • Downloaded 0 times • Run 0 times
Download the 'Yellowfin tuna dynamics model with real catch data' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


Modelo de dinámica de atún aleta amarilla (Yellowfin tuna) con datos reales de captura

Propósito

Este modelo simula la evolución de la biomasa de atún aleta amarilla bajo diferentes regímenes de pesca, utilizando datos históricos de captura (toneladas anuales) y la ecuación logística con mortalidad por pesca variable en el tiempo. Permite explorar los efectos de la sobrepesca y comparar escenarios de gestión pesquera.

Ecuación del modelo

La biomasa total N(t) (en toneladas) sigue la ecuación diferencial:

dN/dt = r N (1 − N/K) − mt N

donde:

  • r = tasa intrínseca de crecimiento anual (ajustable con deslizador)
  • K = capacidad de carga oceánica total (toneladas, ajustable)
  • mt = mortalidad por pesca anual, que puede ser:
    • Modo histórico:
      mt = (captura real del año × factor sobrepesca) / biomasa actual
    • Modo sobrepesca constante:
      mt = mortalidad base × factor sobrepesca (ej. 0.3 año−1)

Datos utilizados

Los datos de captura anual provienen del archivo capturas_atun.csv, generado a partir de la base de datos IOTC (Comisión del Atún del Océano Índico) para la especie Thunnus albacares (Yellowfin tuna). El archivo contiene dos columnas: YEAR y CATCH (toneladas). El modelo suma automáticamente las capturas de todas las flotas y zonas para cada año.

Elementos de la interfaz

Botones

  • Setup: Inicializa el modelo, carga los datos y crea las poblaciones.
  • Go: Ejecuta la simulación año por año (un tick = un año).
  • Start Overfishing: Cambia al modo de mortalidad por pesca constante (sobrepesca intensiva).
  • Back to Historical: Regresa al modo de capturas históricas.

Deslizadores (sliders)

  • r: Tasa de crecimiento intrínseco (típico entre 0.3 y 0.8 para atún).
  • K: Capacidad de carga total (toneladas). Valores recomendados: 500 000 – 1 500 000.
  • overfishing-multiplier: Factor que multiplica la captura (modo histórico) o la mortalidad constante (modo sobrepesca). Permite simular eventos de sobrepesca.
  • num-populations: Número de subpoblaciones o stocks independientes. Cada una tiene su propia biomasa inicial y capacidad de carga local.
  • constant-mortality (opcional): Mortalidad por pesca base en modo sobrepesca (año-1).

Monitores

  • Biomasa total actual: Muestra la suma de las biomasas de todas las poblaciones.
  • Año actual: Indica el año de la simulación.
  • Factor sobrepesca: Valor actual del multiplicador.
  • Modo: Indica si se está en modo histórico o sobrepesca constante.

Gráficas

  • Biomasa total: Evolución de la biomasa agregada a lo largo del tiempo.
  • Captura anual: Captura extraída cada año (en toneladas), ya sea histórica ajustada por el factor o resultante de la mortalidad constante.

Cómo usar el modelo

  1. Ajuste los parámetros r, K, num-populations y overfishing-multiplier según el escenario deseado.
  2. Presione Setup para inicializar.
  3. Presione Go para iniciar la simulación. Observe cómo la biomasa responde a las capturas históricas.
  4. Durante la ejecución, aumente overfishing-multiplier para simular un aumento de la presión pesquera.
  5. Presione Start Overfishing para cambiar a un régimen de mortalidad constante (por ejemplo, tras un colapso). La biomasa caerá rápidamente.
  6. Use Back to Historical para volver a las capturas reales y ver si la población se recupera.

Interpretación de resultados

  • Si la biomasa se mantiene estable o fluctúa alrededor de un nivel, la pesca es sostenible.
  • Si la biomasa desciende progresivamente hacia cero, hay sobrepesca.
  • El factor overfishing-multiplier permite explorar umbrales críticos: valores ligeramente superiores a 1 pueden llevar a colapso si se mantienen en el tiempo.
  • La comparación entre el modo histórico (capturas reales) y el modo sobrepesca constante ayuda a evaluar estrategias de manejo.

Limitaciones y supuestos

  • El modelo asume que la captura se extrae instantáneamente al inicio de cada año.
  • No considera migración entre poblaciones ni estructura por edades.
  • La mortalidad natural no se incluye explícitamente; está implícita en el parámetro r (crecimiento neto).
  • Los datos de captura son agregados a nivel oceánico; no distinguen zonas de pesca.
  • El método de integración es Euler con paso de 1 año, suficiente para tasas de crecimiento moderadas.

Referencias

  • IOTC (Comisión del Atún del Océano Índico). Datos de captura de atún aleta amarilla. https://www.iotc.org
  • Ecuación logística con mortalidad por pesca: modelo clásico de dinámica de poblaciones explotadas (Schaefer, 1954).

Créditos

Modelo desarrollado para simulación de escenarios de sobrepesca. Creado por Daniel Pabon para la asignatura de Ecología Acuática, programa de Biología, Universidad de Pamplona. biodaniel001@gmail.com

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

extensions [csv]

breed [barcos barco]

globals [
  years-list
  catches-list
  current-index
  ; historical-mode?   ; ← Comentado porque hay un switch en la interfaz que lo crea
  ; Las siguientes son creadas por sliders
]

turtles-own [
  biomass
  r-local
  K-local
]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; AUXILIARES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to-report split [string delimitador]
  let result []
  let i 0
  let len length string
  let pos position delimitador string
  while [pos != false] [
    set result lput substring string i pos result
    set i (pos + 1)
    set pos position delimitador substring string i len
  ]
  set result lput substring string i len result
  report result
end 

to-report string-to-number [s]
  ifelse s = "" or s = "NA" or s = "NULL" [
    report 0
  ] [
    report read-from-string s
  ]
end 

to load-catch-data [filename]
  ifelse file-exists? filename [
    set catches-list []
    set years-list []
    file-open filename
    let header file-read-line
    while [not file-at-end?] [
      let line file-read-line
      let items split line ","
      if length items >= 2 [
        let year string-to-number (item 0 items)
        let catch string-to-number (item 1 items)
        let pos position year years-list
        ifelse pos = false [
          set years-list lput year years-list
          set catches-list lput catch catches-list
        ] [
          let old-catch item pos catches-list
          set catches-list replace-item pos catches-list (old-catch + catch)
        ]
      ]
    ]
    file-close
    print (word "Cargados " length years-list " años. Desde " item 0 years-list " hasta " item (length years-list - 1) years-list)
  ] [
    set years-list [1981 1982 1984 1985 1986 1987 1988 1991]
    set catches-list [12.422767 0.735563 0.679455 0.794039 0.718265 0.705771 0.198865 0.001112]
    user-message "Archivo no encontrado. Usando datos de ejemplo limitados."
  ]
end 

to dibujar-oceano
  ; Fondo azul fijo (85 = azul medio claro, bonito)
  ask patches [ set pcolor 95 ]
end 

to actualizar-visuales
  ; Solo ajustar tamaños si hay al menos un pez
  if any? turtles [
    let max-biomass max [biomass] of turtles
    if max-biomass > 0 [
      ask turtles [
        set size 0.8 + (biomass / max-biomass) * 2.5
      ]
    ]
  ]
  
  ; Determinar número de barcos (si no hay peces, igual se pueden mostrar)
  let num-barcos-deseado 0
  ifelse historical-mode? [
    set num-barcos-deseado round (3 + (overfishing-multiplier - 1) * 12)
  ] [
    set num-barcos-deseado round (5 + overfishing-multiplier * 10)
  ]
  set num-barcos-deseado max list 2 min list 40 num-barcos-deseado
  
  let barcos-actuales count barcos
  if barcos-actuales < num-barcos-deseado [
    create-barcos (num-barcos-deseado - barcos-actuales) [
      set shape "boat"
      set color 35
      set size 1.5
      setxy random-xcor random-ycor
    ]
  ]
  if barcos-actuales > num-barcos-deseado [
    ask n-of (barcos-actuales - num-barcos-deseado) barcos [ die ]
  ]
end 

to setup-plot
  set-current-plot "Biomasa total"
  clear-plot
  set-current-plot "Captura anual"
  clear-plot
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; SETUP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to setup
  clear-all
  dibujar-oceano
  ; El switch de la interfaz ya tiene el valor de historical-mode? (true o false)
  ; No lo seteamos aquí para no sobreescribir el switch.
  ; Si quieres que empiece siempre en true, descomenta la línea:
  ; set historical-mode? true

  load-catch-data "capturas_atun.csv"

  let poblaciones max list 1 num-populations
  create-turtles poblaciones [
    set shape "fish"
    set color 105          ; azul brillante
    set size 2
    setxy random-xcor random-ycor
    set biomass (K / poblaciones) * (0.8 + random-float 0.4)
    set K-local (K / poblaciones) * (0.9 + random-float 0.2)
    if K-local <= 0 [ set K-local 0.000001 ]
    set r-local r * (0.9 + random-float 0.2)
  ]

  create-barcos 5 [
    set shape "boat"
    set color 35
    set size 1.5
    setxy random-xcor random-ycor
  ]

  reset-ticks
  set current-index 0
  setup-plot
  actualizar-visuales
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; GO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to go
  if current-index >= length years-list [ stop ]

  let current-year item current-index years-list
  let historical-catch item current-index catches-list

  let m_t 0
  let total-biomass sum [biomass] of turtles

  ifelse historical-mode? [
    ifelse total-biomass > 0 [
      set m_t (historical-catch * overfishing-multiplier) / total-biomass
    ] [
      set m_t 0
    ]
  ] [
    set m_t constant-mortality * overfishing-multiplier
  ]

  ; Actualizar biomasa de cada pez
  ask turtles [
    let N biomass
    let safe-K K-local
    if safe-K <= 0 [ set safe-K 0.000001 ]
    let dNdt r-local * N * (1 - N / safe-K) - m_t * N
    set biomass N + dNdt
    if biomass < 0 [ set biomass 0 ]
  ]

  ; ELIMINAR PECES EXTINTOS (biomasa <= 0.01)
  ask turtles with [biomass <= 0.01] [ die ]

  ; Recalcular biomasa total
  set total-biomass sum [biomass] of turtles
  let actual-catch 0
  if total-biomass > 0 [
    set actual-catch min (list (m_t * total-biomass) total-biomass)
  ]

  ; Actualizar gráficas (aunque biomasa sea 0)
  set-current-plot "Biomasa total"
  plotxy current-year total-biomass

  set-current-plot "Captura anual"
  plotxy current-year actual-catch

  ; MOVIMIENTO DE PECES (solo si hay)
  ask turtles [
    rt random 30
    lt random 30
    fd 1
  ]

  ; Actualizar tamaños y barcos (ya protegido)
  actualizar-visuales

  ; MOVIMIENTO DE BARCOS
  ask barcos [
    rt random 30
    lt random 30
    fd 0.5
  ]

  set current-index current-index + 1
  tick
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; CONTROL DE SOBREPESCA (opcional si usas botones)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to start-overfishing
  set historical-mode? false
  user-message "Modo sobrepesca constante activado"
end 

to back-to-historical
  set historical-mode? true
  user-message "Regresando a capturas históricas"
end 

There is only one version of this model, created 14 days ago by Daniel David Pabon Caicedo.

Attached files

File Type Description Last updated
capturas_atun.csv data data file to run the model 14 days ago, by Daniel David Pabon Caicedo Download
Yellowfin tuna dynamics model with real catch data.png preview Preview for 'Yellowfin tuna dynamics model with real catch data' 14 days ago, by Daniel David Pabon Caicedo Download

This model does not have any ancestors.

This model does not have any descendants.