Sejtautomaták. Szőke Kálmán Benjamin - SZKRADT.ELTE május 17.

Hasonló dokumentumok
Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Programozás II. 2. Dr. Iványi Péter

Programozás C++ -ban

Programozás C++ -ban 2007/4

Conway életjátéka (Conway' s Game of Life)

Elemi alkalmazások fejlesztése I. Olvassunk be egy fájlból egész számokat egy tömbbe. Keressük meg a tömb valamely

1. Alapok. Programozás II

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

2. Alapfeltevések és a logisztikus egyenlet

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Programozási alapismeretek 2009/2010

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

Maximum kiválasztás tömbben

Bevezetés a programozásba. 11. Előadás: Esettanulmány

Bevezetés a programozásba. 6. Előadás: C++ bevezető

Körkörös listák. fej. utolsó. utolsó. fej

Programozás C++ -ban 2007/1

INFORMATIKA tétel 2019

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

117. AA Megoldó Alfréd AA 117.

Géptermi zh-írás forgatókönyve

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

INFORMATIKA tétel 2018

main int main(int argc, char* argv[]) { return 0; } main return 0; (int argc, char* argv[]) main int int int main main main

Bevezetés a programozásba. 9. Előadás: Rekordok

Bevezetés a programozásba I.

Programozás II. 4. Dr. Iványi Péter

Algoritmizálás + kódolás C++ nyelven és Pascalban

Pénzügyi algoritmusok

C++ függelék. Tartalom

Programozás I. gyakorlat

C++ programozási nyelv Struktúrák a C++ nyelvben Gyakorlat

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

Bevezetés a C++ programozásba

Inga. Szőke Kálmán Benjamin SZKRADT.ELTE május 18. A jegyzőkönyv célja a matematikai és fizikai inga szimulációja volt.

Programozás C++ -ban

Algoritmizálás + kódolás C++ nyelven és Pascalban

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök

Objektum elvű alkalmazások fejlesztése. Öröklődés. Készítette: Sike Sándor Gregorics Tibor

INFORMATIKA tétel 2017

Szövegek C++ -ban, a string osztály

Programozás C és C++ -ban

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Pénzügyi algoritmusok

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

Bevezetés a programozásba I.

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök. Adatfolyamok Hibalehetőségek

4. Öröklődés. Programozás II

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Programozás alapjai 1. (BMEVIEEA100)

Minimum feladat: Teljes feladat: Minimum feladat: Teljes feladat: Minimum feladat:

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt

Programozás II gyakorlat. 8. Operátor túlterhelés

Szerző Lővei Péter LOPSAAI.ELTE IP-08PAEG/25 Daiki Tennó

128. AA Megoldó Alfréd AA 128.

Bevezetés a programozásba I.

500. AA Megoldó Alfréd AA 500.

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

Programozás C nyelven (13. ELŐADÁS) Sapientia EMTE

Országzászlók (2015. május 27., Sz14)

500. CC Megoldó Alfréd CC 500.

Programozás II gyakorlat. 4. Öröklődés

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

Bevezetés a programozásba 2

Programozási alapismeretek 1. előadás

Programozás C nyelven 5. ELŐADÁS. Sapientia EMTE

Programozás 6. Dr. Iványi Péter

1. numere.txt n (1 n 10000) n növekvő kilenc a) Pascal/C++ Például: NUMERE.TXT

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Programozás II. 6.Öröklés Dr. Iványi Péter

Programozás C és C++ -ban

Feladat: Nagy számok típusa: Típusérték-halmaz: Típusműveletek: Értékadás operátor: Bitshift << operátor: Összeadás operátor:

Objektum elvű alkalmazások fejlesztése 3. beadandó

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Példa sejtautomatákra. Homokdomb modellek.

EAF I C++ nyelvi elemek felsorolása 1. Alapvet típusok

Programozás C++ -ban 2007/7

C++ programok fordítása

Programozás C nyelven (9. ELŐADÁS) Sapientia EMTE

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

Szekvenciális inputfájl felsorolása

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

500. DD Megoldó Alfréd DD 500.

Programozási Nyelvek (C++) Gyakorlat

Bevezetés a programozásba I.

Gregorics Tibor Egyszerű programok C++ nyelvi elemei 1

