Párhuzamos genetikus algoritmus

Hasonló dokumentumok
Evolúciós algoritmusok

Számítógépes döntéstámogatás. Genetikus algoritmusok

Dr. habil. Maróti György

Programozás alapjai 9.Gy: Struktúra 2.

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

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

értékel függvény: rátermettségi függvény (tness function)

értékel függvény: rátermettségi függvény (tness function)

Algoritmusok Tervezése. 9. Előadás Genetikus Algoritmusok Dr. Bécsi Tamás

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

A genetikus algoritmus, mint a részletes modell többszempontú és többérdekű "optimálásának" általános és robosztus módszere

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

Szimuláció RICHARD M. KARP és AVI WIGDERSON. (Készítette: Domoszlai László)

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

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

Intelligens Rendszerek Elmélete. Párhuzamos keresés genetikus algoritmusokkal

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

10. gyakorlat Tömb, mint függvény argumentum

Genetikus algoritmusok

/* Az iter függvény meghívása és a visszatérő érték átadása a gyok változóba */ gyok = iter( n, a, e ) ;

Programozás I. gyakorlat

2. Visszalépéses keresés

Occam 1. Készítette: Szabó Éva

Keresések Gregorics Tibor Mesterséges intelligencia

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

Keresés képi jellemzők alapján. Dr. Balázs Péter SZTE, Képfeldolgozás és Számítógépes Grafika Tanszék

Universität M Mis is k k olol cic, F Eg a y kultä etem t, für Wi Gazda rts ságcha tudfts o w máis n s yen i scha Kar, ften,

Grid felhasználás: alkalmazott matematika

Képrekonstrukció 9. előadás

Amortizációs költségelemzés

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

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

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

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

Megkülönböztetett kiszolgáló routerek az

Maximum kiválasztás tömbben

Számítógépes képelemzés 7. előadás. Dr. Balázs Péter SZTE, Képfeldolgozás és Számítógépes Grafika Tanszék

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

2. Visszalépéses stratégia

Miskolci Egyetem Gépészmérnöki és Informatikai Kar Informatikai Intézet Alkalmazott Informatikai Intézeti Tanszék

Programozás C++ -ban

INFORMATIKA tétel 2019

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

Képrekonstrukció 6. előadás

Mesterséges Intelligencia MI

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

Bevezetés az informatikába

Genetikus algoritmusok az L- rendszereken alapuló. Werner Ágnes

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Párhuzamos és Grid rendszerek

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

HÁLÓZATSZERŰEN MŰKÖDŐ LOGISZTIKÁVAL INTEGRÁLT TERMELÉSÜTEMEZÉS MEGOLDÁSA GENETIKUS ALGORITMUS ALKALMAZÁSÁVAL. OLÁH Béla

A C programozási nyelv VI. Parancssori argumentumok File kezelés

Információs Technológia

Párhuzamos és Grid rendszerek

Mérési jegyzőkönyv. az ötödik méréshez

Intelligens Rendszerek Elmélete. Párhuzamos keresés genetikus algoritmusokkal. A genetikus algoritmus működése. Az élet információ tárolói

Párhuzamos és Grid rendszerek. Parallel programozás áttekintése. Történelmi áttekintés

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

Csoportos üzenetszórás optimalizálása klaszter rendszerekben

Az MTA Cloud a tudományos alkalmazások támogatására. Kacsuk Péter MTA SZTAKI

Nagyságrendek. Kiegészítő anyag az Algoritmuselmélet tárgyhoz. Friedl Katalin BME SZIT február 1.

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

Információs Technológia

egy szisztolikus példa

Programozás alapjai 5. gyakorlat Vezérlési szerkezetek egymásba ágyazása

Informatika feladatmegoldó verseny. Kiss Elemér Szakkollégium február 19. Dr. Kovács Lehel István

INFORMATIKA tétel 2018

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Vezérlési szerkezetek

Készítette: Trosztel Mátyás Konzulens: Hajós Gergely

Algoritmusok raszteres grafikához

Algoritmus fogalma. Mi az algoritmus? HF: Al Khwarizmi. Egy adott probléma megoldásának leírása elemi lépések sorozatával

