Modelo Predator-Prey en Node.js

Recientemente, una oleada de referencias al juego Life ha pasado por la red , principalmente debido al hecho de que su creador murió.

Ahora es el momento, todos se han interesado en la biología, en todas partes estos cronogramas de supervivencia, bueno, de repente saqué de los contenedores de memoria un modelo interesante, según el cual una vez escribí un documento final.

El modelo es similar a la vida en que es el mismo proceso cíclico que puede verse como un fuego, meditar sin cesar y reflexionar sobre lo eterno.

Este es un Predator-victim , un modelo muy serio de las matemáticas aplicadas (Predator-presa en el mundo de habla inglesa).

La esencia del proceso es que en cierto bosque vive una manada de ciervos (en la versión alternativa, conejos, pero no la esencia), que comen en la naturaleza y se reproducen salvajemente, y tarde o temprano llenan todo el territorio.

Sin embargo, en el mismo bosque también hay depredadores que se alimentan de estos venados (lobos, pero para las liebres, generalmente zorros).

Un par de depredadores que se encuentran en este bosque abundante se multiplica exponencialmente vigorosamente de acuerdo con la ley de Malthus , pero en algún momento, los recursos de los ciervos comienzan a agotarse, los lobos comienzan a morir de hambre y morir, el expositor vuela rápidamente y solo los más persistentes sobreviven allí.

Los venados, arrinconados, levantan la cabeza, encienden a su expositor y comienzan a dominar el bosque, pero los lobos supervivientes con carne fresca encuentran fuerza en sí mismos para una nueva ola de fertilidad ... y así sucesivamente en círculos y hasta el infinito.

Aquí está el gráfico (arrastrado de Wikipedia): el



modelo matemático de este proceso fue descrito a principios del siglo XX por Lotka y Volterra y nombrado en su honor.

¿Por qué este modelo ha existido durante cien años y sigue siendo relevante?

Hay dos razones principales: es muy simple y describe el proceso de manera bastante realista.

El modelo tiene solo cuatro parámetros:

  • alfa) tasa de cría de ciervos
  • beta) ciervos comiendo velocidad por lobos
  • gamma) la tasa de extinción de lobos hambrientos
  • delta) tasa de reproducción de lobos bien alimentados

El modelo contiene una no linealidad mínima y se considera analíticamente. Con parámetros bien elegidos, es estable (ni los ciervos ni los lobos mueren hasta el final) y describe de manera realista la dinámica de las fluctuaciones en las poblaciones.

Durante más de cien años, ha habido muchos intentos de hacer algo más realista, pero cualquier aumento en la complejidad conduce a un sistema no lineal de un nivel superior y luego todo se basa en ecuaciones integrales impenetrables que solo se pueden resolver mediante métodos numéricos.

Hay otro método: simplemente programe este proceso como un juego.

De hecho, este enfoque se llama modelado multiagente y es bastante adecuado para aprobar el curso.

Elegir una tecnología


Me gustaría que el programa tenga visualización, no solo en la máquina del autor, sino en la mayor audiencia posible, y que sea todo por sí mismo, con un mínimo esfuerzo y todo eso.
Es lógico que la solución sea ejecutar el programa en un navegador y, por lo tanto, tendrá que escribirlo en JavaScript.

Bueno, para no producir un zoológico tecnológico, también escribiremos un servidor en él.

Los pasos estándar para instalar node.js y todo lo que necesita se describen en el github .

Modelo de crecimiento de los ciervos


Pasamos a lo más interesante: la reproducción. Sin depredadores, tenemos un modelo maltusiano en condiciones de recursos limitados (en el mundo de las matemáticas se describe mediante una función logística o la ecuación de Verhulst ), ahora de alguna manera debe aplicarse a los agentes.

Es posible seleccionar coeficientes probabilísticos para cada venado y todo debería funcionar.
Pero el modelado de agente agente es bueno: puede especificar el comportamiento sin limitarse a algunos factores.

En general, el modelo de vida de los ciervos se ve así:

  • Los ciervos necesitan moverse. Un ciervo que no podía moverse por unidad de tiempo muere (y no podía moverse solo porque todas las jaulas vecinas están ocupadas por sus amigos).
  • , , .

  breed(u) {
    var spots = MapUtil.get_adj(u.point, this.W, this.H)
    if (!spots || spots.length < 1)
      return false
    var free = spots.filter(p => !this.GM.get(p))
    if (free.length < spots.length)
      return false
    var spot = _.sample(spots)
    if (!spot)
      return false
    var born = new Wild(u.kind)
    born.move(spot)
    this.add_wild(born)
    this.born.push(born)
  }

A continuación, haremos una aplicación de prueba de luz que crea un mundo forestal de 20x20, se ejecuta en el centro del venado y ejecuta 100 ciclos, cada vez que se imprime el estado en csv.

Llevaremos el archivo csv resultante a la hoja de cálculo de Google y generaremos un gráfico:



es todo un exponente. Vemos que el número se está estabilizando para más de 200 venados, esto puede explicarse fácilmente por el hecho de que la necesidad de movimiento requiere al menos dos jaulas para el venado, y el área de todo el bosque es 400. El

crecimiento máximo ocurre bastante temprano, en el movimiento 14-15, y los últimos 20 movimientos se queda quieto con ligeras fluctuaciones.

En general, quiero enfatizar que el modelo de agente más simple se comporta de manera muy realista, bastante similar a una curva logística diluida con un ligero ruido.

Pero vinimos aquí no tanto por números, sino por imágenes que puedes mirar y relajarte.

Entonces, es hora de hacer una página con un mapa y gráficos, y transferir la ejecución del modelo al servidor.

Ponemos express y socket.io, y dibujaremos directamente en el lienzo html5 (no estoy familiarizado con los motores js, y la tarea no es muy difícil).

Observamos y nos ponemos nerviosos acerca de cómo los ciervos literalmente inundan el bosque en unas pocas iteraciones, y luego fluctúan asintóticamente alrededor del máximo.



Por un lado, esto es solo un modelo, pero en algunos lugares esto es un problema real: solo la sobrepoblación de ciervos de Google y se sorprenderá de la abundancia de material sobre este tema.

Este modelo no tiene en cuenta la degradación de los bosques, pero en realidad los ciervos son consumidores bastante codiciosos: comen brotes, pisotean el suelo y generalmente destruyen sus bosques.

¿Qué debe hacer el propietario del bosque en este caso?

Compra lobos, cuelga un sensor GPS en cada uno y reza para que no desaparezcan.

Lobos


Es hora de introducir al lobo en nuestro modelo.

Deben decidirse dos cosas: cómo come y se multiplica el lobo.

Es fácil cazar cuando hay alguien, si hay un ciervo en una jaula vecina, solo cómelo.

Si no hay ciervos, entonces puedes sobrevivir por un período de tiempo.

Para empezar, digamos que puede haber un lobo en cada movimiento, pero si en dos movimientos no fuera posible, al lado de la evolución.

Con la multiplicación de más opciones.

Para empezar, eliminamos la delicadeza, dejamos que los lobos se multipliquen siempre cuando hay espacio libre.

Y agregue una restricción: los lobos hambrientos no se reproducen.

Primer panqueque


Deje que el venado se multiplique un poco y arroje al lobo a la multitud: el



Modelo resultó, por decirlo suavemente, inestable: los lobos cortaron instantáneamente a todos los ciervos y rápidamente se extinguieron.

Una frustración, no zen.

Segundo intento


Algo necesita ser cambiado.

Le duele la vista por lo explosivos que se están reproduciendo los lobos.

Vamos a complicar un poco su vida: establecemos la condición de que es posible reproducirse solo si hay más ciervos que lobos en las células de ciervos vecinas.

    var preys = spots.map(p => this.GM.get(p)).filter(u => u && u.kind == Wilds.DEER)
    var preds = spots.map(p => this.GM.get(p)).filter(u => u && u.kind == Wilds.WOLF)
    if (preys.length <= preds.length)
      return false

Y abandone a los lobos cuando la población de ciervos alcance su máximo.

Este intento tuvo mucho mejor éxito.

El equilibrio de depredadores y víctimas está en constante movimiento, la población de ciervos ha disminuido considerablemente y ahora ni siquiera se está acercando a su máximo.



Sin embargo, cualquier cosa puede suceder, y casi siempre sucede que los lobos logran morir, y los venados llenan triunfalmente el matorral nuevamente.

En esta carrera, los lobos duraron mucho tiempo:



Tercer círculo


Tendremos que apretar aún más las nueces de cría.

Ahora declaramos la condición: debe haber ciervos cerca, pero no debe haber lobos.
Tales lobos suaves no toleran la competencia.

El sistema es más estable.

En comparación con el gráfico anterior, los picos son suavizados por los ciervos y los lobos.



En general, está claro a dónde ir para obtener el mismo horario uniforme que en Wikipedia.
Como resultado, llegamos a una conclusión banal: debemos reproducirnos conscientemente y no al máximo.
Suena como un anuncio de hedonismo, pero puede reducir aún más la fertilidad de los lobos con la expectativa de "mejorar la calidad y la duración de su vida" ...



Despliegue


Como epílogo, instrucciones de implementación.

Es muy corto:

1. Escribimos un archivo acoplable simple:

FROM node:14
ADD https://github.com/tprlab/predator-prey/archive/master.zip /
RUN unzip /master.zip
WORKDIR /predator-prey-master
RUN npm install
EXPOSE 8081
CMD ["node", "server.js"]

2. construcción del acoplador. -t predator-prey

3. docker run -p 8081: 8081 predator-presa

Para los más perezosos, recolecté y cargué la imagen al Docker Hub.

Si no desea meterse con el acoplador, hay una instrucción de instalación desde cero en la página de repositorio (enlace a continuación).

Referencias



All Articles