Informatika terméktervezőknek

Programozás I. 5. Előadás: Függvények

Átírás:

Sejtautomaták Szőke Kálmán Benjamin - SZKRADT.ELTE 2012. május 17. 1. Bevezetés A legismertebb sejtautomaták egyike a John Conway által kifejlesztett életjáték. Ennek a sejtmozaik háttere olyan, mint a négyzetrácsos füzetlap: ebben a szerkezetben minden sejtnek nyolc sejtszomszédja van. Az egyes sejtek kétféle állapotban lehetnek: élő vagy halott állapotban. Az idő, ahogy minden egyszerűbb sejtautomatában, diszkrét időegységekben telik, és a sejtek működése a következő: Egy olyan sejt helyére, amely halott, de három élő sejtszomszédja van, élő sejt születik. Egy olyan sejt, amely élő volt, és két vagy három szomszédja is élő volt, életben marad. Az összes többi, másmilyen környezetű sejt halott lesz a következő lépésben. Az Életjáték sok érdekes szerkezet mozgását, gyarapodását, vagy elmúlását és sajátos alakzatok tartós fönnmaradását tudja szimulálni. A szimulációs képességének erőssége abban rejlik, hogy maga a játék Turing-teljes, vagyis bármit, amit ki lehet algoritmikusan számolni, az kiszámolható vele. Gardner írta róla, hogy:,,a játék, amit Conway alkotott azonnal híres lett, de közben egy teljesen új matematikai kutatási terület felé is megnyitotta az utat, a sejtautomaták felé. Conway egyik sejtése az volt, hogy a növekedésnek van egy felső korlátja, és 50 dolláros jutalmat ajánlott annak aki igazolni, vagy cáfolni tudja az állítását 1970 előtt. A sejtés megcáfolására az egyik út az, ha az ember felfedez egy mintát, egy úgynevezetett pisztolyt, amely tőle elfelé mozgó alakzatokat lő ki, úgynevezett siklókat. A másik módszerhez egy puffer vonatot kell megalkotni, amely, ahogy halad előre, hátrahagyja a füstjét. A díjat Bill Gosper által vezetett csapat nyerte el a massachusetts-i 1

egyetemről ugyanezen év novemberében. Mára már Gosper glider gun-ként ismert az általuk kifejlesztett minta. 1. ábra. Gosper glider gun 2. Algoritmus A feladatok elvégzéséhez C++ nyelven írt programot készítettem, ami kimenetként számozott.dat fájlokat készít a diszkrét időegységekben kialakúlt sejtmozaikról. Formailag ezek a kimeneti fájlok mátrixoknak felelnek meg, 0 vagy 1-es értékekkel. Az animáció elkészítéséhez Matlab-ot használtam, amivel az elkészített mátrixokat animált.gif-be mentettem ki. 2.1. Conway féle Élet-játék #include <fstream> #include <algorithm> #include <iostream> #include <cmath> #include <string> #include <sstream> using namespace std; int main(int argc, char **argv) string matrix_file; unsigned int N = atoi(argv[2]); //matrx szélesség unsigned int M = atoi(argv[1]); //matrix magasság matrix_file = argv[3]; int n; cout<< "Add meg n erteket: "; cin >> n; ifstream Mat_file(matrix_file.c_str()); 2

int **matrix = new int*[m]; matrix[i] = new int[n]; int **temp_matrix = new int*[m]; temp_matrix[i] = new int[n]; Mat_file >> matrix[m][n]; temp_matrix[m][n]=matrix[m][n]; Mat_file.close(); unsigned int suma; //szomszéd szám for ( unsigned int i=0; i<10 ; i++) ostringstream file; file << i << ".dat"; ofstream result(file.str().c_str()); for ( unsigned int k=1; k<(m-1); k++) for ( unsigned int j=1; j<(n-1); j++) suma=(matrix[k-1][j-1]+matrix[k-1][j]+matrix[k-1][j-1]+matrix[k+1][j-1]+ +matrix[k+1][j]+matrix[k+1][j-1]+matrix[k][j-1]+matrix[k][j+1]); if(suma==(n+1) && matrix[k][j]==0) temp_matrix[k][j]=1; if(suma==(n+1) suma==n && matrix[k][j]==1) temp_matrix[k][j]=matrix[k][j]; if(suma>(n+1) suma<n) temp_matrix[k][j]=0; result << temp_matrix[m][n] << "\t"; matrix[m][n]=temp_matrix[m][n]; result << endl; delete[] matrix[i]; delete[] matrix; delete[] temp_matrix[i]; 3

