Intryguje mnie nieco znajdujący się tu diagram przedstawiający 1800 lat historii kultury w wyimaginowanym świecie, który stworzył jakiś facet.
Wydaje się, że tego rodzaju rzeczy mają mocne zastosowania do tworzenia gier, o ile są projektowane na cały świat.
Wygląda na to, że wykonał ten schemat ręcznie. Interesuje mnie to, czy istnieje sposób programowego utworzenia tego rodzaju diagramu.
Gdybyś miał za zadanie generować diagramy w stylu powyższym z losowych wartości, jak byś to zrobił? Czy są jakieś szczególne struktury danych lub algorytmy, które należy wziąć pod uwagę?
architecture
algorithm
pdusen
źródło
źródło
Odpowiedzi:
Jak dokładny chcesz być? Dobrym, ale złożonym wyborem byłaby symulacja całej tej historii:
Np .: dwie sąsiadujące ze sobą wojujące cywilizacje mają większe prawdopodobieństwo rozpoczęcia wojny między sobą, co z czasem prowadzi do zmniejszenia populacji. Cywilizacje kupieckie mają większe zasoby, ale są doskonałym celem inwazji. Te bardzo zaludnione będą rosły szybciej, ale także będą miały większe szanse na głód. Kulturowo heterogeniczne cywilizacje mają mniejszą szansę na wojny wewnętrzne (co może prowadzić do rozpadu). I tak dalej ... Wyniki zmodyfikowałyby również cechy cywilizacyjne: wyższa technologia prowadzi do lepszego handlu, silniejszej broni itp.
Pozwala to również na pewne proceduralne opowiadanie historii: możesz wygenerować nie tylko schemat terytorium, ale także tekstowe opisy historii w czasie. Możesz uczynić ten system tak złożonym, jak chcesz.
EDYCJA: wyzwanie nie jest techniczne, ale dostosowuje heurystykę do generowania realistycznej i interesującej historii. Przyjrzyj się bliżej i pomyśl o 3 wyżej wymienionych punktach ... to właściwie twoje techniczne wyjaśnienie! Przetłumacz go na pętlę (każda iteracja może reprezentować tyle czasu, ile chcesz, 1 rok, pół roku, 1 miesiąc ...) i to wszystko. Będziesz musiał pracować wewnątrz (struktury danych, heurystyka) i dostosować go do konkretnego problemu i potrzeb. To jest trudna część i nikt nie może ci pomóc, ponieważ dotyczy wyobraźni, próby i błędu.
Nie ma wspólnych struktur danych dla tego problemu poza tymi, których będziesz używać do prawie każdego problemu: listy, kolejki, drzewa ... i będą one powiązane dla twojej konkretnej implementacji (czy potrzebuję drzewa genealogicznego? Listy cywilizacji na wojnie - kolejka zadań dla każdego miasta?) Oczywiście potrzebujesz również listy cywilizacji. Wybory są oczywiste i mają zdrowy rozsądek.
Symulacja jest kwestią przypadku / prawdopodobieństwa i można ją robić na tysiąc różnych sposobów z liczbami losowymi. Pomyśl o każdej innej grze, w której bierze udział symulacja, takiej jak menedżerowie futbolu, gry RPG (w końcu punkty wytrzymałości / statystyki to tylko symulacja walki ), gry strategiczne ... To tylko cechy (więc potrzebujesz sposobu na przechowywanie cech i danych cywilizacyjnych) i losowe wyniki na ich podstawie statystycznie (więc będziesz musiał losowo zmienić stan symulacji w oparciu o te cechy).
To jest istota twojego algorytmu: trudna do dostosowania heurystyka: jak rozdzielić cechy na początku symulacji dla każdej cywilizacji i jak statystycznie zmienić stan symulacji na ich podstawie.
W skrócie: twój algorytm jest po prostu pętlą obejmującą symulowany czas z dowolnym pożądanym przyrostem. Krótsze przyrosty prowadzą do dokładniejszej symulacji historycznej, ale oczywiście potrwają dłużej. Wewnątrz twojej pętli będzie kilka heurystyk takich jak (z grubsza):
Po całej tej pracy (lub podczas, gdy nie chcesz przechowywać danych) musisz zinterpretować cały stan symulacji w formacie czytelnym dla człowieka, takim jak tekst, obrazy lub cokolwiek chcesz. Jest to również próba i błąd, bardzo specyficzna dla twojej implementacji.
Specyficzne dla twojego pytania: aby wygenerować diagram podobny do tego w swoim pytaniu, musisz śledzić regiony świata (góra diagramu, oś x, to jest punkt 1: wygeneruj listę regionów w mojej odpowiedzi) i ich cywilizacje (kolory w wykres, punkt 2 ) w czasie (oś y, pętla symulacyjna w punkcie 3 ).
Maszyny stanowesą całkiem dobre w symulowaniu szerokich tematów (powyższy przykład kodu jest przybliżeniem zakodowanej na stałe maszyny stanów) - więc możesz zacząć od wdrożenia prostej struktury maszyny stanów, która jest ogólnie łatwa do poprawienia. Każda cywilizacja zaczynałaby się od jednej z tych maszyn stanowych, a symulacja prowadziłaby każdą maszynę stanową dla każdej tury. Każda machina stanu musiałaby być w stanie współdziałać z inną machiną stanu: na przykład zainicjowanie wojny wpłynęłoby na machinę stanu innej cywilizacji, prawdopodobnie z różnymi skutkami opartymi na ich stanie wewnętrznym - np. Gdyby były w stanie „głodu”, prawdopodobnie chcą negocjować pokój, ale cywilizacja „szukająca kłopotów” prawdopodobnie zemściłaby się. Każdy stan w maszynie miałby znaczący wpływ na cywilizację ” wskaźniki przedstawione powyżej podczas każdej „ramki” (bogactwo, wojowniczość, ludność itp.). Co najważniejsze, nie musisz zmieniać stanów na każdej klatce - tylko wtedy, gdy pojawi się okazja i / lub przypadkowa szansa: pozwala to na wystąpienie długich wydarzeń (takich jak wojna).
źródło
Tak jest. Oto prosty w historii generator historii:
Który produkuje takie dane wyjściowe:
Dostosuj heurystykę, aby utworzyć różne wykresy.
Najprostszym sposobem na to jest zmiana
func = random.choice([merge, split, revolt, conquest])
linii, aby miała więcej niż jedną funkcję o tej samej nazwie. Na przykładfunc = random.choice([merge, split, revolt, conquest, merge, merge])
doprowadzi do częstszego łączenia się narodów.źródło