Osztott jáva programok automatikus tesztelése. Matkó Imre BBTE, Kolozsvár Informatika szak, IV. Év 2007 január

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Algoritmusok és adatszerkezetek II.

5. Gyakorlat. struct diak {

10. gyakorlat. Pointerek Tárolási osztályok

Készítette: X. Y. 12.F. Konzulens tanár: W. Z.

Programozás alapjai 2.Gy: A C nyelv alapjai P R O

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

A C programozási nyelv I. Bevezetés

A félév során előkerülő témakörök

Adatbázis rendszerek Gy: Algoritmusok C-ben

Óbudai Egyetem. C programozási nyelv

Struktúrák (struct) A struktúra szerkezetét meghatározó deklaráció általános formája:

Programozás alapjai 9. előadás. Wagner György Általános Informatikai Tanszék

Gráfok 2. Legrövidebb utak, feszítőfák. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Pénzügyi algoritmusok

Mesterséges Intelligencia MI

MATLAB alapismeretek III.

ISA szimulátor objektum-orientált modell (C++)

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Átírás:

Párhuzamos genetikus algoritmus Szimuláció Készítette: Eperjesi Alfréd epaeaat.elte

2 1. Bevezetés A GRID rendszerek megjelenésével lehetővé vált a személyi számítógépek, a szuperszámítógépek, a számítógépes laborok, a helyi hálózatok vagy akár a klaszterek összefogása. Egyéni erejüket kihasználva, reális időn belül végezhetőek bonyolult, végtelennek tűnő számítások. A technológia ereje a párhuzamosságban rejlik. A rendszer szimulálására talán a legalkalmasabb egy párhuzamos környezet, egy klaszter. A rendszer erejének bemutatására, egy erre alkalmas algoritmust, a genetikus algoritmust választottam. 2. Célkitűzés A cél, a mesterséges intelligencia területén gyakran alkalmazott evolúciós, vagy genetikus algoritmus párhuzamos megvalósíthatóságának vizsgálata és egy alkalmas módszerrel való elkészítése és elemzése. A dokumentum további részeiben bemutatásra kerül az algoritmus általánosan, majd a párhuzamosítási lehetőségei. Ezután az algoritmust implementációja következik, C nyelven a PVM könyvtár segítségével. Végül véletlenszerűsített populációkkal az algoritmus tesztelésére kerül sor. 3. Genetikus algoritmus A genetikus algoritmusok a nem módosítható szélsőérték keresési módszerek közé tartoznak. Nem adnak pontos eredményt, mert valószínűségi alapokon nyugszanak, de jól alkalmazhatóak nagy terekben, függvények globális szélsőértékeinek keresésére. Egy adott pillanatban nem egyetlen választ, hanem lehetséges válaszok (egyedek) halmazát (populáció) tartják nyílván, amely elemeit minden lépésben megpróbálják egyre jobbakra cserélni. Az alapalgoritmus: Genetikus_Algoritmus() p <- kezdeti populáció while terminálási feltétel nem igaz loop p1 <- szelekció(p) p2 <- rekombináció( p1 ) p3 <- mutáció(p2) p <- visszahelyezés(p, p ) endloop end Genetikus_Algoritmus; Az algoritmus működése: Kezdetben egy véletlen populációt állít elő, majd lépésenként a következő operátorokat hajtja végre a populáción: szelekció: a szülő egyedek kiválasztása rekombináció: a szülők keresztezéséből utódok előállítása mutáció: az utódok kismértékű változtatása visszahelyezés: az utódokat tartalmazó új populáció létrehozása

3 Kódolás Fontos az egyedek megfelelő reprezentációja, az úgynevezett kódolás. A kódolás során egyegyedet jelsorozattal írunk le. A jelekkel (gének) vagy jelek csoportjával az egyednek különböző tulajdonságai adhatók meg (pl. az első pozíció a szem szín, a második és a harmadik a magasság ). A jelnek a jelsorozatban elfoglalt pozíciója határozza meg, mely tulajdonságnak felel meg. A gének alkotják a kromoszómákat, amik egy-egyedet reprezentálnak Az eljárás kromoszómák egy halmazát használja, amit populációnak nevezünk. Fittnesz vagy rátermettségi függvény Ez a módszer egyetlen nem újrahasznosítható része. Speciálisan az adott problémára vonatkozik. Ez az optimalizálási függvény, amely az adott kromoszóma jóságát határozza meg. A fittnesz függvényt minden egyes kromoszómára, minden egyes iterációban ki kell számolni. Szelekció A szülő egyedek kiválasztása. A kiválasztott kromoszómákból jön létre az utód, így a szülő jelen lesz a következő populációban is. A kiválasztás a fittnesz függvény alapján történik. Módszerek: o rulett kerék algoritmus: a rátermettségi függvényre vagy annak skálázására épül o rangsorolásos: rátermettség alapján a kisebb értékűeknek nagyobb esélyt ad o versengő: véletlenül választott egyedcsoportok legjobb egyedét választja o csonkolásos: a rátermettség szerint legjobbak közül választ néhányat Rekombináció Szülő egyedekből utódok létrehozása. A szülők tulajdonságait öröklik az utódok. A leggyakoribb rekombinációs módszer a keresztezés. A keresztezés csak szerkezeti átrendezést jelent. Sokféle keresztezési eljárás ismert. Mutáció Az utódokon kismértékű változtatás végrehajtása. A mutációra kiválasztott bitet (gént) negálja. Az operátor valószínűségét ezrelék nagyságrendűre ajánlott venni. 4. Párhuzamos genetikus algoritmus Mivel az algoritmus egyedek halmazán dolgozik, ezért lehetséges a halmazok részhalmazokra való felosztása és párhuzamos feldolgozása, továbbá a párhuzamosság lehetőséget ad esetleges különböző rátermettségi függvények párhuzamos alkalmazására is a populáción, felgyorsítva így már a kísérleti fázist is. A párhuzamosításra többféle modell állítható fel. Ezek közül az úgynevezett Sziget modell (Island model) kerül megvalósításra.

4 Sziget modell Több populáció fejlődik egyszerre párhuzamosan, elszigetelve egymástól. Egy előre meghatározott szabályrendszer szerint, minden egyes populációból a legrátermettebb egyedek vándorolnak a szigetek között. Így akár lehetőség van különböző operátorok alkalmazására az egyes szigeteken. Lehetséges operátor stratégiák: Szelekció: Rulett-kerék szabály: vegyük a szülő populáció összrátermettségét, majd osszuk el vele az egyes kromoszómák egyéni fittnesz értékét, ekkor 0 és 1 közé eső számokat kapunk, majd véve egy véletlen számot 0 és 1 között, a hozzá legközelebb eső egyed nyeri a kiválasztást A populáció összes tagja közül véletlenszerűen kiválasztott egyedet választja Az első n legrátermettebb közül választ véletlenszerűen Rekombináció: A keresztezési valószínűség különböző az egyes szigeteken Szomszédos egyedek keresztezése Több mint kettő egyedet keresztez Mutáció: A mutációs valószínűség különböző az egyes szigeteken Különböző eloszlású véletlenítés Lehetséges egyedvándorlási stratégiák Minden kiválasztott emigráns minden szigetre eljut Mester-szolga: egy kitüntetett szerepű sziget megkapja az összes szigettől az emigránsokat, majd egy rangsorolás után (másodlagos szelekció) a kiválasztottakat eljuttatja az összes populációba A populációkat egy topológiába rendezzük és csak a szomszédok, cserélik el egymással a kiválasztott egyedeket (pl. lánc, rács topológia) Lehetséges egyed elhelyezési stratégiák: Előre lefoglalt helyre kerülnek Az n leggyengébb egyedet cseréljük le Hasonló egyedek helyére kerülnek Véletlenszerű helyre kerülnek Lehetséges leállási feltételek: Korlátot megadása az iteráció számra Rátermettségi arány átlagos változását figyelembe véve, ha kevésbé változott, akkor leállás A modell lehetséges megvalósítása 1. Egyedreprezentáció, kezdeti populáció előállítása és N részre partícionálása, szomszédsági kapcsolatok definiálása 2. minden egyes populációra a 3. 4. lépés végrehajtása 3. genetikus operátorok végrehajtása 4. szomszédoknak a legrátermettebb egyed elküldése, a szomszédoktól kapott egyedek elhelyezése a populációban 5. ha nem teljesül a leállási feltétel, akkor ugrás a 2. re

5 5. Implementáció Az implementáció a sziget modell alapján készül C nyelven a PVM könyvtár alkalmazásával. A program futtatása a Nyelvi labor (nylab) gépein történik, ahol lehetőség van a klaszter lehetőséget kihasználva párhuzamos programok futtatására. Az implementációban a következő szabályok lettek alkalmazva: Kódolás: megadott hosszúságú kromoszómák, amelyek minden egyes génje egész típusú, 0 és 9 közötti szám Kezdeti populáció: véletlen 0 és kilenc közötti egész szám generálás Fittnesz függvény: gén értékek átlagolása Szelekció: rulett-kerék algoritmus Keresztezés: a gének második felének a megcserélése Mutáció: nem lett alkalmazva Leállási feltétel: felső korlát az iteráció számra Egyedvándorlás: a legrátermettebb egyed átküldése a következő szigetre Egyed elhelyezés: a legrosszabb fittnesz értékű egyed lecserélése az újonnan érkezett egyedre A program működése A program egy n+1 elemű hálózatot épít fel, ahol n db elem egy gyűrűt alkotva valósítja meg a sziget modellt. A szomszédos elemek egymással kommunikálnak és van egy központi szerepet betöltő n+1. elem, aki felépíti a hálózatot és monitorozza az eredményeket. A központ működése (1 db) A központ a program indításakor jön létre. Először megkísérli létrehozni az n db szigetet, ha ez sikerült, akkor elküldi minden szigetnek a megelőző és a következő sziget azonosítóját, továbbá létrehozza a szigethez tartozó kezdeti populációt és elküldi azt. Így létrejön a gyűrű topológia. Ha az inicializálás sikeres volt, akkor egy start üzenettel elindítja a szigeteken a munkát, majd várja az eredményeket, és azt kiírja a képernyőre, megvalósítva így a monitorozást. A szigetek működése (n+1 db) Minden egyes szigeten önállóan fut a genetikus algoritmus. Az algoritmus egyszeri lefutása után a legrátermettebb egyedet a következő szigetre átküldi, majd az előző szigetről vár egy emigráns egyedet, amit a legrosszabb fittnesz értékkel rendelkező egyed helyére helyez. Az átlagos fittnesz értéket minden iteráció végén eltárolja. Ez mindaddig ismétlődik, amíg a leállási feltétel nem teljesül, azaz ebben az esetben, amíg az iterációk száma el nem éri a határt. Végül a tárolt részeredményeket és a végső populációban a legrátermettebb egyedek egyikét elküldi a központnak. A forráskód A program két állományból áll: A központ implementációja: genetic_algorithm_main.c #include <stdio.h> #include <stdlib.h>

6 #include <time.h> #include <math.h> #include <sys/timeb.h> #include "pvm3.h" #define msg_init 1 #define msg_start 2 #define msg_finish 3 int main(int argc, char* argv[]) // argumentumok vizsgalata if( argc == 5 ) //inicializálás hálózat felépítése // valtozo deklaraciok int i, j, msec,k; int populationnumber = atoi(argv[1]); //populációk száma islandnumber = atoi(argv[2]); //szigetek száma int chromosomelength = atoi(argv[3]); //kromoszóma hossza int iterationnumber = atoi(argv[4]); //iterációk száma int *islandids=malloc(sizeof(int)*populationnumber* chromosomelength); int // valtozok az idomeresehez struct timeb start; struct timeb stop; double time, *results; (double*)results = malloc(sizeof(double) * iterationnumber); //az n db taszk elinditasa char *args[] = argv[1], argv[2], argv[3], argv[4], (char*)0; if( pvm_spawn("genetic_algorithm_child", args, PvmTaskDefault, NULL, islandnumber, islandids)<islandnumber ) pvm_perror("spawn : Nem sikerult az n db taszk indítása."); return 1; // szomszéd taszk ID-k és a kezdeti populáció elküldése for(i=0;i<islandnumber;++i) pvm_initsend(pvmdatadefault); if( i == 0 ) pvm_pkint(&islandids[islandnumber-1],1,1); else pvm_pkint(&islandids[i-1],1,1); if( i == islandnumber-1 ) pvm_pkint(&islandids[0],1,1); else pvm_pkint(&islandids[i+1],1,1); for( j=0;j<populationnumber;++j ) for(k=0;k<chromosomelength;++k) int l = (int)((10.0*rand())/(rand_max*1.0)); pvm_pkint(&l,1,1); pvm_send(islandids[i], msg_init); //inicializálás vége ftime(&start); // várakozás az eredményre a csatornából k=0;

7 for(j=0;j<islandnumber;j++) pvm_recv(islandids[j], msg_finish); pvm_upkdouble(results, iterationnumber, 1); printf("\nez innen ( %d ):\n ",islandids[j]); for( i = 0;i<iterationNumber;++i) printf(" %d: %.3f\t",i,results[i]); k++; // befejezés ftime(&stop); msec=stop.time-start.time==0?stop.millitm-start.millitm:1000- stop.millitm + start.millitm; time=(double)msec/1000+stop.time-start.time; printf("\n\n\tszamolasi ido : %.3f sec\n\n\n",time); free(islandids); free(results); else printf("\n\n\n\tnem megfelelo argumentum szam!!!"); help(argv[0]); printf("\nmain: finished."); pvm_exit(); return 0; A sziget implementációja: genetic_algorithm_child.c #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include "pvm3.h" #define msg_init 1 #define msg_start 2 #define msg_finish 3 #define msg_data 4 A fittnesz függvény kiszámítása minden egyedre: void fittness(int* population, int* populationnumber, int* chromosomelength, double *fitnessvalues, double* sumfittness) int i,j; sumfittness[0] = 0.0; for(i = 0; i<*populationnumber; ++i ) int tmp = 0; for(j = 0; j < *chromosomelength; ++j ) tmp += population[i*(*chromosomelength)+j]; fitnessvalues[i] = (1.0*tmp)/((*chromosomeLength)*1.0);

8 sumfittness[0] += fitnessvalues[i]; Segédfüggvény a kiválasztáshoz. void check(int* selected, int* k, double* r, double* fittnessvalues) int i, maxindex = 0; double d = fabs(fittnessvalues[*k]-(*r)); double maxvalue = 0.0; int l = 0; double e; for(i = 0; i<8; ++i) e = fabs(fittnessvalues[selected[i]]-(*r)); if( ( l == 0 ) && ( d < e ) ) l = 1; if( maxvalue < e ) maxvalue = e; maxindex = i; if( l ) selected[maxindex] = *k; Kiválasztás. Rulett-kerék algoritmussal nyolc egyed kiválasztása. void selection(int* selected, int* populationnumber, double* fittnessvalues, double* sumfittness) int i; int k = 0; double t = (1.0*rand()/(RAND_MAX*1.0)); for( i = 0; i<*populationnumber; ++i) fittnessvalues[i] = fittnessvalues[i]/(sumfittness[0]); if( k < 8 ) selected[k] = i; k++; else check(selected, &i, &t, fittnessvalues); A keresztezés. A kiválsaztott egyedek második felének megcserélése. void crossover(int* population, int* selected, int* chromosomelength) int i,j; int* tmp; int half = (*chromosomelength)/2; for( i = 0; i < 4; ++i )

9 for( j = 0; j < half; ++j ) tmp = population[selected[i*2]+half+j]; population[selected[i*2]+half+j]= population[selected[i*2+1]+half+j]; population[selected[i*2+1]+half+j] = tmp; A legrátermettebb egyed megkeresése. int findmostfittness(double* fittnessvalues, int* populationnumber) double maxvalue = fittnessvalues[0]; int maxindex = 0; int i; for( i = 1; i<*populationnumber; ++i) if( maxvalue < fittnessvalues[i] ) maxvalue = fittnessvalues[i]; maxindex = i; return maxindex; A leggyengébb fittnesz függvénnyel rendelkező egyed kiválasztása. int findsmallestfittness(double* fittnessvalues, int* populationnumber) double minvalue = fittnessvalues[0]; int minindex = 0; int i; for( i = 1; i<*populationnumber; ++i) if( minvalue > fittnessvalues[i] ) minvalue = fittnessvalues[i]; minindex = i; return minindex; A főprogram. int main(int argc, char* argv[]) if( argc == 5 ) // valtozo deklaraciok int parenttid, nextislandid, previousislandid, minindex, i, j; int populationnumber = atoi(argv[1]); //populációk száma int chromosomelength = atoi(argv[3]); //kromoszóma hossza int iterationnumber = atoi(argv[4]); int mytid = pvm_mytid(); int *population, *selected, maxindex;

10 double *fittnessvalues, *results, *sumfittness; // memoria lefoglalasa az input adatok fuggvenyeben //a populáció (int*)population = malloc(sizeof(int) * populationnumber * chromosomelength); //a kiválasztott egyedek tárolója (int*)selected = malloc(sizeof(int) * populationnumber); //a fittnesz értékek (double*)fittnessvalues = malloc(sizeof(double) * populationnumber); //részeredmények tárolója (double*)results = malloc(sizeof(double) * iterationnumber); //összfittnesz értékek (double*)sumfittness = malloc(sizeof(double) * 1); parenttid = pvm_parent(); pvm_recv(parenttid, msg_init); //a központtól kapott adatok feldolgozásasa pvm_upkint(&previousislandid, 1, 1); pvm_upkint(&nextislandid, 1, 1); //kezdeti populáció for( i=0;i<populationnumber;++i ) for( j = 0; j < chromosomelength; ++j ) int p; pvm_upkint(&p,1,1); population[i*(chromosomelength)+j] = p; //a genetikus algoritmus int counter = 0; while( counter < iterationnumber ) fittness(population, &populationnumber, &chromosomelength, fittnessvalues, sumfittness); selection(selected, &populationnumber, fittnessvalues, sumfittness); crossover(population, selected, &chromosomelength); //kiválasztott kromoszóma elküldése a következő szigetre maxindex = findmostfittness(fittnessvalues,&populationnumber); pvm_initsend(pvmdatadefault); for(i = 0;i < chromosomelength; ++i) pvm_pkint(&population[maxindex*chromosomelength+i],1,1); pvm_send(nextislandid, msg_data); //a kromoszóma fogadása az előző szigetről minindex = findsmallestfittness(fittnessvalues, &populationnumber); int a; pvm_recv(previousislandid, msg_data); for(i = 0;i < chromosomelength; ++i) pvm_upkint(&a, 1, 1);

11 population[minindex*chromosomelength+i] = a; double result; result = (sumfittness[0]*(1.0))/(1.0*populationnumber); results[counter] = result; counter++; //Eredmények elküldése a központba pvm_initsend(pvmdatadefault); pvm_pkdouble(results, iterationnumber, 1); pvm_send(parenttid, msg_finish); free(population); free(fittnessvalues); free(results); else printf("\n\n\n\tnem megfelelo argumentum szam!!!"); help(argv[0]); pvm_exit(); return 0; A program futtatása A programot a pvm környezetből a következő parancs kiadásával lehet elindítani: spawn -> genetic_algorithm_main popnum islandnum chrlength itnum [filename], ahol: popnum: a populációk száma islandnum: a szigetek száma chrlength: kromoszómák hossza itnum: iterációk száma filename: opcionális, az eredményeket tartalmazó file neve A program kimenete A program a képernyőre és egy file ba is kiírja a részeredményeket és a végeredményeket is. Kiadott parancs: spawn -> genetic_algorith_main 32 1 10 50 file_32_1_10_50 Az output file tartalma: 0 4.731 1 4.856 2 4.962 3 5.062 4 5.162 5 5.228 6 5.225 7 5.319

12 8 5.409 9 5.491 10 5.569 Ahol az első oszlop a populáció számát, a második oszlop pedig az adott sorszámú populáció átlagos rátermettségét jelenti. A fenti példa egy sziget első 10 populációjának a részeredményeit mutatja. A képernyőre kerül az egyes szigetek nyertesei és a számolási idő: Legjobb: 9599989864 Szamolasi ido: 12.451 sec Itt az látható, hogy az adott szigeten a 9599989864 kromoszóma nyert és a program futási ideje 12.451 másodpercig tartott( ez az összes sziget idejét jelenti ). 6. Tesztelés A tesztelési eredmények vizualizálásához a gnuplot programot használtam. Annak érdekében, hogy a tesztelés látványos legyen egy lassító függvény került a genetic_algorithm_child.c forrásba: void delay() int i, j, k = 2; for(i=0;i<10000;i++) for(j=0;j<10000;j++) k = k*1; A delay() függvény minden egyes iteráció végén meghívásra kerül, lassítva ezzel a működést. A teszteléskor 20 számítógép állt rendelkezésre a klaszterben. Ezért a maximális szigetszámot 16 nak vettem. Futási idő Először az kerül vizsgálatra, hogy a futási idő konstans-e, ha elegendő processzor áll a rendelkezésre, azaz ha minden egyes sziget egyszerre tud dolgozni külön-külön. Bemenő adatok: populációk száma: 32 kromoszóma hossza: 10 iteráció szám: 50 Az eredmények a következők lettek:

13 Szigetek száma Futási eredmény 1 12.451 2 12.328 4 12.112 8 11.810 16 12.027 Tehát ha rendelkezésre áll a megfelelő számú processzor, akkor a futási idő konstans, ha figyelmen kívül hagyjuk az esetleges kommunikációs költségekből fakadó némi eltérést. Ebben az esetben az mondható, hogy a bemenő adatok 12 másodperc alatt lettek feldolgozva. Következő vizsgálat célja, hogy hogyan változik a futási idő ha nincs elegendő processzor. Bemenő adatok: populációk száma: 32 kromoszóma hossza: 10 iteráció szám: 50 processzor szám: 4 Szigetek száma Futási idő 1 12.451 2 12.328 4 12.112 8 24.034 16 47.879

14 Megfigyelhető, hogy a futási idő lineárisan nő. Az is látszik az ábrán, hogy ha rendelkezésre áll megfelelő számú (szigetek száma) processzor, akkor a futási idő közel konstans (1-4). Eredmény Az algoritmus működésének, eredményességének a vizsgálata. A továbbiakban a szigetszámnak megfelelő processzor szám rendelkezésre áll. Az ábrákon minden egyes piros vonal egy szigeten történő változást szemléltet. Szekvenciális eset: Bemenő adatok: populációk száma: 32 sziget szám: 1 kromoszóma hossza: 10 iteráció szám: 50 Eredmény: 9599989864 Nem szekvenciális esetek: Bemenő adatok: populációk száma: 32 sziget szám: 4 kromoszóma hossza: 10 iteráció szám: 50

15 Eredmény: 9979977999 Bemenő adatok: populációk száma: 32 sziget szám: 16 kromoszóma hossza: 10 iteráció szám: 50 Eredmény: 9999999999

16 Növelve a populáció számát és az iteráció számot: Szekvenciális eset: Bemenő adatok: populációk száma: 64 sziget szám: 1 kromoszóma hossza: 10 iteráció szám: 100 Eredmény: 5989999699 Nem szekvenciális eset: Bemenő adatok: populációk száma: 64 sziget szám: 4 kromoszóma hossza: 10 iteráció szám: 100 Eredmény: 9899999999

17 Bemenő adatok: populációk száma: 64 sziget szám: 16 kromoszóma hossza: 10 iteráció szám: 100 Eredmény: 9999999999 Az ábrákon jól látszik a párhuzamosságból fakadó nem determinisztikusság. Látható az iteráció szám és a sziget szám növelésével egyre pontosabb eredményt kapunk, ez az átlagos rátermettség végső értékéből következik. Az is jól látható, hogy a párhuzamosság hatására sokkal pontosabb eredmény kapható ugyanannyi idő alatt (a futási időre vonatkozó eredmények miatt). A bemenő adatokra mindkét esetben a 16 szigeten történő számolás már pontos eredményt adott, ugyanis itt a legnagyobb fittnesz érték a 9999999999 es kromoszómához tartozik. 7. Befejezés Összességében elmondható, hogy az algoritmust érdemes párhuzamosítani. A GRID technológia lehetővé teszi különböző architektúrák, operációs rendszerek, nézőpontok együttműködését, kiterjesztve így a párhuzamosságot egy magasabb dimenzióba. A bemutatott algoritmus is bizonyítja, hogy az eddig emberi mértékben véve végtelennek tűnő számítások is egy olyan szintre redukálhatók, amik már korántsem tűnnek megoldhatatlannak. A program elérhető a következő címről: http://people.inf.elte.hu/fred/elte/ga/genetic_algorithm.zip