delete[] temp_matrix; return 0; 2.2. Élet-játék (nyílt peremfeltétel) #include <fstream> #include <algorithm> #include <iostream> #include <cmath> #include <string> #include <sstream> using namespace std; int main(int argc, char **argv) string matrix_file; unsigned int N = atoi(argv[2]); //matrx szélesség unsigned int M = atoi(argv[1]); //matrix magasság matrix_file = argv[3]; int n; cout<< "Add meg n erteket: "; cin >> n; ifstream Mat_file(matrix_file.c_str()); int **matrix = new int*[m]; matrix[i] = new int[n]; int **temp_matrix = new int*[m]; temp_matrix[i] = new int[n]; Mat_file >> matrix[m][n]; temp_matrix[m][n]=matrix[m][n]; Mat_file.close(); unsigned int suma; //szomszéd szám for ( unsigned int i=0; i<10 ; i++) ostringstream file; file << i << ".dat"; ofstream result(file.str().c_str()); for ( unsigned int k=0; k<m; k++) for ( unsigned int j=0; j<n; j++) if (k==1 && j==1) 4

suma=matrix[k+1][j]+matrix[k+1][j+1]+matrix[k][j+1]; else if (k==m && j==n) suma=matrix[k-1][j]+matrix[k-1][j-1]+matrix[k][j-1]; else if (k==1 && j==n) suma=matrix[k+1][j]+matrix[k+1][j-1]+matrix[k][j-1]; else if (k==m && j==1) suma=matrix[k-1][j]+matrix[k][j+1]+matrix[k-1][j+1]; else if (k==1) suma=matrix[k+1][j+1]+matrix[k+1][j-1]+matrix[k][j-1]+matrix[k][j+1]; else if (k==m) suma=matrix[k-1][j+1]+matrix[k-1][j-1]+matrix[k][j-1]+matrix[k][j+1]; else if (j==1) suma=matrix[k-1][j]+matrix[k+1][j]+matrix[k-1][j+1]+matrix[k+1][j+1]; else if (j==n) suma=matrix[k-1][j]+matrix[k+1][j]+matrix[k+1][j-1]+matrix[k-1][j-1]; else suma=matrix[k-1][j+1]+matrix[k-1][j-1]+matrix[k+1][j+1]+matrix[k+1][j-1]+ +matrix[k][j-1]+matrix[k][j+1]; if(suma==(n+1) && matrix[k][j]==0) temp_matrix[k][j]=1; if(suma==(n+1) suma==n && matrix[k][j]==1) temp_matrix[k][j]=matrix[k][j]; if(suma>(n+1) suma<n) temp_matrix[k][j]=0; result << temp_matrix[m][n] << "\t"; matrix[m][n]=temp_matrix[m][n]; result << endl; delete[] matrix[i]; delete[] matrix; 5

delete[] temp_matrix[i]; delete[] temp_matrix; return 0; 2.3. Élet-játék (élő peremfeltétel) #include <fstream> #include <algorithm> #include <iostream> #include <cmath> #include <string> #include <sstream> using namespace std; int main(int argc, char **argv) string matrix_file; unsigned int N = atoi(argv[2]); //matrx szélesség unsigned int M = atoi(argv[1]); //matrix magasság matrix_file = argv[3]; int n; cout<< "Add meg n erteket: "; cin >> n; ifstream Mat_file(matrix_file.c_str()); int **matrix = new int*[m]; matrix[i] = new int[n]; int **temp_matrix = new int*[m]; temp_matrix[i] = new int[n]; Mat_file >> matrix[m][n]; temp_matrix[m][n]=matrix[m][n]; Mat_file.close(); unsigned int suma; //szomszéd szám for ( unsigned int i=0; i<10 ; i++) ostringstream file; file << i << ".dat"; ofstream result(file.str().c_str()); for ( unsigned int k=0; k<m; k++) for ( unsigned int j=0; j<n; j++) 6

