Warsztat.GDCompo!ProjektyMediaArtykułyQ&AForumOferty pracyPobieranie

Opisz napotkaną sytuację, a redakcja niezwłocznie znajdzie rozwiązanie!

wyślij anuluj

Automaty komórkowe i ich zastosowania

Uwaga! Tekst posiada 1 niepotwierdzonych zmian!

Tekst został importowany z Warsztatowych artykułów. Jego oryginalnym autorem jest Adam Sawicki. Jeżeli został importowany poprawnie, usuń ten szablon!

Abstract
Paper describes basics of cellular automata as a domain of the artificial intelligence. It concentrates on practice showing potential applications in computer games, including textures generation and transformation, as well as physical simulations. It introduces example algorithms. The paper is related to example program that allows experimenting with cellular automata.

Streszczenie
Artykuł opisuje od podstaw automaty komórkowe jako dziedzinę sztucznej inteligencji. Skupia się na zagadnieniach praktycznych prezentując potencjalne zastosowania w grach komputerowych - m.in. w generowaniu i przetwarzaniu tekstur oraz do symulacji fizycznych. Przedstawia konkretne, przykładowe algorytmy, jak również zachęca do kreatywności na tym polu. Publikację uzupełnia przykładowy program pozwalający eksperymentować z automatami komórkowymi.

1. Wstęp

Automaty komórkowe (ang. "cellular automaton", w liczbie mnogiej "cellular automata") zostały wynalezione w latach czterdziestych przez Stanisława Ulama. John von Neumann dostrzegł w nich uproszczony model fizyki rzeczywistego świata i poszukiwał z ich użyciem najprostszych struktur zdolnych do samopowielania się.

Jednym z głównych popularyzatorów tej dziedziny był na początku lat osiemdziesiątych Stephen Wolfram - twórca pakietu Mathematica. Wysunął on tezę, że w regułach automatu komórkowego mogą znaleźć odzwierciedlenie podstawowe prawa przyrody. Podjął też próbę ich systematycznej klasyfikacji. [1]

Automaty komórkowe są zaliczane do szerokiej i modnej ostatnio dziedziny, jaką jest sztuczna inteligencja. W pewnym sensie są pokrewne do metody elementów skończonych i symulacji dynamiki płynów. Mają także związek z chaosem.

Z punktu widzenia programisty, na automat komórkowy składa się struktura danych i algorytm, który na niej operuje. Struktura ta ma postać tablicy komórek pewnego typu. Może to być tablica o dowolnej liczbie wymiarów - od jednowymiarowego wektora, poprzez macierz dwuwymiarową aż po tablice trój- i więcej wymiarowe. W przestawionych przykładach ograniczę się do dwóch wymiarów.

Jako podstawowe parametry opisujące automat komórkowy można wyróżnić:

  1. Typ komórki. W najprostszym przypadku jest to pojedyncza wartość logiczna przyjmująca jeden z dwóch stanów - prawdy lub fałszu. Może to być wartość wyliczeniowa, liczba całkowita, zmiennoprzecinkowa, wektor czy nawet rozbudowana struktura złożona z wielu pól.
  2. Stan początkowy. Może to być wypełnienie całej tablicy określoną wartością, wartościami losowymi, zapamiętanymi wcześniej w pliku czy wczytanymi z innego źródła (np. na podstawie obrazu graficznego) albo wygenerowanymi przez pewien algorytm.
  3. Funkcja przejścia. Tak jak dyskretną przestrzeń w automatach komórkowych stanowi tablica komórek, tak dyskretny czas wyznaczają kolejne cykle przeliczania nazywane dalej iteracjami. Algorytm może w każdej iteracji, według pewnych określonych reguł przeliczać kolejno wszystkie komórki, tylko jedną (na pewnej pozycji pamiętanej między iteracjami jako bieżąca), jeden wiersz tablicy itp. Dla każdej przeliczanej komórki wyliczany jest jej nowy stan na podstawie pewnych parametrów, przede wszystkim jej stanu aktualnego i stanu komórek sąsiednich.

