19. října 2006
Seznámení s knihovnou
- cvičení 1 exc1.tgz
- prohlédněte si zdroják FirstBitGA.cpp
- kód eoSGA (jednoduchý genetický algoritmus)
- upravte fitness tak, aby minimalizovala počet jedniček
- cvičení 2: exc2.tgz
- co se změnilo ve zdrojáku?
- podívejte se, jak se dají nastavovat parametry (z command line, ze souboru); zkuste něco změnit, např. velikost populace, psti
- prohlédněte si stats.log, zobrazte si (nejlépe
gnuplot) průběh nejlepší a průměrné fitness
gnuplot> plot "stats.log" w l gnuplot> plot "stats.log" using 1:3 w l
- odkomentuje v souboru fitness.h třídu class Indi : public BaseIndi ; zkuste, co to udělá (asi žádné překvapení ;))
- přepište fitness tak, abyste nalezli následující řešení:
x...x .x.x. ..x.. .x.x. x...x
- pro ty, co se do toho zamotali, jedno z možných řešení (není
optimální, ale snad čitelné):
for (unsigned i = 0; i < _indi.size(); i++) // if diagonal if ( ( (i%SIZE == i/SIZE) || (SIZE-1-i%SIZE == i/SIZE)) ) // diagonal sum += (int) _indi[i]; // _indi[i] is boolean else if ( ((i%SIZE != i/SIZE) && (SIZE-1-i%SIZE != i/SIZE))) // off-diagonal sum += 1 - (int) _indi[i];
Selekce - srovnání různých způsobů selekce
- cvičení 3 (použijte kód ze cvičení 2)
- vyzkoušejte různé selekce (použijte kód ze cvičení 2):
Tournament eoDetTournamentSelect , eoStochTournamentSelect
Roulette wheel eoProportionalSelect
Random eoRandomSelect
- pro každý typ selekce spusťe GA cca 10-krát (můžete použít skript run.sh; nezapomeňte na random seed - nastavujte např. pomocí time(0) )
- ze získaných logů vytvořte jeden obsahující minimální, maximální a průměrnou fitness přes 10 běhů (viz skript min_max.pl )
- zobrazte si pomocí gnuplotu a porovnejte pro různé selekce
- jak se chová náhodná selekce a proč?
- zkuste porovnat Tournament s různými počty jedinců vstupujícími do "tournamentu" (parameter konstruktoru)
- vyzkoušejte různé selekce (použijte kód ze cvičení 2):