Wie genau möchten Sie sein? Eine gute, aber komplexe Wahl wäre, all diese Geschichte zu simulieren:
- Generieren Sie eine zufällige Regionsliste und Nachbarschaften zwischen diesen Regionen.
- Generieren Sie zufällige Zivilisationen mit Merkmalen wie Bevölkerung, Krieg, Technologie ... und bevölkern Sie die Regionen.
- Simulieren Sie so viele Jahre der Geschichte, wie Sie möchten, und bestimmen Sie die Ergebnisse anhand der Merkmale der Zivilisation.
ZB: Zwei benachbarte kriegführende Zivilisationen haben eine höhere Wahrscheinlichkeit, einen Krieg gegeneinander zu beginnen, was mit der Zeit zu einer Verringerung der Bevölkerung führt. Händler-Zivilisationen haben höhere Ressourcen, sind aber ein großartiges Ziel für Invasionen. Stark besiedelte werden schneller wachsen, haben aber auch mehr Hunger. Kulturell heterogene Zivilisationen haben eine geringere Wahrscheinlichkeit für interne Kriege (die zu Auseinanderbrechen führen könnten).
Dies ermöglicht auch ein prozedurales Storytelling: Sie können nicht nur ein Gebietsdiagramm, sondern auch Textbeschreibungen der Geschichte über die Zeit ausgeben. Sie können dieses System so komplex gestalten, wie Sie möchten.
BEARBEITEN: Die Herausforderung ist hier keine technische, sondern die Anpassung der Heuristik für eine realistische und interessante Generierung der Geschichte. Schauen Sie sich die 3 oben genannten Punkte genauer an ... das ist so ziemlich Ihre technische Erklärung! Übersetzen Sie es in eine Schleife (jede Iteration kann so viel Zeit darstellen, wie Sie möchten, 1 Jahr, ein halbes Jahr, 1 Monat ...) und fertig. Sie müssen die Inners (Datenstrukturen, Heuristiken) bearbeiten und an Ihr spezifisches Problem und Ihre Bedürfnisse anpassen. Das ist der schwierige Teil hier und niemand kann dir helfen, da es um Vorstellungskraft, Versuch und Irrtum geht.
Es gibt keine gemeinsamen Datenstrukturen für dieses Problem außer denjenigen, die Sie für fast jedes Problem verwenden: Listen, Warteschlangen, Bäume ... und diese werden für Ihre spezifische Implementierung gebunden (benötige ich einen Stammbaum? Eine Liste der Zivilisationen) im Krieg - eine Reihe von Aufgaben für jede Zivilisation ?) Natürlich braucht man auch eine Liste von Zivilisationen. Die Wahlmöglichkeiten sind offensichtlich und ziemlich vernünftig.
Simulation ist eine Frage des Zufalls / der Wahrscheinlichkeit und Sie können sie auf tausend verschiedene Arten mit Zufallszahlen erstellen. Denken Sie an jedes andere Spiel, in dem Simulationen eine Rolle spielen, wie Fußballmanager, RPGs (schließlich sind Trefferpunkte / Statistiken nur Kampfsimulationen ), Strategiespiele ... Es sind nur Merkmale (Sie müssen also eine Möglichkeit zum Speichern von Zivilisationsmerkmalen und -daten finden). und statistisch auf diesen basierende zufällige Ergebnisse (daher müssen Sie den Simulationsstatus basierend auf diesen Merkmalen zufällig ändern.)
Das ist die Essenz Ihres Algorithmus: die schwer einstellbaren Heuristiken: wie Sie die Charakteristiken zu Beginn der Simulation für jede Zivilisation verteilen und wie Sie den Simulationsstatus basierend darauf statistisch ändern.
Kurz gesagt: Ihr Algorithmus ist nur eine Schleife, die die simulierte Zeit mit einem beliebigen Inkrement abdeckt. Kürzere Inkremente führen zu einer feineren historischen Simulation, werden aber offensichtlich länger dauern. In Ihrer Schleife gibt es eine Reihe von Heuristiken wie (ungefähr):
for each civilization
if civ.isAtWar
civ.population -= civ.population * 0.05;
civ.wealth -= 1000.0;
civ.belligerence += 1.0;
if civ.population < 100
civ.negotiatePeace()
Nach all dieser Arbeit (oder wenn Sie die Daten nicht speichern möchten) müssen Sie den gesamten Simulationsstatus in ein für Menschen lesbares Format wie Text, Bilder oder was auch immer Sie wünschen interpretieren. Dies ist ebenfalls ein Versuch und Irrtum und sehr spezifisch für Ihre Implementierung.
Speziell für Ihre Frage: Um ein Diagramm wie das in Ihrer Frage zu erstellen, müssen Sie die Weltregionen (oben im Diagramm, x-Achse, Punkt 1: Regionsliste in meiner Antwort erstellen) und deren Zivilisationen (Farben in der Grafik) verfolgen Diagramm, Punkt 2 ) durch die Zeit (y-Achse, die Simulationsschleife in Punkt 3. )
Zustandsautomatensind ziemlich gut darin, allgemeine Themen zu simulieren (das obige Codebeispiel ist eine Annäherung an eine hartcodierte Zustandsmaschine). Sie können also mit der Implementierung eines einfachen Zustandsmaschinen-Frameworks beginnen, das insgesamt leicht zu optimieren ist. Jede Zivilisation würde mit einem dieser Zustandsautomaten beginnen und die Simulation würde jeden Zustandsautomaten für jede Runde ausführen. Jede Staatsmaschine müsste in der Lage sein, mit einer anderen Staatsmaschine zu interagieren. Beispielsweise würde die Einleitung eines Krieges die Staatsmaschine einer anderen Zivilisation beeinflussen, möglicherweise mit unterschiedlichen Ergebnissen, die von ihrem internen Zustand abhängen - z Ich möchte über Frieden verhandeln, aber eine Zivilisation, die nach Ärger sucht, würde sich wahrscheinlich revanchieren. Jeder Zustand in der Maschine hätte bedeutende Auswirkungen auf die Zivilisation. “ s Metriken, die oben für jeden "Rahmen" angegeben wurden (Wohlstand, Krieg, Bevölkerung usw.). Am wichtigsten ist, dass Sie nicht bei jedem Frame einen Statuswechsel durchführen müssen - gerade dann, wenn sich eine Gelegenheit und / oder eine zufällige Chance ergibt: Dies ermöglicht das Eintreten von längeren Ereignissen (wie z. B. Krieg).