Automat określa się jako sprawiedliwy, kiedy jego działanie jest niezależne od kierunku, w jakim przeliczane są komórki w ramach każdej iteracji. Niezależność tą można uzyskać poprzez pamiętanie dwóch kopii tablicy. Odczyt odbywa się wtedy z jednej, a zapis do drugiej. Dzięki temu podczas przeliczania kolejnych komórek wartości sąsiednich odczytywane są w stanie sprzed modyfikacji.

Jako automaty komórkowe możnaby określać bardzo wiele stosowanych powszechnie algorytmów, np. wszelkie filtry graficzne. Jednak w praktyce określenia tego używa się raczej w pewnych konkretnych przypadkach i zastosowaniach.

Automaty komórkowe wydają się dziedziną mniej znaną, niż inne ciekawe grupy algorytmów (np. algorytmy fraktalne), choć mają szersze zastosowanie i w pewnym sensie są od nich prostsze. Dlatego chciałbym przedstawić kilka przykładów, skupiając się przede wszystkim na potencjalnych zastosowaniach praktycznych.

2. Gra w życie

Ten najbardziej znany z automatów komórkowych (ang. "Conway's Game of Life") działa wg następujących zasad: Komórki są pojedynczymi wartościami logicznymi. Każda z nich może być w stanie aktywnym (logiczna prawda, 1) lub nieaktywnym (logiczny fałsz, 0). W każdej iteracji przeliczane są w sposób sprawiedliwy wszystkie.

Na stan każdej komórki w chwili następnej (po danej iteracji) ma wpływ jej stan i stan komórek sąsiednich w danej chwili (przed tą iteracją). Sąsiedztwo Moore'a to 8 komórek sąsiadujących z daną pionowo, poziomo i na ukos (jak w systemowej grze Saper). Sąsiedztwo Neumanna natomiast to jedynie 4 komórki sąsiadujące z daną w pionie i w poziomie (powyżej, poniżej, na lewo i na prawo).

W grze w życie, dla każdej komórki sprawdzana jest liczba aktywnych komórek sąsiadujących z daną wg sąsiedztwa Moore'a. Może ich być od 0 do 8. Nowy stan komórki wyznacza następująca reguła:

  1. Jeśli jest nieaktywna i dokładnie 3 sąsiednie są aktywne, staje się aktywna.
  2. Jeśli jest aktywna i 2 lub 3 sąsiednie są aktywne, pozostaje aktywna.
  3. W przeciwnym wypadku staje się nieaktywna. [2]

Nazwa tej gry pochodzi od porównania tablicy do terenu, na którym każda komórka (organizm) może być żywa lub martwa. W przedstawionych regułach można doszukać się analogii do sytuacji, kiedy komórki rozmnażają się albo giną z braku towarzystwa bądź ze zbyt dużego zagęszczenia (zobacz plik 1\Life (1).ak).

W oryginalnej, teoretycznej grze w życie plansza powinna być nieskończona. W implementacji komputerowej do częściowej realizacji tego wymagania można używać dynamicznych struktur danych, ale najczęściej wystarcza skończona tablica i założenie, że poza jej zakresem komórki są zawsze nieaktywne.

Do celów wizualizacji bardzo dobre efekty daje rysowanie na inny kolor komórek, które właśnie się "narodziły" lub właśnie "umarły". Potrzebna jest do tego trzecia tablica przechowująca kopię wyników poprzedniej iteracji (zobacz plik 1\Life (2).ak).

Początkowo w grę tą grano bez użycia komputera - na kartce papieru, na tablicy, za pomocą żetonów itp. Dziś można ją znaleźć choćby jako dodatek do edytora Emacs. Ten znany automat komórkowy doczekał się też niezwykle dokładnych analiz, co zaowocowało m.in. zrealizowaniem za jego pomocą funkcji logicznych, a także sklasyfikowaniem i nazwaniem wielu układów komórek pozostających w stanie stabilnym, zmieniających się cyklicznie, a nawet przemieszczających się po planszy czy regularnie wyrzucających z siebie pewne układy. W roku 1982 udowodniono, że w życie jest automatem równoważnym uniwersalnej maszynie Turinga. Oznacza to, że jest zdolny do wykonania każdego algorytmu.

