[CZ] Jak vytvářet grafy a odevzdávat úkoly
Odevzdávání úkolů
Evoluční algoritmy jsou založeny na náhodě, tzn. že každý běh může dopadnout trochu jinak a není tedy možné porovnávat pouze výsledky jednoho běhu. Místo toho je potřeba běh několikrát zopakovat, a podívat se, jak se algoritmus chová v průměrném/nejlepším/nejhorším případě.
Odevzdaný úkol musí obsahovat následující náležitosti:
- Stručný popis toho, co jste udělali a vyzkoušeli. Opravdu stačí napsat 5-10 vět, není třeba psát dlouhé texty.
- Obrázek, který ukazuje, jakým způsobem se mění fitness, resp. optimalizované kritérium v závislosti na počtu vyhodnocení fitness funkce. Obrázek musí zobrazovat (alespoň) průměrnou hodnotu (nebo medián) a první a třetí kvartil. Při porovnání více algoritmů/přístupů musí být všechny v jednom obrázku
- Obrázky nazabalujte (pokud jich není opravdu hodně). Nahrajte je jako samostatné soubory.
Skripty pro vytváření grafů
V repozitáři na Githubu můžete najít soubor plotting.py
. Ten můžete použít jako základ pro vytváření grafů. Hlavní funkcí je utils.plot_experimenty
, která vyžaduje dva argumenty – cestu do adresáře s logy vašich běhů a seznam ID experimentů, které chcete vykreslit (ID experimentu lze nastavit v každém ze skriptů, které dostanete pro každé cvičení v proměnné EXP_ID
.) Navíc můžete také přidat rename_dict, kde můžete zadat čitelnější názvy pro vaše experimenty, které budou zobrazeny v legendě. Pokud jste například použili EXP_ID = 'pop100m0.3'
pro váš experiment s velikostí populace 100 jedinců a pravděpodobností mutace 0,3, můžete přidat parametr rename_dict={'pop100m0.3': 'Velikost populace = 100, pravděpodobnost mutace = 0,3'}
.
Možná budete muset mírně upravit skript, pokud změnit škálování nebo rozsah os. Výsledný graf můžete upravit pomocí dalších matplotlib funkcí. Například pokud chcete změnit škálování vertikální osy na logaritmické, můžete přidat plt.yscale('log')
nad řádek s plt.show()
.
Samostatné skripty
V adresáři jsou také samostatné skripty, které umožňují vytvářet zákresy ze stejných souborů, jaké můžete použít se souborem plotting.py
. Použití výše popsané metody je však pravděpodobně jednodušší a uživatelsky přívětivější.
Pro vytváření grafu průběhu fitness můžete použít skripty createGraphs.ps1
(pro Windows PowerShell), nebo createGraphs.sh
(pro Unix). Oba skripty vyžadují mít nainstalovaný gnuplot
a zároveň ho mít v $PATH
.
Skripty očekávají na vstupu soubory, které obsahují statistické informace o několika nezávislých bězích evolučního algoritmu. Na každé řádce souboru je šest čísel - počet vyhodnocení fitness funkce a pět statistických údajů o fitness nejlepšího jedince v populaci - minimum, první kvartil, průměr, třetí kvartil a maximum. Takové soubory vytváří připravené zdrojové kódy, nebo si je můžete vytvořit sami, pokud programujete od začátku v jiném jazyce.
Použití skriptů je jednoduché. Je nutné mu dát pouze dva parametry, které říkají, jaké výstupy se mají zobrazit a jak se mají jmenovat. Předpokládejme, že máme výstupy ze dvou různých algoritmů v souborech logs/basic.objective_stats
a logs/better.objective_stats
. Pokud chceme tyto dva algoritmy porovnat, stačí zavolat
createGraphs.ps1 -logFileNames basic,better -legendNames Basic,Better
Tím dostaneme porovnání těchto dvou algoritmů v jednom obrázku output.svg
, popisky v legendě budou “Basic” a “Better”, na vertikální ose bude použito logaritmické měřítko.
Skript má ještě další užitečné parametry:
output
určuje jméno výstupního souboru (defaultoutput.svg
)title
určuje jméno grafu (default “Objective value log”)logScale
určuje, které osy budou mít logaritmické měřítko, možné hodnoty jsoux
,xy
,y
a""
(defaulty
)path
určuje adresář, kde jsou soubory s výstupy (default“”
)scale
určuje škálování horizontální osy, např.-scale 1000
vydělí čísla na této ose tisícem (default 1)barsEvery
určuje, jak často se mají zobrazovat error bary, jako počet řádek ve výstupním souboru (default 20)limit určuje
, kde má končit horizontální osa (default“”
)
K dispozici je i Python script, který sice nepotřebuje gnuplot
, ale používá místo něj numpy
a matplotlib
. Jeho parametry jsou podobné jako u výše zmíněných skriptů - podívejte se do jeho nápovědy.
Většina těchto parametrů má za cíl zpřehlednit výsledný graf. Používejte je a experimentujte s nimi, snažte se, aby grafy byly co možná nejpřehlednější. Typické použití jednotlivých parametrů je následující:
- Oba porovnávané algoritmy konvergují dlouho před tím, než doběhne limit počtu generací, v grafu jsou tedy dlouhé rovné čáry, většina zajímavých věcí se děje na začátku -> nastavte vhodně parametr
limit
- Jeden z algoritmů konverguje podstatně rychleji než druhý, takže je na začátku grafu téměř horizontální čára u jednoho algoritmu. U druhého algoritmu je konvergence pomalá a čára je přes celý graf -> nastavte
-logScale
nax
, neboxy
. - Rozdíl v optimalizované hodnotě na začátku a konci evoluce je několik řádů, nejsou tedy vidět malé rozdíly v konvergenci -> nastavte
-logScale
nay
neboxy
. - Error bary jsou moc blízko u sebe a znesnadňují čtení grafu -> nastavte
-barsEvery
na vyšší hodnotu.