Predator-Prey-Modell bei Node.js.

In letzter Zeit ist eine Flut von Hinweisen auf das Spiel Life durch das Netzwerk gegangen , hauptsächlich aufgrund der Tatsache, dass sein Schöpfer gestorben ist.

Jetzt ist die Zeit gekommen, jeder hat sich für Biologie interessiert, überall diese Überlebenspläne, nun, ich habe plötzlich ein interessantes Modell aus dem Gedächtnis geholt, nach dem ich einmal eine Hausarbeit geschrieben habe.

Das Modell ist dem Leben insofern ähnlich, als es der gleiche zyklische Prozess ist, der als Feuer angesehen werden kann, endlos meditiert und über das Ewige nachdenkt.

Dies ist ein Predator-Opfer , ein sehr ernstes Modell aus der angewandten Mathematik (Predator-Beute im englischsprachigen Raum).

Die Essenz des Prozesses ist, dass in einem bestimmten Wald eine Herde Hirsche lebt (in der alternativen Version - Kaninchen, aber nicht die Essenz), die sich in die Wildnis fressen und wild brüten und früher oder später das gesamte Gebiet füllen.

Im selben Wald gibt es jedoch auch Raubtiere, die sich von diesen Hirschen ernähren (Wölfe, aber für Hasen, normalerweise Füchse).

Ein Paar Raubtiere, die sich in diesem üppigen Wald befinden, vermehrt sich gemäß dem Gesetz von Malthus exponentiell kräftig , aber irgendwann beginnen die Ressourcen der Hirsche auszutrocknen, Wölfe zu verhungern und auszusterben, der Aussteller fliegt schnell nach unten und nur die hartnäckigsten überleben dort.

Die in eine Ecke getriebenen Hirsche heben den Kopf, schalten ihren Aussteller ein und beginnen, den Wald zu dominieren, aber die überlebenden Wölfe mit frischem Fleisch finden in sich Kraft für eine neue Welle der Fruchtbarkeit ... und so weiter im Kreis und bis ins Unendliche.

Hier ist die Grafik (aus Wikipedia gezogen): Das



mathematische Modell dieses Prozesses wurde zu Beginn des 20. Jahrhunderts von Lotka und Volterra beschrieben und zu ihren Ehren benannt.

Warum gibt es dieses Modell seit hundert Jahren und es ist immer noch relevant?

Es gibt zwei Hauptgründe: Es ist sehr einfach und beschreibt den Prozess sehr realistisch.

Das Modell hat nur vier Parameter:

  • Alpha) Hirschbrutrate
  • Beta) Hirsche fressen Geschwindigkeit von Wölfen
  • Gamma) die Aussterberate hungriger Wölfe
  • Delta) Brutrate wohlgenährter Wölfe

Das Modell enthält minimale Nichtlinearität und wird analytisch betrachtet. Mit gut gewählten Parametern ist es stabil (weder Hirsche noch Wölfe sterben bis zum Ende aus) und beschreibt realistisch die Dynamik von Populationsschwankungen.

Über hundert Jahre gab es viele Versuche, etwas realistischer zu machen - aber jede Zunahme der Komplexität führt zu einem nichtlinearen System höherer Ebene, und dann beruht alles auf undurchdringlichen Integralgleichungen, die nur mit numerischen Methoden gelöst werden können.

Es gibt noch eine andere Methode - programmieren Sie diesen Prozess einfach als Spiel.

Tatsächlich wird dieser Ansatz als Multi-Agent-Modellierung bezeichnet und eignet sich gut zum Bestehen des Kurses.

Auswahl einer Technologie


Ich möchte, dass das Programm nicht nur auf der Maschine des Autors, sondern auf dem größtmöglichen Publikum visualisiert wird und dass es mit minimalem Aufwand und so weiter für sich allein sein sollte.
Es ist logisch, dass die Lösung darin besteht, das Programm in einem Browser auszuführen, und daher müssen Sie es in Javascript schreiben.

Nun, um keinen Technologiezoo zu produzieren, werden wir auch einen Server darauf schreiben.

Die Standardschritte für die Installation von node.js und alles, was Sie benötigen, sind auf dem Github beschrieben .

Hirschwachstumsmodell


Wir kommen zur interessantesten - Reproduktion. Ohne Raubtiere haben wir ein malthusianisches Modell unter Bedingungen begrenzter Ressourcen (in der Welt der Mathematik wird es durch eine logistische Funktion oder die Verhulst-Gleichung beschrieben ), jetzt muss es irgendwie auf Agenten angewendet werden.

Es ist möglich, Wahrscheinlichkeitskoeffizienten für jedes Reh auszuwählen, und alles sollte funktionieren.
Die Modellierung von Agentenagenten ist jedoch gut - Sie können das Verhalten festlegen, ohne sich auf einige Faktoren zu beschränken.

Im Allgemeinen sieht das Hirschmodell des Lebens so aus:

  • Hirsche müssen sich bewegen. Ein Hirsch, der sich nicht pro Zeiteinheit bewegen konnte, stirbt (und er konnte sich nicht bewegen, nur weil alle benachbarten Käfige von seinen Freunden besetzt sind).
  • , , .

  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)
  }

Als nächstes erstellen wir eine einfache Test-App , die eine 20x20-Waldwelt erstellt, in die Mitte des Hirsches läuft und 100 Zyklen ausführt, wobei jedes Mal der Status in CSV gedruckt wird.

Wir werden die resultierende CSV-Datei in Google Spreadsheet einfügen und ein Diagramm erstellen:



Es ist ein ziemlicher Exponent. Wir sehen, dass sich die Zahl für mehr als 200 Hirsche stabilisiert. Dies kann leicht durch die Tatsache erklärt werden, dass für die Bewegung mindestens zwei Käfige für die Hirsche erforderlich sind und die Fläche des gesamten Waldes 400 beträgt. Das

maximale Wachstum erfolgt ziemlich früh - bei Bewegung 14-15 und den letzten 20 Zügen steht mit leichten Schwankungen still.

Im Allgemeinen möchte ich betonen, dass sich das einfachste Agentenmodell sehr realistisch verhält, ähnlich einer logistischen Kurve, die mit einem leichten Rauschen verdünnt ist.

Aber wir sind nicht so sehr wegen Zahlen hierher gekommen, sondern wegen Bildern, die man sich ansehen und entspannen kann.

Es ist also Zeit, eine Seite mit einer Karte und Grafiken zu erstellen und den Modelllauf auf den Server zu übertragen.

Wir setzen express und socket.io ein und zeichnen direkt auf die HTML5-Zeichenfläche (ich bin mit js-Engines nicht vertraut, und die Aufgabe ist nicht sehr schwierig).

Wir schauen und werden nervös darüber, wie Hirsche in wenigen Iterationen buchstäblich den Wald überfluten und dann asymptotisch um das Maximum schwanken.



Einerseits ist dies nur ein Modell, aber an einigen Stellen ist dies ein echtes Problem - einfach Google Deers Überbevölkerung und seien Sie überrascht über die Fülle an Material zu diesem Thema.

Dieses Modell berücksichtigt nicht die Walddegradation, aber in Wirklichkeit sind Hirsche eher gierige Konsumenten - sie essen Triebe, zertreten den Boden und zerstören im Allgemeinen ihre Wälder.

Was soll der Waldbesitzer in diesem Fall tun?

Er kauft Wölfe, hängt einen GPS-Sensor an jeden und betet, dass sie nicht verschwinden.

Wölfe


Es ist Zeit, den Wolf in unser Modell einzuführen.

Zwei Dinge müssen entschieden werden - wie der Wolf frisst und sich vermehrt.

Es ist einfach zu jagen, wenn jemand da ist - wenn sich in einem benachbarten Käfig ein Reh befindet - essen Sie es einfach.

Wenn es kein Reh gibt, können Sie eine Zeit lang überleben.

Nehmen wir zunächst an, dass es bei jeder Bewegung einen Wolf geben kann, aber wenn dies in zwei Zügen nicht möglich war - auf der Seite der Evolution.

Mit der Multiplikation von mehr Optionen.

Zunächst - wir entfernen die Delikatesse, lassen die Wölfe sich immer vermehren, wenn es freien Platz gibt.

Und fügen Sie eine Einschränkung hinzu - hungrige Wölfe brüten nicht.

Erster Pfannkuchen


Lassen Sie die Hirsche sich ein wenig vermehren und werfen Sie den Wolf in die Menge: Das



Modell stellte sich, gelinde gesagt, als instabil heraus - die Wölfe mähten sofort alle Hirsche aus und starben schnell aus.

Eine Frustration, kein Zen.

Zweiter Versuch


Es muss etwas geändert werden.

Es tut dem Auge weh, wie explosiv die Wölfe brüten.

Lassen Sie uns ihr Leben ein wenig verkomplizieren - wir setzen die Bedingung, dass es nur möglich ist zu züchten, wenn sich auf benachbarten Hirschzellen mehr Hirsche als Wölfe befinden.

    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

Und verlassen Sie die Wölfe, wenn die Hirschpopulation ihr Maximum erreicht.

Dieser Versuch gelang viel besser.

Das Gleichgewicht zwischen Raubtieren und Opfern ist ständig in Bewegung, die Hirschpopulation ist stark zurückgegangen und erreicht jetzt nicht einmal mehr das Maximum.



Es kann jedoch alles passieren, und fast jedes Mal, wenn es passiert, dass die Wölfe aussterben und die Hirsche das Dickicht wieder triumphierend füllen.

In diesem Lauf haben die Wölfe lange gedauert:



Dritter Kreis


Wir müssen die Zuchtnüsse noch fester anziehen.

Wir geben jetzt den Zustand an: Es muss Rehe in der Nähe geben, aber es sollten keine Wölfe sein.
Solche sanften Wölfe tolerieren keine Konkurrenz.

Das System ist stabiler.

Im Vergleich zum vorherigen Diagramm werden die Spitzen sowohl von Hirschen als auch von Wölfen geglättet.



Im Allgemeinen ist klar, wohin Sie sich bewegen müssen, um den gleichen reibungslosen Zeitplan wie bei Wikipedia zu erhalten.
Infolgedessen kommen wir zu einem banalen Schluss - wir müssen uns bewusst und nicht maximal reproduzieren.
Es klingt wie eine Werbung für Hedonismus, aber Sie können die Fruchtbarkeit von Wölfen weiter reduzieren, in der Erwartung, "die Qualität und Dauer ihres Lebens zu verbessern" ...



Einsatz


Als Epilog Anweisungen zur Bereitstellung.

Es ist sehr kurz:

1. Wir schreiben eine einfache Docker-Datei:

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-prey

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

Für die Faulsten habe ich das Bild gesammelt und in den Docker Hub hochgeladen .

Wenn Sie sich nicht mit dem Docker anlegen möchten, finden Sie auf der Repo-Seite eine Installationsanweisung von Grund auf neu (Link unten).

Verweise



All Articles