Usystematyzowanie możliwych efektów końcowych automatu (stanu po bardzo wielu czy nieskończenie wielu iteracjach) przysparza problemów. Ogólnie można jednak wyróżnić pewne sytuacje:

  1. Stan stabilny, w którym nic się już nie zmienia.
  2. Stan cyklicznie zmieniający się z pewnym niedużym okresem.
  3. Stan chaotyczny, w którym trudno dopatrzeć się jakiegokolwiek uporządkowania.
  4. Złożone, stabilne konfiguracje lokalne, często o długich czasach życia.

Najciekawsza jest oczywiście ta ostatnia grupa. Jak określił to Piotr Lasoń, "Prostota generuje nam urzekające piękno złożoności" [3].

Inną ciekawą klasą automatów komórkowych jest Akwarium (patrz plik 1\Aquarium.ak). Każda komórka znajduje się w jednym z trzech możliwych stanów określanych jako pusta (ang. "empty"), zajmowana przez ofiarę (ang. "prey") lub przez drapieżnika (ang. "predator"). Reguły tego automatu są nieco bardziej złożone. Można się w nich doszukać analogii do środowiska, w którym dwa gatunki stworzeń rozmnażają się, giną, a drapieżniki zjadają ofiary. Nazwa tego automatu pochodzi z kolei od efektu jego działania przypominającego akwarium, w którym nieustannie pływają przemieszczające się pionowo i poziomo stworzenia zderzając się ze sobą i formując większe struktury.

Jeszcze innym przykładem może być krystalizacja (patrz plik 1\Crystallization.ak i 1\Aggregation.ak). Dwu-, trój- lub więcej stanowe komórki są przeliczane według tablicy, która określa nowy stan komórki na podstawie jej poprzedniego stanu i stanu 4 komórek, które z nią sąsiadują (sąsiedztwo Neumanna). Tablica znajduje się wtedy w pewnym krytycznym stanie pomiędzy statycznym a chaotycznym. Tylko pewne układy komórek są stabilne, inne nieustannie się zmieniają. Dzięki temu pojawia się krystalizacja. [4]

Po wprowadzeniu pewnych modyfikacji gra w życie zyskuje jeszcze inne właściwości. Potrzebna jest do tego tylko jedna tablica, do której od razu wpisywane będą nowe wartości przeliczanych kolejno komórek. Prosta zasada zmiany każdej dwustanowej komórki na aktywną, nieaktywną lub pozostawienia jej stanu bez zmian na podstawie liczby komórek aktywnych w jej sąsiedztwie Neumanna (4-komórkowym) lub Moore'a (8-komórkowym) otoczeniu daje w efekcie automat, który w toku kolejnych iteracji porządkuje losowy początkowo układ komórek tworząc pewne wzory i motywy (zobacz pliki 1\Texture (?).ak).

Kolejne cykle zmieniają w tym obrazie coraz mniej komórek. Trwa to aż do chwili, kiedy całość osiągnie swoisty stan równowagi, w którym kolejne przeliczenia nie zmieniają już nic lub prawie nic. Staje się to się to już po kilku lub kilkunastu cyklach. Za efekt działania automatu uznać można obraz wygenerowany po tych cyklach. Sam proces powstawania tego obrazu jest jednak na tyle ciekawy, że warto go również obserwować. Charakterystyczne jest to, że za każdym razem otrzymuje się inny układ komórek (zależny od stanu początkowego, który jest losowany), ale zawsze występują w nim te same motywy, ma on ten sam wzór (zależny od reguł dla algorytmu przeliczającego).

Algorytm ten można zastosować zarówno do generowania tekstur, jak również do przetwarzania grafiki. Niektóre z możliwych reguł działają bowiem w ten sposób, że wprowadzając do tablicy pewien obraz (np. wczytany z pliku graficznego), a następnie modyfikując losowo pewną liczbę komórek i dokonując przeliczenia tym automatem otrzymuje się ten sam obraz, ale zniekształcony, dostosowany do wzorów generowanych przez dany algorytm.