if (k==1 && j==1) suma=matrix[k+1][j]+matrix[k+1][j+1]+matrix[k][j+1]+5; else if (k==m && j==n) suma=matrix[k-1][j]+matrix[k-1][j-1]+matrix[k][j-1]+5; else if (k==1 && j==n) suma=matrix[k+1][j]+matrix[k+1][j-1]+matrix[k][j-1]+5; else if (k==m && j==1) suma=matrix[k-1][j]+matrix[k][j+1]+matrix[k-1][j+1]+5; else if (k==1) suma=matrix[k+1][j+1]+matrix[k+1][j-1]+matrix[k][j-1]+matrix[k][j+1]+3; else if (k==m) suma=matrix[k-1][j+1]+matrix[k-1][j-1]+matrix[k][j-1]+matrix[k][j+1]+3; else if (j==1) suma=matrix[k-1][j]+matrix[k+1][j]+matrix[k-1][j+1]+matrix[k+1][j+1]+3; else if (j==n) suma=matrix[k-1][j]+matrix[k+1][j]+matrix[k+1][j-1]+matrix[k-1][j-1]+3; else suma=matrix[k-1][j+1]+matrix[k-1][j-1]+matrix[k+1][j+1]+matrix[k+1][j-1]+ +matrix[k][j-1]+matrix[k][j+1]; if(suma==(n+1) && matrix[k][j]==0) temp_matrix[k][j]=1; if(suma==(n+1) suma==n && matrix[k][j]==1) temp_matrix[k][j]=matrix[k][j]; if(suma>(n+1) suma<n) temp_matrix[k][j]=0; result << temp_matrix[m][n] << "\t"; matrix[m][n]=temp_matrix[m][n]; result << endl; delete[] matrix[i]; 7

delete[] matrix; delete[] temp_matrix[i]; delete[] temp_matrix; return 0; 2.4. Élet-játék (periódikus peremfeltétel) #include <fstream> #include <algorithm> #include <iostream> #include <cmath> #include <string> #include <sstream> using namespace std; int main(int argc, char **argv) string matrix_file; unsigned int N = atoi(argv[2]); //matrx szélesség unsigned int M = atoi(argv[1]); //matrix magasság matrix_file = argv[3]; int n; cout<< "Add meg n erteket: "; cin >> n; ifstream Mat_file(matrix_file.c_str()); int **matrix = new int*[m]; matrix[i] = new int[n]; int **temp_matrix = new int*[m]; temp_matrix[i] = new int[n]; Mat_file >> matrix[m][n]; temp_matrix[m][n]=matrix[m][n]; Mat_file.close(); unsigned int suma; //szomszéd szám for ( unsigned int i=0; i<10 ; i++) ostringstream file; file << i << ".dat"; ofstream result(file.str().c_str()); for ( unsigned int k=0; k<m; k++) 8

for ( unsigned int j=0; j<n; j++) if (k==1 && j==1) suma=matrix[k+1][j]+matrix[k+1][j+1]+matrix[k][j+1]+5; else if (k==m && j==n) suma=matrix[k-1][j]+matrix[k-1][j-1]+matrix[k][j-1]+5; else if (k==1 && j==n) suma=matrix[k+1][j]+matrix[k+1][j-1]+matrix[k][j-1]+5; else if (k==m && j==1) suma=matrix[k-1][j]+matrix[k][j+1]+matrix[k-1][j+1]+5; else if (k==1) suma=matrix[k+1][j+1]+matrix[k+1][j-1]+matrix[k][j-1]+matrix[k][j+1]+3; else if (k==m) suma=matrix[k-1][j+1]+matrix[k-1][j-1]+matrix[k][j-1]+matrix[k][j+1]+3; else if (j==1) suma=matrix[k-1][j]+matrix[k+1][j]+matrix[k-1][j+1]+matrix[k+1][j+1]+3; else if (j==n) suma=matrix[k-1][j]+matrix[k+1][j]+matrix[k+1][j-1]+matrix[k-1][j-1]+3; else suma=matrix[k-1][j+1]+matrix[k-1][j-1]+matrix[k+1][j+1]+matrix[k+1][j-1]+ +matrix[k][j-1]+matrix[k][j+1]; if(suma==(n+1) && matrix[k][j]==0) temp_matrix[k][j]=1; if(suma==(n+1) suma==n && matrix[k][j]==1) temp_matrix[k][j]=matrix[k][j]; if(suma>(n+1) suma<n) temp_matrix[k][j]=0; result << temp_matrix[m][n] << "\t"; matrix[m][n]=temp_matrix[m][n]; result << endl; 9

