4. prosince
Maximalizace reálné funkce II.
- porovnání selekcí z minulé hodiny:
- velká část z vás nedosáhla spravedlivější selekcí zlepšení, zkoušela jsem tedy experiment zopakovat
- následující graf srovnává běžnou ruletovou
selekci (eoProportionalSelect z knihovny EO); selekci podle četností a
spravedlivou ruletu (stochastic universal sampling).
- selekce podle četností: Pro každého jedince spočte C = (f_i*pop_size)/sum_f, kde f_i je fitness jedince, pop_size velikost populace, sum_f suma všech fitness přes populaci. C se zaokrouhlí dolů na celé číslo a jedinec je vložen do nové populace C-krát. Případní chybějící jedinci se doplní ruletou. Nakonec je populace zamíchána.
- spravedlivá ruleta: Začne se v náhodném místě rulety a pak se posunejeme o sum_f / pop_size.
- genetické operátory pro reálné kódování
- kód, který jste používali minulou hodinu používal křížení eoSegmentCrossover (lineární kombinace) a eoUniformMutation (změna hodnoty v rozsahu +/-epsilon).
- eoUniformMutation je také známá jako ovlivněná mutace (ovlivněná předchozí hodnotou, dělá pouze malé změny), kromě toho lze použít tzv. nestrannou mutaci (neovlivněná předchozí hodnotou, nová hodnota se volí náhodně s rovnoměrným rozdělením)
- zvláštní případ ovlivněné mutace je tzv. Gaussovská mutace - nová hodnota se volí náhodně z Gaussovského rozdělení se středem v původní hodnotě, t.j. s velkou pravděpodobností dochází k malé změně, ale i velká změna může nastat
- naprogramujte si tyto tři druhy mutací (class MyMut viz operators.h, v ga.cc nezapomeňte změnit, t.j. místo eoUniformMutation dát MyMut (resp. MyMutNestranna, MyMutGauss, apod.)) a porovnejte je mezi sebou
- mutace můžete používat i všechny najednou, viz. třída
eoCombinedMutation
eoUniformMutation<MyIndividual> mutation1(epsilon,p_mut_bit); MyMutNestranan<MyIndividual> mutation2; MyMutGauss<MyIndividual> mutation3; // P_MUT1, P_MUT2 a P_MUT3 jsou psti jednotlivých mutaci eoPropCombinedMonOp<MyIndividual> mutation(mutation1,P_MUT1); mutation.add(mutation2,P_MUT2); mutation.add(mutation3,P_MUT3);
- adaptivní mutace
- myšlenka adaptivní mutace vychází ze zjištění, že z počátku se vyplatí mutovat více (první populace spíše náhodně prohledávají prostor), ke konci méně (jedinci jsou blízko optima, potřeba drobného dolaďování)
- existují různé implementace
- pravděpodobnost mutace záleží na fitness jedince: můžete implementovat tak, že pst mutace je 1, t.j. vždy se volá váš operátor, ve vašem operátoru se rozhodnete zda mutovat nebo ne (mutace může následovat až po křížení, občas bude tedy třeba přepočítat jedinci fitness; jedinec má metodu invalid(), vrací false, když je fitness aktuální; mutaci na začátku předejte pointer/referenci na fitness (eval), aby měla možnost ji volat)
- rozsah mutace záleží na fitness jedince: u jedince se špatnou fitness se provádí větší změny než u jedince s dobrou fitness (např. rozptyl Gaussova rozdělení u Gaussovské mutace může záviset na velikosti fitness)
- zkuste si naprogramovat jednu verzi adaptivní mutace, porovnejte s klasickou mutací
- funkce náhodného generátoru,které se vám mohou hodit:
double rand; rand = rng.uniform(); // rovnomerne rozdeleni v intervalu [0,1] rand = rng.uniform(m); // [0,m] rand = rng.normal(); // normalni rozdeleni s parametry 0,1 rand = rng.normal(mean, stdev);
Body
- 5 bodů - implementace nestranné a ovlivněné mutace + jedné
adaptivní mutace, srovnání těchto mutací (mailem stačí poslat obrázek
srovnávající průběh fitness a krátký komentář; ti, kdo mi to předtím ukázali
na cvičení, můžou velmi stručně)