- klasický GA předpokládá, že řešení je kódováno vždy binárně
- dnes byste si měli vyzkoušet, jak se bude řešit úloha z minula s
binárním kódováním a ověřit, zda bylo rozumné volit reálné kódování
- kód real-bitGa.zip používá binární
kódování, zkuste si pustit a porovnat s výsledky z minula a předminula
- jedinec = 2 reálné proměnné (2 souřadnice), počet bitů na proměnnou
lze nastavit v ga.cpp ř. 124, např. vars[i].bits = 10
- mě tato varianta nedává příliš dobré výsledky - zkonverguje brzo, ale
téměř vždy k lokálnímu minumu
- zkuste, jestli jde algoritmus nějak vylepšit (jiné psti, operátory,
apod.)
- zkuste různá křížení
// CROSSOVER
// 1-point crossover for bitstring
eo1PtBitXover<Indi> xover1;
// uniform crossover for bitstring
eoUBitXover<Indi> xoverU;
// 2-pots xover
eoNPtsBitXover<Indi> xover2(2);
- a různé mutace
// MUTATION
// standard bit-flip mutation for bitstring
eoBitMutationit mutationBitFlip(P_MUT_PER_BIT);
// mutate exactly 1 bit per individual
eoDetBitFlip<Indi> mutationOneBit;
- zkuste si napsat vlastní mutaci, která zohledňuje důležitost bitů (u
kvalitních jedinců mutuje pouze nižší bity - dělá malé změny)
class MyMut: public eoMonOp<MyIndividual>
{
public:
string
className() const { return "MyMutation"; }
bool operator()(MyIndividual & ind) {
// mutace
return true;
}
};
- předčasné konvergenci se také můžete bránit tak, že pravděpodobnost
křížení bude záviset na vzdálenosti jedinců (nejjednodušší cesta je nastavit
pst křížení na 1 a rozhodovat se přímo v operátoru křížení, zda křížit
nebo ne)