Algoritmy

Než začnu vyjmenovávat názvy všech možných algoritmů, tak raději uklidním mladší studenty, aby se nevyděsili pojmů, které možná v životě neslyšeli. Boloňský proces nás bohužel dostal do situace, kdy si studenti po třech semestrech studia musí vybrat téma, i když zatím mají za sebou jen základní kurzy programování a měli by používat algoritmy vyučované v předmětech, které jsou doporučené až v dalších semestrech. Vyučující jsou si tohoto stavu vědomi a očekávané nároky tomu odpovídají. Nicméně něco se k závěrečné práci budete muset naučit.

Jak postupovat?

Přečtěte si tento text hned na začátku semestru (ideálně ještě před začátkem), protože jedna z možných cest je zapsat si navíc předmět, ve kterém se potřebné věci naučíte. V dnešní době se nejedná o jedinou variantu, protože zdrojů na Internetu je mnoho. Můžete si pustit přednášky ze záznamu a předmět splnit později. Navíc se nemusíte omezovat jen na přednášky na MFF UK.

Další cestou je samostatná četba. Pro prvotní seznámení s potřebnými algoritmy bych doporučoval přečíst si jejich stručný popis na Wikipedii nebo poznámky vyučujících k příslušným předmětů. Tyto texty vám dají počáteční intuici, co jednotlivé algoritmy obnáší, a zároveň mohou být ze začátku srozumitelnější než odborná literatura. Za pomoci těchto zdrojů si můžete vybrat téma práce. Poté si s pomocí vedoucího najdete odbornou literaturu, která vám poskytne potřebné znalosti k vypracování závěrečné práce.

Níže uvádím příklady algoritmů, které můžete v mnou zadávaných tématech prací používat. Mnohem podrobnější najdete například na Wikipedii. Pokud jste se s matematickou optimalizací ještě nesetkali, tak začněte na Wikipedii.

Pokud jste se po s vedoucím práce domluvili, že budete používat nějaký algoritmus, se kterým jste zatím nikdy nepracovali, tak bych vám doporučoval si jej nejprve vyzkoušet na jednoduchém příkladu než jej začnete používat v závěrečné práci. Proto níže najdete i odkazy na zadání úloh procvičujících jednotlivé algoritmy.

Příklady algoritmů

Genetický algoritmus
Algoritmus motivovaný na evolučními principy výběru, křížení a motaci DNA v přírodě použitelný na širokou škálu optimalizačních problémů. Úvod na Wikipedii a stránkách Martina Piláta. Jednoduchý příklad použití je problém batohu.
Mravenčí kolonie (Ant colony optimization)
Algoritmus inspirovaný způsobem, jakým mravenci hledají cesty k potravě, a proto se často používá na hledání cest v grafu s různými omezeními. Úvod na Wikipedii a stránkách Martina Piláta. Jednoduchý příklad použití je varianta problému obchodního cestujícího.
Optimalizace hejnem částic (Particle Swarm Optimization)
Algoritmus založený na pohybu částic, kde každá má svoji polohy a rychlost a je přitahována směrem k nejlepšímu známému řešení. Na rozdíl od předchozích algoritmů je vhodný pro spojitou optimalizaci. Úvod na Wikipedii a stránkách Martina Piláta.
Gradientní metody
Algoritmus využívající derivaci k určení směru, ve kterém dostane lepší řešení. Lze použít na optimalizaci libovolné funkce, kterou umíme derivovat. Popis na Wikipedii.
Lokální prohledávání
Algoritmus zkouší, zda lze v aktuálním řešení udělat malou změnu vedoucí ke zlepšení. Popis na Wikipedii.
Memetické algoritmy
Memetické algoritmy kombinují evoluční algoritmy (generický algoritmy, mravenčí kolonie, atd.) a lokální prohledávání. Úvod na Wikipedii a stránkách Martina Piláta.
Genetické programování
Pokud máme dány hodnoty nějaké funkce f v několika bodech (například výstup nějakého experimentu) a chceme najít předpis této funkce nebo alespoň její aproximaci, můžeme použít genetické programování. Úvod na Wikipedii a stránkách Martina Piláta.
Lineární programování
Pokud umíme všechna omezení v daném problému popsat pomocí lineárních rovnic a nerovnic a cílová funkce (fitness) je též lineární, tak optimální řešení nám dá řešič (Gurobi, CPLEX a další). Popis na Wikipedii. Na lineárním programování je založeno mnoho zajímavých algoritmů, například Column generation a Lagrangian relaxation.
Splňování podmínek
Podobně jako pro lineární programování existují obecné programy umějící hledat řešení splňující libovolné matematicky formulovatelné podmínky. Popis na Wikipedii.
Strojové učení
O neuronových sítích a dalších nástrojích strojového učení jste již určitě slyšeli. Můžete je používat nejen k samotnému hledání řešení, ale i jako pomocný nástroj k zrychlení předchozích algoritmů.
Kombinace předchozích algoritmů
Ačkoliv to může znít šíleně, tak je možné v jednom algoritmu kombinovat například lineární programování, evoluční algoritmy a strojové učení. Příklad použití najdete v tomto přehledovém článku. Nicméně doporučuji jen pokud máte předchozí zkušenosti se všemi jednotlivým nástroji.

Doporučené předměty

Ke studiu výše uvedených algoritmů se vám můžou hodit následující předměty.
Lineární programování a kombinatorická optimalizace
Úvod do lineárního programování, na kterým je postavena řada matematických algoritmů. Podrobnosti na stránkách Jiřího Sgalla.
Large Scale Optimization: Exact Methods
Algoritmy vycházející z lineárního programování, zejména řezné nadroviny, Column generation a Lagrangian relaxation.
Large Scale Optimization: Metaheuristics
Heuristické algoritmy k získání co nejlepšího řešení i pro velké úlohy.
Přírodou inspirované algoritmy
Úvod do evolučních algoritmů, neuronových sítí