Evolúciós algoritmus
Az evolúciós algoritmus Darwin fajfennmaradási elméletén alapszik, és a függvény-minimum meghatározására szolgál. Alapfogalmak: Egyed: egy adat szerkezet, amely a probléma lehetséges megoldását képviseli. Gén: az egyed része, egy konkrét számadat. Populáció: egyedek halmaza. Generació: a populáció egy adott pillanatban, azaz egy adott ciklusban
Az algoritmus BEGIN hozd létre a kezdő populációt határozd meg az egyedek életképességét REPEAT /* új generáció létrehozása */ a kevésbé életképes egyedek elpusztítása FOR egyedek száma * 2/3 DO /* uj egyedek létrehozása */ válassz ki két szülőt a fennmaradt populációból hozd létre az utódot határozd meg az utód életképességét add hozzá az utódokat a populációhoz END FOR UNTIL a populáció teljesítette az adott feltételt END
Az algoritmus alkalmazása
Az evolúciós algoritmus megprogramozása
Fő program Két féle képpen hívható meg: A program paramétereit megadjuk, a fő program argumenseiként A program paramétereit a billentyűszerkezetről viszi be a felhasználó Működése: Lefoglalja a memórában a működéséhez szükséges helyet Létrehozza az evolúció szálat Megvárja az evolúció befejeződését Felszabadítja a lefoglalt memóriát
Fő program
Egyed Az egyedek mint a program egy szála vannak bemutatva. Létrehozásuk során egy paramétert kakpnak, ami alapján meg tudják határozni: egy mutatót a függvényre, amelynek a minimumját keressük. a független változót, ami alapján meg tudják határozni a függvény értékét az adott pontban. saját azonosítójukat, ami segítségével meg tudjuk különböztetni az egyedeket. Az egyed paramétere: struct specimenThreadParameters { int iSpecimenNumber; double dIndependentVariable; double (*pfChosenFunction)(double); };
Az egyed működése
Az egyed fukciói void InitializeSpecimenThreadSemaphores(int iNumberOfSpecimenThreads) void CleanUpSpecimenThreads(int iNumberOfSpecimenThreads) void StartSpecimenThread(int iThreadToStart) void WaitForWriteDone(int iNumberOfSpecimenThreads) void KillSpecimenThreads(int iNumberOfSpecimenThreads) void KillSpecimenThread(int iThreadToKill)
Evolúció Az evolúció mint a program egy szála van bemutatva. Az evolúció paramétere: struct evolutionThreadParameters { int iNumberOfSpecimens; double (*pfChosenFunction)(double); int iNumberOfIterations; double dInterval[2]; int iNumberOfFuncMinValues; double dToleration; FILE *fLogFile; };
Az evolúció funkciói void InitializeEvolution(int iNumberOfSpecimenThreads); void CleanUpEvolution(int iNumberOfThreads); void StartThreads(double (*pfChosenFunction)(double), double *dInterval, int iNumberOfSpecimenThreads) void EliminateOneThirdSpecimens(int iNumberOfThreads) void CreateOneThirdSpecimens(int iNumberOfThreads, double (*pfChosenFunction)(double)) bool EndOfTheIteration(int iCurrentIteration, int iNumberOfIterations, int iNumberOfFuncMinValues, double dToleration) void PrintTableHeaders(FILE *fLogFile) void PrintCurrentValues(int iCurrentIteration, FILE* fLogFile) void EndReport(int iCurrentIteration, FILE* fLogFile)
Az egyed az adat bázisban Egy egyed az adat bázisban egy struktúrával van modellezve, amely tartalmazza az egyedekről mindazon infomációkat, amlyek szükségessek az evolúció működéséhez: Független változó Függvényérték Azonosító struct stSpecimen { double dIndependentVariable; double dFunctionValue; int iSpecimenID; };
Adat bázis struct stDataBase { double *pdFunctionMinValues; stSpecimen *stSpecimens; static stDataBase* pstDataBase; static stDataBase* GetPointerToDataBase() { if(pstDataBase == NULL) { pstDataBase = (stDataBase*)malloc(sizeof(stDataBase)); } return pstDataBase; } };
Az adat bázis funkciói void InitializeDataBase(int iNumberOfSpecimenThreads, intiNumberOfFuncMinValues) void CleanUpDataBase() void SortByFuncValue(int iNumberOfSpecimenThreads) void SortByIndependentVariable(int iNumberOfSpecimenThreads) void RandomSort(int iNumberOfSpecimenThreads) void GenerateRandomArray(int iNumberOfSpecimenThreads)
Vége