delete[] matrix[i]; delete[] matrix; delete[] temp_matrix[i]; delete[] temp_matrix; return 0; 2.5. 2D homokdomb (Matlab) function [n_t]=sand(n,i) n_t=zeros(i,1); %In=randi(7,N); In=zeros(N); [m n]=size(in); figure; colormap(gray); imagesc(in); f = getframe; [im,map] = rgb2ind(f.cdata,256, nodither ); pause(5) for kor=1:i %m_rand=randi(n,1); %n_rand=randi(n,1); %In(m_rand,n_rand)=In(m_rand,n_rand)+1; In(m/2,n/2)=In(m/2,n/2)+1; for k=2:m-1 for j=2:n-1 if In(k,j)>=4 In(k+1,j)=In(k+1,j)+1; In(k-1,j)=In(k-1,j)+1; In(k,j+1)=In(k,j+1)+1; In(k,j-1)=In(k,j-1)+1; In(k,j)=In(k,j)-4; n_t(kor)=n_t(kor)+4; end end end In(1,:)=0; In(:,1)=0; In(n,:)=0; In(:,n)=0; imagesc(in) f = getframe; im(:,:,1,kor) = rgb2ind(f.cdata,map, nodither ); pause(0.01) end imwrite(im,map, animation.gif, DelayTime,0.01, LoopCount,inf) end 10

3. Eredmények Az eredményeket az alábbi felsorolásokban írt.gif fájlokban animáltam. A képeken a fehéren látott részek értéke 1, a feketék pedig 0-ák. 3.1. 1. Feladat - Conway féle Élet-játék 1fe_negyzet_n2.gif Az első feladatban kezdő sejtmozaiknak az alábbi elrendezést használtam. 2. ábra. Négyzet és átló 3.2. 2. Feladat - Módosított szabályok 2fe_negyzet_n1.gif 2fe_n3.gif 2fe_n4.gif 2fe_n5.gif 2fe_n6.gif 2fe_n7.gif 2fe_n8.gif 11

Kezdő sejtmozaiknak az alábbi elrendezéseket használtam. 3. ábra. Négyzet, és random háttér 4. ábra. Négyzet réssel, és random háttér 12

3.3. 3. Feladat - Peremfeltételek 3fe_negyzet_elo.gif 3fe_negyzet_nyilt.gif 3fe_negyzet_nyilt_n3.gif 3fe_negyzet_peri.gif Kezdő sejtmozaiknak az első feladatban már bemutatott elrendezést használtam. 3.4. 4. Feladat - 2D homokdomb sand_2d_center.gif sand_2d_rand.gif 5. ábra. Fejlődés középre ejtett homokszemekkel 13

6. ábra. Fejlődés véletlen helyre ejtett homokszemekkel 500 450 N (n t ) y(x) = a x n N (nt) 400 350 300 250 y(x) = a x n a =8604.5 n = 0.97325 R = 0.98969 200 150 100 50 0 0 50 100 150 200 250 300 350 400 n t 7. ábra. Power-law függvény illesztés 14

Tartalomjegyzék 1. Bevezetés 1 2. Algoritmus 2 2.1. Conway féle Élet-játék...................... 2 2.2. Élet-játék (nyílt peremfeltétel).................. 4 2.3. Élet-játék (élő peremfeltétel)................... 6 2.4. Élet-játék (periódikus peremfeltétel)............... 8 2.5. 2D homokdomb (Matlab).................... 10 3. Eredmények 11 3.1. 1. Feladat - Conway féle Élet-játék............... 11 3.2. 2. Feladat - Módosított szabályok................ 11 3.3. 3. Feladat - Peremfeltételek................... 13 3.4. 4. Feladat - 2D homokdomb................... 13 Hivatkozások [1] Jegyzet http://complex.elte.hu/ csabai/szamszim/lecture7/ 15