HINWEIS
Dieses Problem wurde von diesem reddit Thread (Spoiler-Warnung!) Übernommen und ich habe es so angepasst, dass es mit dem Format dieser Site übereinstimmt. Das gesamte Guthaben geht an den Reddit-Benutzer "Coder_d00d".
In diesem Problem simulieren wir eine Gesamtstruktur.
Für diesen simulierten Wald werden drei Aspekte behandelt.
- Bäume, die ein Schössling, ein Baum oder ein Holunder sein können.
- Holzfäller (Er fällt Bäume, isst sein Mittagessen und geht zum Lava-Versuch)
- Bären (Er zermalmt die Holzfäller, die nach Pfannkuchen riechen)
Eine Vorwarnung: Diese Regeln sind höchstwahrscheinlich nicht perfekt. Betrachten Sie sie als Richtlinie, und wenn Sie etwas Feines optimieren müssen (Laichraten wurden als Problem herausgestellt), sehen Sie sich die Antwort von kuroi neko als Beispiel dafür an.
Zeitzyklus:
Die Simulation wird monatelang simuliert. Sie werden rechtzeitig mit einem "Häkchen" vorwärts schreiten. Jeder "Haken" steht für einen Monat. Alle 12 "Ticks" stehen für ein Jahr. Unser Wald wird sich verändern und in ständigem Wandel sein. Wir werden den Fortschritt unseres Waldes aufzeichnen und analysieren, was damit passiert.
Wald:
Der Wald wird ein zweidimensionaler Wald sein. Wir benötigen eine Eingabe von N, um die Größe der Gesamtstruktur in einem Raster mit der Größe N x N darzustellen. An jedem Ort können Sie Bäume, Bären oder Holzfäller halten. Sie können denselben Ort einnehmen, aber häufig treten Ereignisse auf, wenn sie denselben Ort einnehmen.
Unser Wald wird zufällig basierend auf der Größe erzeugt. Zum Beispiel, wenn Ihr Wert N = 10. Sie haben einen Wald von 10 mal 10 und 100 Flecken.
- 10% des Waldes halten einen Holzfäller an 10 zufälligen Stellen. (mit unserem 100er Wald sollten das 10 Holzfäller sein)
- 50% des Waldes enthalten Bäume (Bäume können eine von drei Arten sein und beginnen als der mittlere von "Baum") an zufälligen Stellen.
- 2% des Waldes werden Bären halten.
Wie Sie die Größe des Waldes erhalten, liegt ganz bei Ihnen (lesen Sie sie aus der Standarddatei, einer Datei oder einem Hardcode ein). Ich würde empfehlen, N wie 5 oder höher zu halten. Kleine Wälder machen nicht viel Spaß.
Veranstaltungen:
Während der Simulation wird es Ereignisse geben. Die Ereignisse basieren auf einer Logik, die ich unten erläutern werde. Ich werde die Ereignisse unten in jeder Beschreibung der 3 Elemente unseres Waldes beschreiben.
Die Ereignisse folgen zuerst der Reihenfolge der Bäume, dann der Reihenfolge der Holzfäller und zuletzt der Bären.
Bäume:
Jeden Monat hat ein Baum eine Chance von 10%, einen neuen "Schössling" hervorzubringen. Auf einem zufälligen freien Feld neben einem Baum besteht eine Chance von 10%, einen "Schössling" zu erzeugen.
Zum Beispiel hat ein Baum in der Mitte des Waldes 8 andere Stellen um sich herum. Einer von diesen (wenn sie leer sind) wird ein "Schössling".
Nach 12 Monaten wird ein "Bäumchen" zu einem "Baum" aufgewertet. Ein "Bäumchen" kann erst dann andere Bäume hervorbringen, wenn er zu einem "Baum" gereift ist.
Sobald ein "Schössling" ein Baum wird, kann er andere neue "Schösslinge" hervorbringen.
Wenn es einen "Baum" seit 120 Monaten (10 Jahren) gibt, wird er zu einem "Holunderbaum".
Ältere Bäume haben eine Chance von 20%, einen neuen "Schössling" zu erzeugen, anstatt von 10%.
Wenn es zu einem Baum oder Holunder keine offenen angrenzenden Stellen gibt, werden keine neuen Bäume erzeugt.
Holzfäller:
Holzfäller fällen Bäume, hüpfen und springen und pressen gerne wilde Blumen.
Jeden Monat ziehen Holzfäller umher. Sie bewegen sich bis zu dreimal zu einem zufällig ausgewählten Punkt, der in eine beliebige Richtung benachbart ist. So hat zum Beispiel ein Holzfäller in der Mitte Ihres Gitters 8 Stellen, zu denen er sich bewegen kann. Er wird zu einem zufälligen Ort wandern. Dann wieder. Und zum dritten Mal. NB: Dies kann jede Stelle sein (so dass sie in Bären laufen können, was zu einem Maul führt).
Wenn sich der Holzfäller bewegt und er auf einen Baum trifft (keinen Schössling), hört er auf und seine Wanderung für diesen Monat geht zu Ende. Er wird dann den Baum für Schnittholz ernten. Entferne den Baum. Erhalten Sie 1 Stück Holz.
Holzfäller ernten keine "Setzlinge".
Holzfäller ernten auch Holunder. Ältere Bäume sind 2 Holzstücke wert.
Holzverfolgung:
Alle 12 Monate wird die Menge des geernteten Holzes mit der Anzahl der Holzfäller im Wald verglichen.
Wenn das gesammelte Holz der Anzahl der Holzfäller im Wald entspricht oder diese übersteigt, werden eine Reihe neuer Holzfäller eingestellt und zufällig im Wald erzeugt.
Berechnen Sie die Anzahl der Holzfäller, mit denen Sie anstellen können:
floor(lumber_collected / number_of_lumberjacks)
Wenn jedoch nach einer Zeitspanne von 12 Monaten die Menge des gesammelten Holzes unter der Anzahl der Holzfäller liegt, wird ein Holzfäller losgelassen, um Geld zu sparen, und 1 zufälliger Holzfäller wird aus dem Wald entfernt. Beachten Sie, dass Sie Ihre Lumberjack-Belegschaft niemals unter 0 reduzieren werden.
Bären:
Bären wandern wie ein Holzfäller durch den Wald. Anstelle von 3 Feldern durchstreift ein Bär jedoch bis zu 5 Felder.
Wenn ein Bär auf einen Holzfäller stößt, hört er für einen Monat auf zu wandern. (Zum Beispiel nach 2 Zügen landet der Bär mit einem Holzfäller auf einem Feld, das er diesen Monat nicht mehr machen wird.)
Holzfäller riechen nach Pfannkuchen. Bären lieben Pfannkuchen. Deshalb wird der Bär den Holzfäller leider verprügeln und verletzen. Der Holzfäller wird aus dem Wald entfernt (Er geht mittwochs nach Hause, kauft ein und trinkt Buttergebäck zum Tee).
Wir werden dies als "Maul" -Unfall verfolgen.
Beachten Sie, dass die Holzfällerpopulation niemals unter 1 fallen kann. Wenn also der letzte Holzfäller getötet wird, spawnen Sie einfach einen weiteren in.
Maul Tracking:
Im Laufe von 12 Monaten erhöht sich die Bärenpopulation um 1, wenn es 0 "Maul" -Unfälle gibt. Bei "Maul" -Unfällen stellen die Holzfäller einen Zoo ein, um einen Bären zu fangen und wegzunehmen. Entferne 1 zufälligen Bären. Beachte, dass wenn deine Bärenpopulation 0 Bären erreicht, es im nächsten Jahr keine "Maul" -Unfälle gibt und du im nächsten Jahr 1 neuen Bären hervorbringst.
Befindet sich nur 1 Holzfäller im Wald und wird er verstümmelt, wird er nach Hause geschickt, aber ein neuer wird sofort eingestellt und an einer anderen Stelle im Wald wieder aufgetaucht. Die Holzfällerpopulation kann niemals unter 1 fallen.
Zeit:
Die Simulation erfolgt für 4800 Monate (400 Jahre) oder bis keine Setzlinge, Bäume oder Holunder mehr vorhanden sind.
Ausgabe:
Sie drucken jeden Monat eine Karte des Waldes aus - vielleicht mit einer ASCII-Karte oder mit Grafiken und Farben.
Optionale Extras
- Sie könnten die Populationen von Bäumen, Holzfällern und Bären pro Tick ausgeben.
- Sie können immer dann ausgeben, wenn ein Ereignis eintritt (z. B .: "Ein Bär hat einen Holzfäller geplündert").
Wertung
Dies ist ein Beliebtheitswettbewerb, daher gewinnen die meisten Upvotes!
BEARBEITEN - Die Leute haben auf eine Reihe von Fehlern in meinen Regeln hingewiesen, und Sie können mir gerne Fragen stellen. Es ist jedoch auch in Ordnung, die Regeln ein wenig an Ihr eigenes Programm oder an die Interpretation des Programms anzupassen.
quelle
Note that you will never reduce your Lumberjack labor force below 0
Ändern Sie in Punkt 3 der Liste der Holzfällerabschnitte den Wert in 1, damit er mit den Angaben in der Bärenabteilung übereinstimmt.Antworten:
Javascript + HTML - probieren Sie es aus
Aktualisiert gemäß populärer Anfrage
Allgemeines Verhalten
Das Programm ist jetzt etwas interaktiv.
Der Quellcode ist vollständig parametrisiert, sodass Sie einige weitere interne Parameter mit Ihrem bevorzugten Texteditor anpassen können.
Sie können die Gesamtstrukturgröße ändern.
Mindestens 2 müssen Platz haben, um einen Baum, einen Holzfäller und einen Bären an 3 verschiedenen Stellen zu platzieren, und die maximale Anzahl ist willkürlich auf 100 festgelegt (was dazu führt, dass Ihr durchschnittlicher Computer kriecht).
Sie können auch die Simulationsgeschwindigkeit ändern.
Die Anzeige wird alle 20 ms aktualisiert, sodass ein größerer Zeitschritt feinere Animationen erzeugt.
Mit den Schaltflächen kann die Simulation gestoppt / gestartet oder für einen Monat oder ein Jahr ausgeführt werden.
Die Bewegung der Waldbewohner ist jetzt etwas animiert. Mauling- und Tree-Cutting-Events sind ebenfalls geplant.
Ein Protokoll einiger Ereignisse wird ebenfalls angezeigt. Weitere Nachrichten sind verfügbar, wenn Sie die Ausführlichkeitsstufe ändern. Dies würde Sie jedoch mit Benachrichtigungen über "Bob schneidet noch einen weiteren Baum" überschwemmen.
Ich würde es lieber nicht tun, wenn ich du wäre, aber das tue ich nicht, also ...
Neben dem Spielplatz wird eine Reihe von automatisch skalierten Grafiken gezeichnet:
Die Legende zeigt auch die aktuellen Mengen der einzelnen Artikel an.
Systemstabilität
Die Grafiken zeigen, dass die Anfangsbedingungen nicht so angemessen skaliert werden. Wenn der Wald zu groß ist, dezimieren zu viele Bären die Holzfällerpopulation, bis genug Pfannkuchenliebhaber hinter Gittern sitzen. Dies führt zu einer anfänglichen Explosion von Holunderbäumen, die wiederum der Holzfällerpopulation hilft, sich zu erholen.
Es scheint, dass 15 die minimale Größe für den Wald ist, um zu überleben. Ein Wald der Größe 10 wird normalerweise nach ein paar hundert Jahren zerstört. Jede Größe über 30 erzeugt eine Karte, die fast voller Bäume ist. Zwischen 15 und 30 kann man die Baumpopulation deutlich schwanken sehen.
Einige strittige Regelpunkte
In den Kommentaren des ursprünglichen Beitrags scheint es, dass verschiedene Zweibeiner nicht denselben Platz einnehmen sollen. Dies widerspricht irgendwie der Regel, dass ein Redneck in einen Pancake-Amateur wandert.
Jedenfalls habe ich diese Richtlinie nicht befolgt. Jede Waldzelle kann eine beliebige Anzahl von Inhyabitanten aufnehmen (und genau null oder einen Baum). Dies könnte einige Konsequenzen für die Effizienz des Holzfällers haben: Ich vermute, dass es ihnen leichter fällt, sich in einen Holunderhaufen zu graben. Bei den Bären erwarte ich keinen großen Unterschied.
Ich habe mich auch dafür entschieden, immer mindestens einen Holzfäller im Wald zu haben, obwohl die Redneck-Population Null erreichen könnte (der letzte Holzfäller auf der Karte wird abgefeuert, wenn die Ernte wirklich schlecht war, was ohnehin nie passieren wird, wenn der Wald nicht gewesen ist vom Aussterben bedroht).
Optimierungen
Um Stabilität zu erreichen, habe ich zwei Optimierungsparameter hinzugefügt:
1) Wachstumsrate der Holzfäller
Ein Koeffizient, der auf die Formel angewendet wird, die die Anzahl der zusätzlichen Holzfäller angibt, die eingestellt werden, wenn genügend Holz vorhanden ist. Auf 1 setzen, um zur ursprünglichen Definition zurückzukehren, aber ich fand, dass ein Wert von etwa 0,5 eine bessere Entwicklung des Waldes (insbesondere der Holunder) ermöglichte.
2) Bärenentfernungskriterium
Ein Koeffizient, der den minimalen Prozentsatz von Holzfällern definiert, die einen Bären in den Zoo schicken. Setzen Sie den Wert auf 0, um zur ursprünglichen Definition zurückzukehren. Diese drastische Bärenbeseitigung beschränkt die Population jedoch im Wesentlichen auf einen Oszillationszyklus von 0-1. Ich habe es auf 0,15 gesetzt (dh ein Bär wird nur dann entfernt, wenn 15% oder mehr der Holzfäller in diesem Jahr getötet wurden). Dies ermöglicht eine moderate Bärenpopulation, die ausreicht, um zu verhindern, dass die Rednecks das Gebiet sauber wischen, aber dennoch einen beträchtlichen Teil des Waldes hacken können.
Nebenbei bemerkt, die Simulation hört nie auf (auch nicht nach den erforderlichen 400 Jahren). Das könnte leicht passieren, tut es aber nicht.
Der Code
Der Code ist vollständig in einer einzigen HTML-Seite enthalten.
Es muss UTF-8-codiert sein , damit die richtigen Unicode-Symbole für Bären und Holzfäller angezeigt werden.
Für die Unicode-gestörten Systeme (zB Ubuntu): Suchen Sie die folgenden Zeilen:
und ändern Sie die Piktogramme für Zeichen leichter Display (
#
,*
, was auch immer)Was nun?
Weitere Anmerkungen sind immer noch willkommen.
NB: Ich bin mir bewusst, dass die Anzahl der Setzlinge / ausgewachsenen / älteren Bäume immer noch ein bisschen chaotisch ist, aber zur Hölle damit.
Außerdem finde ich document.getElementById lesbarer als $, sodass ich mich nicht über das Fehlen von jQueryisms beschweren muss. Es ist absichtlich jQuery-frei. Jedem sein eigenes Recht?
quelle
AngularJS
Hier ist meine Version , die noch in Arbeit ist: Der Code ist ein bisschen ... na ja ... hässlich. Und ziemlich langsam. Ich plane auch, weitere Optionen hinzuzufügen, um die Evolution zu parametrisieren und den Zustand des Waldes zu analysieren. Kommentare und Verbesserungsvorschläge sind willkommen!
Demonstration
quelle
getEntitiesAt
scheint ein CPU-Schwein zu sein! Das Ausführen des Systems mit einem 50x50-Raster dauert auf meinem PC mehr als eine Sekunde pro Monat. Es gibt auch einen Fall, in dem alle Bäume gefällt werden, alle Holzfäller abgefeuert werden und sich die Karte langsam mit Bären füllt :). Versuchen Sie es mit einer kleinen Größe (10 oder weniger), um dies zu erreichen.Forest.tick()
, wennForest.lumberjackList.length == 0
, dannLumberjack.create(<number>, <number>)
.Javascript
Ich denke, das funktioniert meistens. Es gibt ein wackeliges Verhalten, bei dem ich alle neuen Bären / Holzfäller synchron und direkt nebeneinander hervorbringe, weil die Einfügungen faul sind.
Diese Implementierung erlaubt es Holzfällern nicht, auf Setzlingen zu stehen, weil Sie wissen, dass das Trampeln von Setzlingen schlecht ist. Geigenkunst verwendet standardmäßig farbige Rechtecke. Ändern Sie die zweite Zeile in "Falsch", um Buchstaben zum Zeichnen zu verwenden.
Geige
HTML:
Js:
quelle
n = 50
zum Beispiel).Python
Nichts Außergewöhnliches. Ich fügte immer wieder Dinge hinzu, so dass Refactoring angebracht sein könnte. (Und ich habe unitest nicht gemacht, damit immer noch Bugs vorhanden sind).
Ich habe Holzfällern und Bären zufällige Namen gegeben. Bäume sind
i
, dannI
, dann#
, Lumberjacks sindx
, Bären sindo
Einige Ausgaben:
Jahresende
Ende des Spiels
quelle