Predator-Prey Model em Node.js

Recentemente, uma onda de referências ao jogo Life passou pela rede , principalmente devido ao fato de seu criador ter morrido.

Agora é a hora, todo mundo se interessou por biologia, em todos os lugares desses horários de sobrevivência, bem, de repente saí da memória um modelo interessante, segundo o qual uma vez escrevi um trabalho.

O modelo é semelhante à Vida, na medida em que é o mesmo processo cíclico que pode ser visto como um fogo, meditar sem parar e refletir sobre o eterno.

Esta é uma vítima do Predador , um modelo muito sério da matemática aplicada (predador-presa no mundo de língua inglesa).

A essência do processo reside no fato de que em uma certa floresta vive um rebanho de veados (na versão alternativa - coelhos, mas não a essência) que comem na natureza e se reproduzem descontroladamente, e mais cedo ou mais tarde preenchem todo o território.

No entanto, na mesma floresta também existem predadores que se alimentam desses cervos (lobos, mas para lebres, geralmente raposas).

Um par de predadores encontrados nesta floresta abundante se reproduz exponencialmente de acordo com a lei de Malthus , mas em algum momento, os recursos dos cervos começam a secar, os lobos começam a morrer de fome e a morrer, o expositor voa rapidamente e apenas os mais persistentes sobrevivem lá.

O veado, encurralado, levanta a cabeça, liga o expositor e começa a dominar a floresta, mas os lobos sobreviventes com carne fresca encontram força em si mesmos para uma nova onda de fertilidade ... e assim por diante, em círculos e até o infinito.

Aqui está o gráfico (arrastado da Wikipedia): O



modelo matemático desse processo foi descrito no início do século 20 por Lotka e Volterra e nomeado em sua homenagem.

Por que esse modelo existe há cem anos e ainda é relevante?

Há duas razões principais: é muito simples e descreve o processo de maneira bastante realista.

O modelo possui apenas quatro parâmetros:

  • alfa) taxa de criação de veados
  • beta) velocidade de comer veados pelos lobos
  • gama) a taxa de extinção de lobos famintos
  • delta) taxa de reprodução de lobos bem alimentados

O modelo contém não linearidade mínima e é considerado analiticamente. Com parâmetros bem escolhidos, é estável (nem veados nem lobos morrem até o fim) e descreve realisticamente a dinâmica das flutuações nas populações.

Ao longo de cem anos, houve muitas tentativas de tornar algo mais realista - mas qualquer aumento de complexidade leva a um sistema não-linear de nível superior e tudo depende de equações integrais impenetráveis ​​que só podem ser resolvidas por métodos numéricos.

Existe outro método - basta programar esse processo como um jogo.

De fato, essa abordagem é chamada de modelagem multiagente e é bastante adequada para passar no curso.

Escolhendo uma tecnologia


Eu gostaria que o programa tivesse visualização, não apenas na máquina do autor, mas no maior público possível, e que ele deva ser por si só, com o mínimo esforço e tudo isso.
É lógico que a solução será executar o programa em um navegador e, portanto, você precisará escrevê-lo em javascript.

Bem, para não produzir um zoológico de tecnologia, também escreveremos um servidor nele.

As etapas padrão para instalar o node.js e tudo o que você precisa estão descritas no github .

Modelo de crescimento de veados


Passamos ao mais interessante - a reprodução. Sem predadores, temos um modelo malthusiano em condições de recursos limitados (no mundo da matemática é descrito por uma função logística ou pela equação de Verhulst ), agora deve, de alguma forma, ser aplicado aos agentes.

É possível selecionar coeficientes probabilísticos para cada cervo e tudo deve dar certo.
Mas a modelagem do agente é boa - você pode especificar o comportamento sem se limitar a alguns fatores.

Em geral, o modelo de vida dos cervos é assim:

  • veado precisa se mover. Um cervo que não pode se mover por unidade de tempo morre (e ele não pode se mover apenas porque todas as gaiolas vizinhas estão ocupadas por seus 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)
  }

Em seguida, criaremos um aplicativo de teste fácil que criará um mundo florestal de 20x20 , entrará no centro do cervo e executará 100 ciclos, sempre imprimindo o status em csv.

Iremos direcionar o arquivo csv resultante para a planilha do Google e gerar um gráfico:



é um expoente. Vimos que o número está se estabilizando para mais de 200 cervos, isso pode ser facilmente explicado pelo fato de que a necessidade de movimento requer pelo menos duas gaiolas para o cervo, e a área de toda a floresta é de 400. O

crescimento máximo ocorre muito cedo - no movimento 14-15, e nos últimos 20 movimentos fica parado com ligeiras flutuações.

Em geral, quero enfatizar que o modelo de agente mais simples se comporta de maneira muito realista, bastante semelhante a uma curva logística diluída com um leve ruído.

Mas viemos aqui não tanto por números, mas por fotos que você pode ver e relaxar.

Portanto, é hora de criar uma página com um mapa e gráficos e transferir o modelo para o servidor.

Colocamos express e socket.io e desenharemos diretamente na tela html5 (não estou familiarizado com os mecanismos js, e a tarefa não é muito difícil).

Ficamos nervosos com a forma como os cervos literalmente inundam a floresta em algumas iterações e depois flutuam assintoticamente em torno do máximo.



Por um lado, isso é apenas um modelo, mas em alguns lugares isso é um problema real - apenas a superpopulação do Google Deers e surpreenda-se com a abundância de material sobre esse tópico.

Esse modelo não leva em consideração a degradação da floresta, mas, na realidade, os veados são consumidores bastante gananciosos - comem brotos, pisam no chão e geralmente destroem suas florestas.

O que o proprietário da floresta deve fazer neste caso?

Ele compra lobos, pendura um sensor de GPS em cada um e reza para que eles não desapareçam.

Lobos


É hora de introduzir o lobo em nosso modelo.

Duas coisas precisam ser decididas - como o lobo come e se multiplica.

É fácil caçar quando há alguém - se houver um cervo em qualquer gaiola vizinha - apenas coma.

Se não houver veados, você poderá sobreviver por um período de tempo.

Para começar, digamos que pode haver um lobo a cada movimento, mas se em dois movimentos não era possível - para o lado da evolução.

Com a multiplicação de mais opções.

Para começar - removemos a delicadeza, deixe os lobos se multiplicarem sempre quando houver espaço livre.

E adicione uma restrição - lobos famintos não se reproduzem.

Primeira panqueca


Deixe o cervo se multiplicar um pouco e jogar o lobo na multidão: o



Modelo acabou, para dizer o mínimo, instável - os lobos cortaram instantaneamente todos os cervos e rapidamente morreram.

Uma frustração, sem zen.

Segunda tentativa


Algo precisa ser mudado.

Dói os olhos o quão explosivos os lobos estão se reproduzindo.

Vamos complicar um pouco a vida deles - estabelecemos a condição de que só é possível procriar se houver mais veados do que lobos nas células vizinhas.

    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

E abandone os lobos quando a população de veados atingir o seu máximo.

Esta tentativa teve muito sucesso.

O equilíbrio de predadores e vítimas está sempre em movimento, a população de veados diminuiu bastante e agora nem chega perto do seu máximo.



No entanto, tudo pode acontecer, e quase sempre que os lobos conseguem morrer, e o cervo triunfante enche o bosque novamente.

Nesta corrida, os lobos duraram muito tempo:



Terceiro círculo


Teremos que apertar as nozes de criação ainda mais.

Agora declaramos a condição: deve haver veado por perto, mas não deve haver lobos.
Tais lobos gentis não toleram competição.

O sistema é mais estável.

Comparado ao gráfico anterior, os picos são suavizados por veados e lobos.



Em geral, é claro para onde ir para obter o mesmo horário tranqüilo que na Wikipedia.
Como resultado, chegamos a uma conclusão banal - precisamos nos reproduzir conscientemente, e não ao máximo.
Parece um anúncio de hedonismo, mas você pode reduzir ainda mais a fertilidade dos lobos na expectativa de "melhorar a qualidade e a duração de sua vida" ...



Desdobramento, desenvolvimento


Como um epílogo, instruções de implantação.

É muito curto:

1. Escrevemos um arquivo docker simples:

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. docker build. -t predator-presa

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

Para os mais preguiçosos, coletei e carreguei a imagem no Docker Hub.

Se você não quiser mexer com a janela de encaixe, há uma instrução de instalação do zero na página do repositório (link abaixo).

Referências



All Articles