Automat komórkowy 1
Rys. 1. Fragmenty przykładowych tekstur wygenerowanych przez automaty komórkowe bazujące na grze w życie.

Przykładowo, środkowa spośród tekstur przedstawionych na rys. 1 wygenerowana została za pomocą następującego algorytmu (zobacz plik 1\Texture (2).ak): Tablica wartości logicznych wypełniona zostaje wartościami losowymi o współczynniku wypełnienia 50%. W każdej iteracji przeliczane są wszystkie komórki, a wyniki obliczeń są od razu wprowadzane do tej samej tablicy. Dla każdej komórki zliczana jest ilość komórek aktywnych sąsiadujących z daną pionowo, poziomo lub na ukos (może ich być od 0 do 8, sąsiedztwo Moore'a).

  1. Jeśli ich liczba jest większa od 4, komórka staje się aktywna.
  2. Jeśli jest mniejsza od 4, komórka staje się nieaktywna.
  3. Jeśli jest równa 4, wartość komórki pozostaje bez zmian.

3. Mrówka Langtona

Drugą grupę automatów komórkowych reprezentuje mrówka Langtona (ang. "Langton's Ant", zobacz plik 2\Ant.ak). Od wyżej omówionej odróżnia ją fakt, że w każdej iteracji nie są przeliczane wszystkie komórki, a tylko jedna z nich. Pomiędzy iteracjami pamiętane są dwa parametry:

  1. Bieżąca pozycja (x, y)
  2. Bieżący kierunek (jeden z czterech lub jeden z ośmiu)

W każdym kroku tytułowa "mrówka" wykonuje następujące trzy operacje (niekoniecznie w tej kolejności):

  • Modyfikuje komórkę, na której stoi (pozycja bieżąca)
  • Modyfikuje swój kierunek
  • Podąża w tym kierunku o jedno pole

Dla przykładu, klasyczna mrówka Langtona składa się z tablicy wartości logicznych, pamięta bieżącą pozycję, jeden z 4 możliwych kierunków (prawo, góra, lewo, dół) i postępuje w każdym kroku wg następującego algorytmu:

  1. Jeśli bieżące pole jest aktywne, zmienia kierunek o 90 stopni w lewo. Jeśli jest nieaktywne - w prawo.
  2. Neguje wartość logiczną komórki, na której stoi (pole nieaktywne staje się aktywne i na odwrót).
  3. Porusza się o jedno pole w swoim kierunku.

Co ciekawe, mimo takiej prostoty algorytmu efekty jego działania mogą być interesujące. Mrówka porusza się po tablicy i choć nie widać jej samej, widoczne są efekty jej działania. Potrafi wpaść w stan, w którym obracając się porusza się cały czas się na ukos w jednym kierunku aż do zderzenia z jakąś przeszkodą. Potrafi też poruszając się wzdłuż brzegów prostokątnej przeszkody modyfikować je w ciekawy sposób. Ostatecznie jednak, po setkach tysięcy kroków zawsze pozostawia tablicę zupełnie chaotyczną, nieuporządkowaną.

Na wzmiankę zasługuje także grupa algorytmów, które w kolejnych iteracjach wyliczają kolejne wiersze tablicy na podstawie poprzednich. Jako przykład można podać automat generujący znany fraktal - trójkąt Sierpińskiego (patrz plik 2\Sierpinski.ak). Jego zasada działania opiera się na spostrzeżeniu, że fraktal ten można otrzymać zaznaczając nieparzyste liczby w innym znanym obiekcie matematycznym - w trójkącie Pascala. Do obliczeń nie trzeba jednak dokonywać dodawania coraz większych liczb - wystarczy pamiętać ich parzystość. Tak więc stan każdej nowej komórki oblicza się na podstawie pewnych dwóch komórek znajdujących się nad nią według zasady wyprowadzonej z dodawania liczb naturalnych:

  1. Liczba nieparzysta i nieparzysta daje liczbę parzystą.
  2. Liczba nieparzysta i parzysta daje liczbę nieparzystą.
  3. Liczba parzysta i parzysta daje liczbę parzystą.

Co ostatecznie sprowadza się do prostego porównania logicznego: Nowa komórka jest aktywna, jeśli te dwie rozpatrywane powyżej niej są sobie równe (mają taki sam stan).

Jeśli tablice będą stanowiły poszczególne piksele tekstury, a stanem każdej komórki będzie kolor danego piksela, taki automat komórkowy może posłużyć do generowania tekstur. "Robaczek" poruszając się po jej powierzchni tworzy obraz poprzez modyfikację kolorów pikseli, na których staje (patrz plik 2\Textures.ak). [5]

Jeśli zastosowane zostanie "zawijanie" polegające na tym, że robaczek wychodząc poza zakres tekstury wraca z drugiej strony, otrzymany obraz będzie rozkładalny sąsiadująco, tzn. kolejne powtórzenia tekstury rozłożone jedna obok drugiej dają jednolity wzór i nie są widoczne łączenia między nimi.

Automat komórkowy 2
Rys. 2. Przykładowe tekstury wygenerowane przez automaty komórkowe bazujące na mrówce Langtona.

Na taki automat służący do generowania tekstur składają się dwa algorytmy:

  1. Algorytm obliczania nowego kierunku. Nowy kierunek może być za każdym razem wyliczany bezwzględnie lub zmieniany względem poprzedniego.
  2. Algorytm modyfikowania koloru. W najprostszym przypadku może to być rozjaśnianie piksela czy pewnej jego składowej o stałą wartość.

Jako dane wejściowe dla tych algorytmów wykorzystywać można różne wielkości:

  • Bieżąca pozycja.
  • Bieżący kierunek.
  • Kolor bieżącego piksela. Kolor można traktować jako pojedynczą liczbę 32-bitową, każdą jego składową jako osobną liczbę 8-bitową, wszystkie składowe odczytywać i modyfikować jednocześnie otrzymując teksturę w odcieniach szarości lub jeszcze na inne sposoby.
  • Kolory sąsiednich pikseli.
  • Stałe. Można podejrzewać, że w pewnych sytuacjach inne właściwości będą miały liczby pierwsze, a inne liczby podzielne przez 2, potęgi dwójki, liczby parzyste itp.
  • Liczniki. To może być prosty licznik iteracji lub licznik zliczający do jakiejś liczby (dalej już nie), licznik modulo (po przekroczeniu zakresu wraca do wartości początkowej), licznik zliczający w przód, wstecz, w obydwie strony (rewersyjny) czy resetowany w pewnych sytuacjach.
  • Liczby losowe. Do tego celu można wykorzystywać różne generatory liczb pseudolosowych: tradycyjne o rozkładzie równomiernym, a także o rozkładzie normalnym, wykładniczym i innych.

Wielkości te można łączyć za pomocą dowolnych funkcji matematycznych (m.in. arytmetycznych, trygonometrycznych), bitowych, logicznych, konwersji między typami itp.

Automat komórkowy nie wykorzystujący liczb losowych daje zawsze te same wyniki zależne wyłącznie od danych początkowych - jest deterministyczny. Tekstura wygenerowana takim automatem posiada regularne wzory. Tekstura otrzymywana za pomocą automatów wykorzystujących generator liczb pseudolosowych jest bardziej jednolicie wypełniona - ma bardziej naturalny, plazmoidalny wygląd.

W praktyce jednak komputery nie są wyposażane w generatory liczb prawdziwie losowych, ale w algorytmy pseudolosowe, w których koleje wartości są wyliczane na podstawie poprzednich, a danymi początkowymi jest tzw. ziarno (ang. "seed"). Wizualizacja działania takiego generatora ujawnia pewne regularności w efektach jego pracy.

Z drugiej strony wykorzystywanie nielosowych danych uwikłanych w coraz bardziej skomplikowaną funkcję daje efekty zbliżone do wykorzystania liczb pseudolosowych. Można więc powiedzieć, że charakter generowanej tekstury zależy od stopnia złożoności funkcji obliczania nowego kierunku. Generatory liczb pseudolosowych są tylko takimi złożonymi funkcjami.

Warto też odnotować, że nawet najmniejsza zmiana rozmiarów (szerokości czy wysokości) tekstury powoduje całkowitą zmianę otrzymywanych kształtów.

4. Symulacje fizyczne

Innymi zastosowaniami automatów komórkowych, niż czysto wizualne, są symulacje fizyczne. Na tym polu również mogą być przydatne w grach, choć nie tylko w nich. Komórki stanowią pewne wycinki zdyskretyzowanej przestrzeni, a kolejne iteracje - dyskretnego czasu. Komórka przechowuje pewne wielkości fizyczne, np. ilość powietrza. Dla każdej z nich dokonuje się obliczeń wg prostych wzorów biorąc pod uwagę wartości komórek sąsiednich i wartość poprzednią komórki danej. W ten sposób układ może na przykład dążyć do równomiernego rozłożenia ciśnienia powietrza w całej dostępnej przestrzeni.

Zaskakujące jest, że proste algorytmy (praktycznie w ogóle nie wymagające matematyki z wyjątkiem podstawowych działań arytmetycznych) dają tak złożone i realistyczne efekty. Na przykład w symulacji wody fale rozchodzą się koliście mimo, że komórki to siatka kwadratów i nie jest zastosowany żaden wzór na okrąg czy odległość między punktami. W rozważaniach teoretycznych komórki uznaje się za bezkształtne (wcale nie muszą być wizualizowane, czasem wystarcza sam efekt ich działania). Tablica może być trójwymiarowa, co otwiera możliwości zastosowania w grach 3D.

W zastosowaniach naukowych symulacje muszą być przede wszystkim dokładne i największą uwagę skupia się zwykle na błędach. W inżynierii gier najważniejsza jest wydajność (szybkość działania) i efekt końcowy.

W zastosowaniu automatów komórkowych do symulacji efekty są podobne niezależnie od tego, jakie otoczenie komórki się rozpatruje (np. 4, 8 czy 12 komórek sąsiednich). Dlatego dla optymalizacji i prostoty warto wybierać najmniejsze z nich. [6]

Jako przykład przygotowałem symulację rozchodzenia się fal na wodzie (patrz plik 3\Waves.ak) [7] oraz przepływu wiatru (plik 3\Wind.ak).

Zastosowania automatów komórkowych w symulacjach fizycznych są bardzo szerokie. Za ich pomocą modelować można różne zjawiska fizyczne (jak rozprzestrzenianie się ognia, kurzu, pożary, eksplozje, przepływ cieczy, gazów, ciepła itp.) i socjofizyczne (jak epidemie, zmiany poglądów ludzi pod wpływem otoczenia czy symulacje zachowań tłumu). [8]

5. Podsumowanie

W artykule w sposób przeglądowy opisałem szerokie spektrum różnych możliwych implementacji automatów komórkowych. Wśród nich znalazły się zarówno powszechnie znane, klasyczne w tej dziedzinie algorytmy (gra w życie, mrówka Langtona), jak również inne, mające potencjalne zastosowanie praktyczne (przetwarzanie obrazu, generowanie tekstur, symulacja fal i wiatru), w tym pewne konkretne implementacje opracowane przeze mnie w trakcie kilkuletniego zainteresowania tą dziedziną czy specjalnie na potrzeby niniejszego referatu.

Artykuł skupia się na potencjalnych zastosowaniach praktycznych omawianej dziedziny (szczególnie w grach komputerowych) i opisuje automaty komórkowe pod kątem ich implementacji w kodzie programów komputerowych.

Automaty komórkowe wyróżniają się prostotą rozwiązań w stosunku do złożoności otrzymywanych efektów. Są nie tylko efektowną zabawką, ale obiecującą dziedziną sztucznej inteligencji o licznych zastosowaniach - od generowania tekstur i przetwarzania obrazu, poprzez symulacje fizyczne i socjofizyczne, aż po... kryptografię. Przydatność w tej ostatniej dziedzinie nie jest jeszcze dobrze zbadana. Opiera się na spostrzeżeniu, że przeliczenie pewnych danych początkowych przez automat komórkowy jest proste, zaś odwrócenie tego procesu i otrzymanie danych wejściowych na podstawie wyników okazuje się być bardzo trudne lub wręcz niemożliwe (wyjątkiem jest tu pewna klasa automatów - automaty odwracalne, ang. "reversible").

Artykuł uzupełnia napisany specjalnie w tym celu program - Automaty komórkowe 1.0. Przeznaczony jest dla systemu Windows i używa DirectX 9.0c. Umożliwia wczytywanie i interpretowanie plików AK. Pierwsza część takiego pliku opisuje sposób działania i wizualizacji automatu. Program daje możliwość wyświetlania tablicy jako pikseli tekstury, kolorowych komórek lub jako strzałek (wektorów). Druga część pliku zawiera kod w języku AngelScript (o składni wzorowanej na C++), który steruje obliczeniami. Dzięki temu program jest bardzo elastyczny i pozwala na własne eksperymenty z automatami komórkowymi.

W Internecie można znaleźć wiele materiałów na temat automatów komórkowych. Są to jednak głównie krótkie wzmianki oraz aplety Java.

Bibliografia

  1. Cellular automaton - Wikipedia
  2. Conway's Game of Life - Wikipedia
  3. Lasoń Piotr, "Wirtualne życie", PC Shareware, nr 04/99, s. 15
  4. Cellular Automata and Complex Systems
  5. Zychla Wiktor, "Kurs C++, część 7", CD-Action, nr 11/2000, s. 125
  6. Forsyth Tom, "Modelowanie świata za pomocą automatu komórkowego". Perełki programowania gier, tom 3. Wydawnictwo Helion, 2003, str. 251
  7. McCuskey Mason, "Woda 2D". Programowanie gier w DirectX. Wydawnictwo Mikom, 2003, s. 471
  8. Malarz Krzysztof, "Automaty komórkowe nie tylko w fizyce", Software 2.0, nr 02/2004, s. 24
Adam Sawicki

Referat został po raz pierwszy zaprezentowany na II Ogólnopolskiej Konferencji Twórców Gier Komputerowych w Siedlcach, 1-3 kwietnia 2005.

Uzupełnieniem tekstu jest program dostępny na licencji GNU GPL wraz z kodem źródłowym, dokumentacją i przykładami - Automaty komórkowe 1.0.

Tekst dodał:
Adam Sawicki
15.02.2006 19:54

Ostatnia edycja:
Adam Sawicki
15.02.2006 19:54
(+ 1 niepotwierdzonych zmian)

Kategorie:

Aby edytować tekst, musisz się zalogować.

# Edytuj Porównaj Czas Autor Rozmiar
#2 edytuj (poprz.) 08.03.2014 20:15 Piotr Karkut 26.63 KB (+1.18 KB)
#1 edytuj (bież.) 15.02.2006 19:54 Adam Sawicki 25.45 KB
Zwykły
Do sprawdzenia
Do akceptacji
  • ~orzech 07 września 2007 15:49
    Świetny artykuł, arcyciekawy temat.

    Kolejny raz gratulacje Reg za bardzo klarowny i znakomity językowo styl pisania.
  • ~Fumfel 15 marca 2008 11:42
    Szukam motywów do Sony ericsson k510i Jak ktoś ma to wysłac na e-mail: [email protected]
  • Napisz komentarz:
    Aby dodać swój komentarz, musisz się zalogować.
Licencja Creative Commons

Warsztat używa plików cookies. | Copyright © 2006-2017 Warsztat · Kontakt · Regulamin i polityka prywatności
build #ff080b4740 (Tue Mar 25 11:39:28 CET 2014)