UWAGA
Ten problem został zaczerpnięty z tego wątku reddit (alert spoilera!) I dostosowałem go, aby pasował do formatu tej witryny. Wszystkie środki należą się użytkownikowi reddit „Coder_d00d”.
W tym problemie przeprowadzimy symulację lasu.
W tym symulowanym lesie zajmiemy się 3 aspektami.
- Drzewa, które mogą być Drzewkiem, Drzewem lub Starszym Drzewem.
- Drwale (ścinał drzewa, zjadł lunch i poszedł do Lawy-try)
- Niedźwiedzie (walczy z drwalami, które pachną naleśnikami)
Ostrzeżenie wstępne: te reguły najprawdopodobniej nie są idealne. Postaraj się je traktować jako wskazówkę, a jeśli potrzebujesz drobnej korekty, która jest w porządku (wskaźniki odradzania zostały wskazane jako problem, zobacz odpowiedź kuroi neko jako przykład tego.
Cykl czasu:
Symulacja będzie symulowana przez miesiące. Będziesz postępował naprzód z „tyknięciem”. Każdy „tik” oznacza miesiąc. Co 12 „tyknięć” oznacza rok. Nasz las będzie się zmieniać i będzie się ciągle zmieniać. Będziemy rejestrować postępy naszego lasu i analizować, co się z nim stanie.
Las:
Las będzie dwuwymiarowym lasem. Będziemy wymagali wprowadzenia N, aby przedstawić rozmiar lasu w siatce o rozmiarze N x N. W każdej lokalizacji możesz trzymać Drzewa, Niedźwiedzie lub Drwale. Mogą zajmować to samo miejsce, ale często zdarzają się zdarzenia, gdy zajmują to samo miejsce.
Nasz las będzie się pojawiał losowo na podstawie wielkości. Na przykład, jeśli twoja wartość N = 10. Będziesz miał 10 na 10 lasów i 100 miejsc.
- 10% lasu utrzyma drwala w 10 losowych miejscach. (przy użyciu naszego 100-punktowego lasu powinno to być 10 drwali)
- 50% lasu pomieści Drzewa (Drzewa mogą być jednego z 3 rodzajów i zaczną jako środkowe „Drzewa”) w losowych miejscach.
- 2% lasu pomieści niedźwiedzie.
To, jak otrzymasz rozmiar lasu, zależy od Ciebie (odczyt ze standardowego pliku, pliku lub wpisania go na stałe). Polecam utrzymanie N na poziomie 5 lub wyższym. Małe lasy nie są zbyt zabawne.
Wydarzenia:
Podczas symulacji będą miały miejsce zdarzenia. Wydarzenia mają miejsce w oparciu o logikę, którą wyjaśnię poniżej. Poniżej opiszę wydarzenia w każdym opisie 3 elementów naszego lasu.
Zdarzenia następują kolejno po drzewach, drwale po drugie, a niedźwiedzie na końcu.
Drzewa:
Każdego miesiąca Drzewo ma 10% szans na odrodzenie nowego „Drzewka”. Na losowej otwartej przestrzeni przy Drzewie masz 10% szansy na stworzenie „Drzewka”.
Na przykład Drzewo pośrodku lasu ma 8 innych miejsc wokół niego. Jeden z nich (jeśli są puste) stanie się „Drzewkiem”.
Po 12 miesiącach istnienia „Drzewko” zostanie ulepszone do „Drzewa”. „Sadzonka” nie może spawnować innych drzew, dopóki nie dojrzeje do „Drzewa”.
Gdy „Sadzonka” stanie się drzewem, może odrodzić inne nowe „Sadzonki”.
Kiedy „Drzewo” istnieje od 120 miesięcy (10 lat), staje się „Starszym Drzewem”.
Starsze Drzewa mają 20% szans na odrodzenie nowego „Drzewka” zamiast 10%.
Jeśli nie ma otwartych sąsiadujących miejsc z Drzewem lub Starszym Drzewem, nie będzie odradzał żadnych nowych Drzew.
Drwale:
Drwale ścinają drzewa, skaczą i skaczą, lubią wyciskać dzikie kwiaty.
Każdego miesiąca drwale będą wędrować. Poruszą się maksymalnie 3 razy do losowo wybranego miejsca, które sąsiaduje w dowolnym kierunku. Na przykład drwal na środku twojej siatki ma 8 miejsc do przejścia. Wędruje w losowe miejsce. Potem znowu. I wreszcie po raz trzeci. Uwaga: może to być dowolne miejsce (aby mogły wejść w niedźwiedzie, co skutkuje maulem).
Gdy drwal się poruszy, jeśli napotka Drzewo (nie drzewko), zatrzyma się i jego wędrówka dobiegnie końca. Następnie zbierze drzewo na drewno. Usuń drzewo. Zyskaj 1 kawałek drewna.
Drwale nie będą zbierać „Sadzonki”.
Drwale zbierają również starsze drzewa. Starsze drzewa są warte 2 kawałki drewna.
Śledzenie drewna:
Co 12 miesięcy ilość pozyskanego drewna jest porównywana z liczbą drwali w lesie.
Jeśli zebrane drewno jest równe lub przekracza liczbę drwali w lesie, wynajmowanych jest kilka nowych drwali i losowo odradzają się w lesie.
Wypracuj liczbę drwali do wynajęcia w:
floor(lumber_collected / number_of_lumberjacks)
Jeśli jednak po upływie 12 miesięcy zebrana ilość drewna jest mniejsza niż liczba drwali, wówczas drwal zostaje zwolniony, aby zaoszczędzić pieniądze, a 1 losowy drwal zostaje usunięty z lasu. Pamiętaj, że nigdy nie zmniejszysz siły roboczej Drwal poniżej 0.
Niedźwiedzie
Niedźwiedzie wędrują po lesie jak drwal. Jednak zamiast 3 pól Niedźwiedź wędruje do 5 pól.
Jeśli niedźwiedź trafi na drwala, przestanie wędrować przez miesiąc. (Na przykład po 2 ruchach niedźwiedź ląduje na polu z drwalem, nie wykona więcej ruchów w tym miesiącu)
Drwale pachną naleśnikami. Niedźwiedzie uwielbiają naleśniki. Dlatego Niedźwiedź niestety zranił i skrzywdził drwala. Drwal zostanie usunięty z lasu (pójdzie do domu i będzie robić zakupy w środy i ma masło bułeczki na herbatę).
Będziemy śledzić to jako wypadek „Maul”.
Zwróć uwagę, że populacja drwala nigdy nie spadnie poniżej 1 - więc jeśli ostatni drwal jest zmasowany, po prostu odradzaj kolejnego.
Śledzenie Maul:
Jeśli w ciągu 12 miesięcy wystąpi 0 wypadków „Maul”, populacja niedźwiedzi wzrośnie o 1. Jeśli jednak zdarzają się wypadki „Maul”, drwali wynajmą zoo, aby złapać w pułapkę i zabrać niedźwiedzia. Usuń 1 losowego niedźwiedzia. Zauważ, że jeśli twoja populacja Niedźwiedzi osiągnie 0 niedźwiedzi, w następnym roku nie będzie wypadków z „Maulem”, więc w przyszłym roku odrodzisz 1 nowego Niedźwiedzia.
Jeśli w lesie jest tylko 1 drwal, który dostanie Mauleda, zostanie odesłany do domu, ale nowy zostanie natychmiast zatrudniony i odrodzony gdzieś indziej w lesie. Populacja drwal nigdy nie może spaść poniżej 1.
Czas:
Symulacja odbywa się przez 4800 miesięcy (400 lat) lub do momentu, gdy nie ma sadzonek, drzew ani starszych drzew.
Wynik:
Co miesiąc będziesz drukować mapę lasu - być może przy użyciu mapy ASCII lub przy użyciu grafiki i kolorów.
Opcjonalne dodatki
- Możesz wyprowadzać populacje drzew, drwali i niedźwiedzi każdego kleszcza.
- Możesz wyświetlać dane wyjściowe za każdym razem, gdy wystąpi zdarzenie (np .: „Niedźwiedź poruszył drwala”.)
Punktacja
To konkurs popularności, więc większość entuzjastów wygrywa!
EDYCJA - Ludzie zauważyli wiele błędów w moich regułach i chociaż możesz zadawać mi pytania, możesz również nieco dostosować reguły, aby pasowały do twojego programu lub interpretacji programu.
źródło
Note that you will never reduce your Lumberjack labor force below 0
w liście drwali pozycja na liście 3. może zmienić to na 1, aby było zgodne z tym, o czym wspomniałeś w dziale niedźwiedzi?Odpowiedzi:
JavaScript + HTML - spróbuj
Zaktualizowano zgodnie z popularnym żądaniem
Ogólne zachowanie
Program jest teraz nieco interaktywny.
Kod źródłowy jest całkowicie sparametryzowany, więc możesz dostosować kilka dodatkowych parametrów wewnętrznych za pomocą swojego ulubionego edytora tekstu.
Możesz zmienić rozmiar lasu.
Wymagane są minimum 2, aby mieć wystarczająco dużo miejsca, aby umieścić drzewo, drwal i niedźwiedź w 3 różnych miejscach, a maksymalna jest arbitralnie ustalona na 100 (co spowoduje, że przeciętny komputer będzie się czołgał).
Możesz także zmienić prędkość symulacji.
Wyświetlacz jest aktualizowany co 20 ms, więc większy krok czasowy zapewni lepsze animacje.
Przyciski pozwalają zatrzymać / uruchomić symulację lub uruchomić ją na miesiąc lub rok.
Ruch mieszkańców lasu jest teraz nieco animowany. Przewidziane są również wydarzenia związane z mulczowaniem i wycinaniem drzew.
Wyświetlany jest również dziennik niektórych zdarzeń. Niektóre wiadomości są dostępne, jeśli zmienisz poziom gadatliwości, ale to zalałoby cię powiadomieniami „Bob wycina jeszcze jedno drzewo”.
Wolałbym tego nie robić, gdybym był tobą, ale nie jestem, więc ...
Obok placu zabaw rysowany jest zestaw automatycznie skalowanej grafiki:
Legenda wyświetla również aktualne ilości każdego elementu.
Stabilność systemu
Wykresy pokazują, że początkowe warunki nie skalują się tak płynnie. Jeśli las jest zbyt duży, zbyt wiele niedźwiedzi dziesiątkuje populację drwali, dopóki wystarczająca liczba miłośników naleśników nie zostanie umieszczona za kratami. Powoduje to początkową eksplozję starszych drzew, co z kolei pomaga odzyskać populację drwali.
Wydaje się, że 15 jest minimalnym rozmiarem lasu do przetrwania. Las wielkości 10 zwykle zostanie zrównany z ziemią po kilkuset latach. Każdy rozmiar powyżej 30 da mapę prawie pełną drzew. Pomiędzy 15 a 30 możesz zaobserwować, że populacja drzew znacznie się oscyluje.
Niektóre sporne punkty zasad
W komentarzach do oryginalnego postu wydaje się, że różne dwunożne nie powinny zajmować tego samego miejsca. Jest to w pewien sposób sprzeczne z regułą, jak szalona wędruje do amatora naleśników.
W każdym razie nie przestrzegałem tej wytycznej. Każda komórka leśna może pomieścić dowolną liczbę mieszkańców (i dokładnie zero lub jedno drzewo). Może to mieć pewne konsekwencje dla wydajności drwala: Podejrzewam, że pozwala im to łatwiej kopać kępę starszych drzew. Jeśli chodzi o niedźwiedzie, nie spodziewam się, że będzie to miało znaczenie.
Zdecydowałem się też mieć zawsze co najmniej jednego drwala w lesie, pomimo twierdzenia, że populacja wąsatego może osiągnąć zero (wystrzelenie ostatniego drwala na mapie, jeśli zbiory były naprawdę słabe, co i tak się nigdy nie zdarzy, chyba że las został odcięty do wyginięcia).
Poprawianie
Aby uzyskać stabilność, dodałem dwa parametry poprawiania:
1) tempo wzrostu drwali
współczynnik zastosowany do wzoru, który podaje liczbę dodatkowych drwali zatrudnionych, gdy jest wystarczająco dużo drewna. Ustaw na 1, aby wrócić do oryginalnej definicji, ale znalazłem wartość około .5, która pozwoliła lasowi (zwłaszcza starszym drzewom) lepiej się rozwijać.
2) kryterium usunięcia niedźwiedzia
współczynnik, który określa minimalny procent zmaltretowanych drwali, aby wysłać niedźwiedzia do zoo. Ustaw na 0, aby wrócić do oryginalnej definicji, ale ta drastyczna eliminacja niedźwiedzia zasadniczo ograniczy populację do cyklu oscylacji 0-1. Ustawiłem go na .15 (tj. Niedźwiedź jest usuwany tylko wtedy, gdy 15% lub więcej drwali zostało zmanipulowanych w tym roku). Pozwala to na umiarkowaną populację niedźwiedzi, co wystarcza, aby zarośla nie wycierały obszaru, ale nadal pozwalały na rozdrobnienie sporej części lasu.
Na marginesie, symulacja nigdy się nie kończy (nawet po upływie wymaganych 400 lat). Można to łatwo zrobić, ale tak nie jest.
Kod
Kod jest w całości zawarty na jednej stronie HTML.
To musi być UTF-8 do wyświetlania odpowiednie symbole zakodowanych w niedźwiedzie i drwali.
W przypadku systemów z obniżonym poziomem Unicode (np. Ubuntu): znajdź następujące linie:
i zmienić piktogramy dla znaków łatwiej wyświetlaczu (
#
,*
, cokolwiek)Co następne?
Dalsze uwagi są nadal mile widziane.
Uwaga: Zdaję sobie sprawę, że liczba drzewek / drzew dojrzałych / starszych jest nadal nieco niechlujna, ale do diabła z tym.
Ponadto uważam, że document.getElementById jest bardziej czytelny niż $, więc nie muszę narzekać na brak jQueryism. JQuery jest celowo bezpłatny. Do każdego własnego, prawda?
źródło
AngularJS
Oto moja wersja , która wciąż jest w toku: kod jest trochę… no… brzydki. I dość wolno. Planuję również dodać więcej opcji, aby sparametryzować ewolucję i przeanalizować stan lasu. Komentarze i propozycje poprawek są mile widziane!
Demonstracja
źródło
getEntitiesAt
wydaje się być świnią procesora! uruchamianie systemu z siatką 50 x 50 zajmuje więcej niż jedną sekundę miesięcznie na moim komputerze. Również zdarza się, że wszystkie drzewa zostają pocięte, wtedy wszystkie drwale zostają zwolnione, a mapa powoli wypełnia się niedźwiedziami :). Wypróbuj mały rozmiar (10 lub mniej), aby to zobaczyć.Forest.tick()
, jeśliForest.lumberjackList.length == 0
, toLumberjack.create(<number>, <number>)
.JavaScript
Myślę, że to głównie działa. Jest pewne dziwne zachowanie, w którym spawnuję wszystkie nowe niedźwiedzie / drwale w synchronizacji i tuż obok siebie, ponieważ lenistwo we wstawkach.
Ta implementacja nie pozwala drwalom stać na sadzonkach, bo wiesz, deptanie sadzonek jest złe. Skrzypce domyślnie używają kolorowych prostokątów, zmień drugą linię na false, aby używać liter do rysowania.
skrzypce
HTML:
Js:
źródło
n = 50
na przykład spróbuj ).Pyton
Nic fajnego. Wciąż dodawałem rzeczy, więc refaktoryzacja może być w porządku. (I nie zrobiłem unitest, więc błędy mogą być nadal obecne).
Nadawałem losowe nazwy drwalom i niedźwiedziom. Drzewa są
i
, potemI
, potem#
, Lumberjacks sąx
, Niedźwiedzie sąo
Niektóre wyjścia:
Koniec roku
Koniec gry
źródło