KIV/PC ZS 2018/2019 VARIANTA 1 (JSi) ZADÁNÍ SEMESTRÁLNÍ PRÁCE OPTIMALIZACE FUNKCE GENETICKÝM ALGORITMEM Zadání Naprogramujte v ANSI C pøenositelnou 1 konzolovou aplikaci, která bude hledat extrém funkce pomocí genetického algoritmu Genetický algoritmus je technika, která napodobuje procesy známe z biologie a hledá tak optimální øe¹ení zadaného problému Podle zadaného problému se nadenuje tzv tness funkce, její¾ hodnota vyjadøuje ¾ivotaschopnost potomka { vhodnost øe¹ení problému Základní princip genetického algoritmu: 1 Náhodnì vytvoøíme nìkolik rùzných øe¹ení zadané úlohy { jedincù 2 Provedeme køí¾ení jedincù 3 Náhodnì zmutujeme malý poèet jedincù 4 Ovìøíme, jak dobøe jeden ka¾dý jedinec øe¹í ná¹ problém tak, ¾e pro ka¾dého získáme hodnotu tness funkce 5 Vytvoøíme novou generaci 6 Opakujeme body 2 a¾ 5 Pro úèely této semestrální práce je pro lep¹í pochopení problematiky naprosto dostaèující èlánek o genetickém algoritmu na Wikipedii Pro detailní zkoumání genetických algoritmù doporuèuji proèíst tutoriál Genetic Algorithms 2 Pro lep¹í pøedstavu o ¹iroké ¹kále problémù, které je mo¾no touto cestou øe¹it viz U¾iteèné odkazy Hotovou práci odevzdejte v jediném archivu typu ZIP prostøednictvím automatického odevzdávacího a validaèního systému Archiv nech» obsahuje v¹echny zdrojové soubory potøebné k pøelo¾ení programu, makele pro Windows i Linux (pro pøeklad v Linuxu pøipravte soubor pojmenovaný makefile a pro Windows makefilewin) a dokumentaci ve formátu PDF vytvoøenou v typograckém systému TEX, resp LATEX Bude-li nìkterá z èástí chybìt, kontrolní skript Va¹i práci odmítne Parametry programu Aplikace bude pøijímat z pøíkazové øádky 2 povinné argumenty: jméno souboru, ve kterém jsou metadata o testované funkci, poèet generací, které mají být provedeny Porgram bude pøijímat také jeden nepovinný argument: -m procento mutací (0-100) 1 Je tøeba, aby bylo mo¾né Vá¹ program pøelo¾it a spustit na PC s operaèním prostøedím Win32/64 (tj operaèní systémy Microsoft Windows NT/2000/XP/Vista/7/8/10) a s bì¾nými distribucemi Linuxu (napø Ubuntu, Mint, OpenSUSE, Debian, atp) Server, na který budete Va¹i práci odevzdávat a který ji otestuje, má nainstalovaný operaèní systém Debian GNU/Linux 91 Stretch s jádrem verze 3278-1 x86 64 a s pøekladaèem gcc 630 2 https://wwwtutorialspointcom/genetic_algorithms 1
Vá¹ program tedy mù¾e být bìhem testování spu¹tìn napøíklad takto: \>gmsexe e:\functions\metatxt 1000 -m 5 Pokud nebudou na pøíkazové øádce uvedeny alespoò dva argumenty, vypi¹te chybové hlá¹ení a struèný návod k pou¾ití programu (v angliètinì) Popis programu Optimalizovaná funkce Funkce, kterou budete optimalizovat, bude dodána ve formì programu ve spustitelné podobì Tento program bude naèítat konguraci ze souboru s metadaty, který je popsán ní¾e Va¹e práce se tedy bude skládat z nìkolikanásobných úprav tohoto souboru a následném spu¹tìní externího programu, který pro vás hodnotu vypoète Za svého bìhu mù¾e na standardní výstup vypisovat podrobné informace o svém bìhu, na poslední øádku vypí¹e hodnotu funkce, kterou optimalizujete, a ukonèí se Jméno souboru s metadaty bude pøedáno jako parametr va¹emu programu Formát souboru s metadaty Soubor na prvním øádku obsahuje pøíkaz pro spu¹tìní programu, který simuluje funkci, uvozený znaky "# " Následuje výèet v¹ech promìnných, které tento program naète pro výpoèet hodnoty funkce Pro hledání optima laïte pouze promìnné, které mají na pøedchozí øádce uvedený denièní obor a za ním typ promìnné (reálné èíslo { R / celé èíslo { Z) striktnì ve formátu popsaném dále, ostatní ponechte beze zmìn #_(a,b);$ jmeno=hodnota kde (a,b) je denièní obor a $ je typ promìnné (R/Z) Tedy v následujícím konguraèním souboru budete ladit pouze promìnou X Promìnnou Z ponecháte beze zmìn: #_e:\functions\fceexe #_(5,90);Z X=0 Z=25 Mapování genu Pro mapování genu se doporuèuje pou¾ít dále uvedený zpùsob 3 Pro celá èísla pou¾ijte jejich binární zápis Pro reálná èísla pou¾ijte konkrétní hodnoty daných promìnných 3 Pokud byste v¹ak rádi vyzkou¹eli jinou variantu a pøinesli nový vlastní nápad, pøijïte jej zkonzultovat a spoleènì vyhodnotíme, zda je takový alternativní pøístup vhodný 2
Køí¾ení Køí¾ení dvou potomkù poté realizujte pro ka¾dou skupinu genù 4 takto: Pro binární zápis celého èísla kombinujte èásti genù rodièù (viz obr 1) Hranici blokù vybírejte v¾dy náhodnì, ale tak, aby spadla mezi bity kódující interval uvedený u promìnné Pro hodnotu reálného èísla vypoèítejte pro potomka novou hodnotu jako aritmetický prùmìr hodnot rodièù Obrázek 1: Ukázka tvorby nových potomkù zeleného a modrého rodièe Zdroj: wwwtutorialspointcom Mutace Mutaci genotypu provádìjte následujícím zpùsobem Podle parametru z pøíkazové øádky -m vyberte urèitou èást z populace 5, kterým náhodnì upravíte èást genù Èást binární reprezentace celého èísla náhodnì pøepí¹ete nulami a jednièkami U reálného èísla reprezentovaného hodnotou vygenerujete náhodnì nové èíslo z uvedeného intervalu U mutovaného potomka v¹ak v¾dy upravte jen jednu skupinu genù Dejte v¹ak pozor, a» mutací neponièíte své nejlep¹í jedince Výstup Výsledkem èinnosti programu budou dva textové soubory (gentxt a valtxt), ve kterých bude souhrn prùbìhu hledání optima Proto¾e celý proces mù¾e být èasovì velice nároèný, tyto soubory tvoøte prùbì¾nì Po ka¾dé generaci na zaèátek souboru gentxt pøipi¹te nejlep¹ího jedince (konkrétní hodnoty optimalizovaných promìnných a výsledek funkce) Výsledný soubor tedy bude øazen tak, ¾e první v souboru jsou nejnovìj¹í výsledky Po ka¾dém získání hodnoty optimalizované funkce zapi¹te do souboru valtxt konkrétní hodnoty ladìných promìnných a výsledek funkce Ukázka výstupu v gentxt 4 Soubor genù popisující jednu vlastnost { v na¹em pøípadì je to jedna konkrétní promìnná mapovaná binárnì nebo hodnotou 5 Pokud není pou¾it pøepínaè -m zvolte hodnotu 5 % 3
--- GENERATION 598 --- 58236 X=45#(5,90);Z Y=028#(01,10);R --- GENERATION 597 --- 57786 X=40#(5,90);Z Y=024#(01,10);R Ukázka výstupu valtxt 58236 X=7#(5,90);Z Y=011#(01,10);R 58236 X=9#(5,90);Z Y=015#(01,10);R U¾iteèné techniky a odkazy Øe¹ení úlohy je zcela ve va¹í kompetenci { zvolte takové techniky, které podle vás nejlépe povedou k cíli Uvedené techniky je mo¾né (ale nikoliv nezbytnì nutné) vyu¾ít pøi øe¹ení úlohy Proto¾e se jedná o postupy víceménì standardní, lze k nim nalézt velké mno¾ství dokumentace: 1 Genetické algoritmy https://wwwtutorialspointcom/genetic_algorithms 2 Genetic algorithm { popis techniky na Wikipedii, https://enwikipediaorg/wiki/genetic_algorithm 3 Genetic algorithms { evolution of a 2D car in Unity https://wwwyoutubecom/watch?v=fkbarpalbkw 4
Obr 2: Genetic algorithms { evolution of a 2D car in Unity 4 Evolution Simulator https://wwwyoutubecom/watch?v=gofws_hhzs8 Obr 3: Evolution Simulator 5 Flexible Muscle-Based Locomotion https://wwwyoutubecom/watch?v=pgaee27nsqw 5
Obr 4: Evolution Simulator 6