UČEBNÍ TEXTY OSTRAVSKÉ UNIVERZITY EVOLUČNÍ ALGORITMY. Josef Tvrdík. Opraveno a upraveno, únor 2010

Podobné dokumenty
UČEBNÍ TEXTY OSTRAVSKÉ UNIVERZITY. Přírodovědecká fakulta EVOLUČNÍ ALGORITMY. Josef Tvrdík

pi Ludolfovo číslo π = 3,14159 e Eulerovo číslo e = 2,71828 (lze spočítat jako exp(1)), např. je v Octave, v MATLABu tato konstanta e není

Systém je citlivý na velikost písmen CASE SENSITIVE rozeznává malá velká písmena, např. PROM=1; PROm=1; PRom=1; Prom=1; prom=1; - 5 různých proměnných

Stochastické algoritmy pro globální optimalizaci

KTE / PPEL Počítačová podpora v elektrotechnice

Programovací jazyk Pascal

Základy algoritmizace a programování

Stručný návod k programu Octave

OBJEKTOVÁ KNIHOVNA EVOLUČNÍCH ALGORITMŮ

Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:

Operátory pro maticové operace (operace s celými maticemi) * násobení maticové Pro čísla platí: 2*2

Algoritmizace a programování

- transpozice (odlišuje se od překlopení pro komplexní čísla) - překlopení matice pole podle hlavní diagonály, např.: A.' ans =

cyklus s daným počtem opakování cyklus s podmínkou na začátku (cyklus bez udání počtu opakování)

Pracovní text a úkoly ke cvičením MF002

KTE / PPEL Počítačová podpora v elektrotechnice

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Afinita je stručný název pro afinní transformaci prostoru, tj.vzájemně jednoznačné afinní zobrazení bodového prostoru A n na sebe.

Markov Chain Monte Carlo. Jan Kracík.

Projekční algoritmus. Urychlení evolučních algoritmů pomocí regresních stromů a jejich zobecnění. Jan Klíma

X37SGS Signály a systémy

Seminář z MATLABU. Jiří Krejsa. A2/710 krejsa@fme.vutbr.cz

while cyklus s podmínkou na začátku cyklus bez udání počtu opakování while podmínka příkazy; příkazy; příkazy; end; % další pokračování programu

ALGORITMIZACE A PROGRAMOVÁNÍ

5. Lokální, vázané a globální extrémy

Doňar B., Zaplatílek K.: MATLAB - tvorba uživatelských aplikací, BEN - technická literatura, Praha, (ISBN:

AVDAT Nelineární regresní model

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

11MAMY LS 2017/2018. Úvod do Matlabu. 21. února Skupina 01. reseni2.m a tak dále + M souborem zadané funkce z příkladu 3 + souborem skupina.

Evoluční algoritmy. Podmínka zastavení počet iterací kvalita nejlepšího jedince v populaci změna kvality nejlepšího jedince mezi iteracemi

Princip řešení soustavy rovnic

Jak se matematika poučila v biologii

Datové struktury 2: Rozptylovací tabulky

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

Iterační výpočty. Dokumentace k projektu č. 2 do IZP. 24. listopadu 2004

Operace s vektory a maticemi + Funkce

Aplikovaná numerická matematika - ANM

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Matematika pro informatiky

REGRESNÍ ANALÝZA V PROSTŘEDÍ MATLAB

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Obr. P1.1 Zadání úlohy v MS Excel

Algoritmizace a programování

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

Maturitní otázky z předmětu PROGRAMOVÁNÍ

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

OPTIMALIZACE. (přehled metod)

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ. Modernizace studijního programu Matematika na PřF Univerzity Palackého v Olomouci CZ.1.07/2.2.00/28.

VYUŽITÍ PRAVDĚPODOBNOSTNÍ METODY MONTE CARLO V SOUDNÍM INŽENÝRSTVÍ

Vektorové podprostory, lineární nezávislost, báze, dimenze a souřadnice

Zadání a řešení testu z matematiky a zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia od jara 2014

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

ADAPTIVNÍ ALGORITMUS PRO ODHAD PARAMETRŮ NELINEÁRNÍCH REGRESNÍCH MODELŮ

Numerické metody optimalizace - úvod

0.1 Úvod do lineární algebry

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Jednoduché cykly

Základy programování: Algoritmizace v systému MATLAB

Úvod do optimalizace, metody hladké optimalizace

Přílohy. Příloha 1. Obr. P1.1 Zadání úlohy v MS Excel

fakulty MENDELU v Brně (LDF) s ohledem na disciplíny společného základu (reg. č. CZ.1.07/2.2.00/28.

10. Soustavy lineárních rovnic, determinanty, Cramerovo pravidlo

a počtem sloupců druhé matice. Spočítejme součin A.B. Označme matici A.B = M, pro její prvky platí:

Definice globální minimum (absolutní minimum) v bodě A D f, jestliže X D f

DUM 06 téma: Tvorba makra pomocí VBA

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Heuristiky UNIVERZITA PALACKÉHO V OLOMOUCI KATEDRA MATEMATICKÉ ANALÝZY A APLIKACÍ MATEMATIKY. Vypracovala:

Kreslení grafů v Matlabu

1. Úvod do genetických algoritmů (GA)

Základy algoritmizace a programování

Moderní technologie ve studiu aplikované fyziky CZ.1.07/2.2.00/ Množiny, funkce

1 Soustavy lineárních rovnic

Hledání extrémů funkcí

LDF MENDELU. Simona Fišnarová (MENDELU) Základy lineárního programování VMAT, IMT 1 / 25

4EK213 LINEÁRNÍ MODELY

Základy algoritmizace a programování

0.1 Úvod do lineární algebry

VEKTORY. Obrázek 1: Jediný vektor. Souřadnice vektoru jsou jeho průměty do souřadných os x a y u dvojrozměrného vektoru, AB = B A

Numerické metody 6. května FJFI ČVUT v Praze

POPISNÁ STATISTIKA Komentované řešení pomocí programu Statistica

II. Úlohy na vložené cykly a podprogramy

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

PHP tutoriál (základy PHP snadno a rychle)

V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti

Aproximace funkcí. x je systém m 1 jednoduchých, LN a dostatečně hladkých funkcí. x c m. g 1. g m. a 1. x a 2. x 2 a k. x k b 1. x b 2.

1 Projekce a projektory

Programování v C++, 2. cvičení

1 Linearní prostory nad komplexními čísly

6 Příkazy řízení toku

Příklad elektrický obvod se stejnosměrným zdrojem napětí

Numerické metody a programování. Lekce 8

Matematika (CŽV Kadaň) aneb Úvod do lineární algebry Matice a soustavy rovnic

Zadání a řešení testu z matematiky a zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia od podzimu 2014

Regresní a korelační analýza

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Zadání a řešení testu z matematiky a zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia od podzimu 2016

Numerická matematika 1

8.3). S ohledem na jednoduchost a názornost je výhodné seznámit se s touto Základní pojmy a vztahy. Definice

Četba: Texty o lineární algebře (odkazy na webových stránkách přednášejícího).

Transkript:

UČEBNÍ TEXTY OSTRAVSKÉ UNIVERZITY Přírodovědecká fakulta EVOLUČNÍ ALGORITMY Josef Tvrdík Opraveno a upraveno, únor 2010 OSTRAVSKÁ UNIVERZITA 2010

Obsah 1 Úvod 3 2 Problém globální optimalizace 4 2.1 Formulace problému globální optimalizace.......... 4 2.2 Stochastické algoritmy pro globální optimalizaci....... 5 3 Úvod do Matlabu 8 3.1 Co je Matlab?.......................... 8 3.2 Základní příkazy........................ 8 3.3 Některé příkazové zkratky................... 10 3.4 Znakové řetězce......................... 13 3.5 Nakreslení grafu......................... 13 3.6 Logické výrazy......................... 14 3.7 Řídicí příkazy, zápis algoritmu................. 15 3.8 Doporučení pro vhodný výběr příkazů............ 18 3.9 3D grafika............................ 20 3.10 Práce se soubory........................ 22 4 Náhodné prohledávání 25 5 Simplexová metoda 28 6 Řízené náhodné prohledávání 31 7 Diferenciální evoluce 35 8 Genetické algoritmy 40 9 Evoluční strategie 44 10 Experimentální ověřování a porovnávání algoritmů 48 10.1 Testovací funkce......................... 48 10.2 Experimentální ověřování algoritmů.............. 56 11 Literatura 60 2

1 Úvod Tento text je inovovaná původní studijní opora předmětu Evoluční algoritmy z roku 2004. Je určen studentům povinně volitelného předmětu Evoluční algoritmy v prezenčním i v kombinovaném magisterském studiu na Přírodovědecké fakultě Ostravské university. Cílem textu je seznámit studenty se základy evolučních algoritmů, zejména těch, které jsou vhodné pro hledání globálního minima v souvislé oblasti a také seznámit studenty s principy programování v Matlabu, numerickým testováním stochastických algoritmů pro globální optimalizaci a vyhodnocením numerických experimentů. Každá kapitola začíná pokyny pro její studium. Tato část je vždy označena jako Průvodce studiem s ikonou na okraji stránky. Pojmy a důležité souvislosti k zapamatování jsou vyznačeny na okraji stránky textu ikonou. V závěru každé kapitoly je rekapitulace nejdůležitějších pojmů. Tato rekapitulace je označena textem Shrnutí a ikonou na okraji. Oddíl Kontrolní otázky označený ikonou by vám měl pomoci zjistit, zda jste prostudovanou kapitolu pochopili a snad vyprovokuje i vaše další otázky, na které budete hledat odpověď. U některých kapitol je pro studenty kombinovaného studia zadána Korespondeční úloha, úspěšné vyřešení korespondenčních úloh je součástí podmínek pro získání zápočtu. Pro kombinované studium jsou korespondenční úlohy zadávány v rámci kurzu daného semestru. 3

2 Problém globální optimalizace Průvodce studiem V této kapitole je zformulován problém globální optimalizace a stručně jsou zmíněny základní myšlenky stochastických algoritmů, které se používají pro nalezení globálního minima účelových funkcí. Počítejte asi se dvěma hodinami studia. 2.1 Formulace problému globální optimalizace Úlohu nalezení globálního minima můžeme formulovat takto: Mějme účelovou funkci f : D R, D R d. Máme najít bod x D, pro který platí, že f(x ) f(x), pro x, x D. Nalezení bodu x D je řešením problému globální optimalizace. Bodu x říkáme bod globálního minima (global minimum point), definičnímu oboru D se říká doména nebo prohledávaný prostor (domain, search space). Formulace problému globální optimalizace jako nalezení globálního minima není na úkor obecnosti, neboť chceme-li nalézt globální maximum, pak jej nalezneme jako globální minimum funkce g(x) = f(x). Problém nalezení globálního minima můžeme ilustrovat jednoduchým obrázkem: 1 0.5 f(x) 0 0.5 globální minimum x* 1 0 5 10 15 D=[0; 18], d = 1 4

Ze základního kurzu matematické analýzy známe postup, jak nalézt extrémy funkcí, u kterých existuje první a druhá derivace. Zdálo by se, že úloha nalezení globálního minima je velmi jednoduchá. Bohužel tomu tak není. Nalézt obecné řešení takto jednoduše formulovaného problému je obtížné, zvláště když účelová funkce je multimodální (má více lokálních minim), není diferencovatelná, případně má další nepříjemné vlastnosti. Analýza problému globální optimalizace ukazuje, že neexistuje deterministický algoritmus řešící obecnou úlohu globální optimalizace (tj. nalezení dostatečně přesné aproximace x ) v polynomiálním čase, tzn. problém globální optimalizace je NP-obtížný. Přitom globální optimalizace je úloha, kterou je nutno řešit v mnoha praktických problémech, mnohdy s velmi významným ekonomickým efektem, takže je nutné hledat algoritmy, které jsou pro řešení konkrétních problémů použitelné. Algoritmy pro řešení problému globální optimalizace se podrobně zabývá celá řada monografií, např. Torn a Žilinskas [20], Míka [14], Spall [18], kde je možné najít mnoho užitečných poznatků přesahujících rámec tohoto předmětu. V tomto kurzu se soustředíme na problémy, kdy hledáme globální minimum v souvislé oblasti D = a 1, b 1 a 2, b 2... a d, b d = d i=1 a i, b i, a i < b i, i = 1, 2,..., d, (2.1) a účelovou funkci f(x) umíme vyhodnotit s požadovanou přesností v každém bodě x D. Podmínce 2.1 se říká boundary constraints nebo box constraints, protože oblast D je vymezena jako d-rozměrný kvádr. Pro úlohy řešené numericky na počítači nepředstavuje podmínka (2.1) žádné podstatné omezení, neboť hodnoty a i, b i jsou tak jako tak omezeny datovými typy užitými pro x a f(x), tj. většinou reprezentací čísel v pohyblivé čárce. 2.2 Stochastické algoritmy pro globální optimalizaci Nemožnost nalézt deterministický algoritmus obecně řešící úlohu globální optimalizace vedla k využití algoritmů stochastických, které sice nemohou garantovat nalezení řešení v konečném počtu kroků, ale často pomohou nalézt v přijatelném čase řešení prakticky použitelné. Stochastické algoritmy pro globální optimalizaci heuristicky prohledávají prostor D. Heuristikou rozumíme postup, ve kterém se využívá náhoda, intuice, analogie a zkušenost. Rozdíl mezi heuristikou a deterministickým algoritmem je v tom, že na rozdíl od deterministického algoritmu heuristika nezajišťuje nalezení řešení. Heuristiky jsou v praktickém životě zcela samozřejmě užívané postupy, jako příklady můžeme uvést hledání hub, lov ryb 5

na udici, výběr partnera, pokus o výhru ve sportovním utkání nebo o složení zkoušky ve škole. Většina stochastických algoritmů pro hledání globálního minima v sobě obsahuje zjevně či skrytě proces učení. Inspirace k užití heuristik jsou často odvozeny ze znalostí přírodních nebo sociálních procesů. Např. simulované žíhání je modelem pomalého ochlazování tuhého tělesa, tabu-search modeluje hledání předmětu tak, že v krátkodobé paměti si zapamatovává zakázané kroky vedoucí k již dříve projitým stavům. Popis těchto algoritmů najdete v knize Kvasničky, Pospíchala a Tiňa [10]. Podobné postupy učení najdeme snad ve všech známých stochastických algoritmech s výjimkou slepého náhodného prohledávání. V posledních desetiletích se s poměrným úspěchem pro hledání globálního minima funkcí užívají stochastické algoritmy zejména evolučního typu. Podrobný popis této problematiky naleznete v knihách Goldgergra [7], Michalewicze [12] nebo Bäcka [1], případně ve zprávě Bäcka a Schwefela [2], která je dostupná na webu. Rozvoj evolučních algoritmů je záležitostí posledních desetiletí a je podmíněn rozvojem počítačů a pokroky v informatice. Přelomovými pracemi zavádějící biologickou terminologii do modelů hledání globálního extrému jsou články Schwefela a Rechenberga ze šedesátých let minulého století o evoluční strategii, práce L. Fogela o evolučním programování - viz [1, 10] - a Hollandova kniha o genetických algoritmech [8]. Tím byl odstartován bouřlivý rozsáhlý rozvoj evolučních algoritmů a jejich aplikací. Evoluční algoritmy jsou ve své podstatě jednoduchými modely Darwinovy evoluční teorie vývoje populací. Charakteristické pro ně je to, že pracují s populací a využívají tzv. evoluční operátory, zejména tyto: selekce nejsilnější jedinci z populace mají větší pravděpodobnost svého přežití i ředání svých vlastností potomům, křížení (rekombinace) dva nebo více jedinců z populace si vymění informace a vzniknou tak noví jedinci kombinující vlastnosti rodičů, mutace informace zakódovaná v jedinci může být náhodně modifikována. Evoluční algoritmy jsou heuristiky, které nějakým způsobem modifikují populaci tak, aby se její vlastnosti zlepšovaly. O některých třídách evolučních algoritmů je dokázáno, že nejlepší jedinci populace se skutečně přibližují ke globálnímu optimu. Evoluční algoritmy byly a jsou předmětem intenzivního výzkumu a počet publikací z této oblasti je velmi velký. Jedním z hlavních motivů jsou především aplikace v praktických problémech, které jinými metodami nejsou řešitelné. Rozsáhlý přehled aplikací evolučních algoritmů je uveden např. v [3]. 6

Dalšími motivy jsou výzkum umělé inteligence a teorie učení. Hledají se nové inspirace např. v chovatelství a šlechtitelství, modeluje se sexuální reprodukce v populacích, paralelní vývoj více populací téhož druhu, chování lovící smečky nebo hledajícího hejna živočichů, chování mravenců [4, 6, 13, 23]. Tento rozvoj nezastavil ani tzv. No Free Lunch Theorem [21, 22], který ukazuje, že nelze najít univerzálně nejlepší stochastický algoritmus pro globální optimalizaci. Shrnutí Formulace problému globální optimalizace Stochastický algoritmus Heuristika Kontrolní otázky 1. Jak naleznete minimum diferencovatelné funkce analyticky? 2. Kdy jste ve svém životě užili heuristiku? Zkuste ji popsat. 7

3 Úvod do Matlabu Průvodce studiem. Cílem této kapitoly je seznámit se s Matlabem tak, abyste v něm mohli pohodlně programovat evoluční algoritmy. Počítejte asi se čtyřmi hodinami studia, zejména praktických cvičení u počítače. 3.1 Co je Matlab? Matlab je výpočetní prostředí pro maticové operace, technické výpočty a vizualizaci dat. Matlab už po řadu let vyvíjí firma MathWorks a má mnoho uživatelů v běžných operačních systémech (Windows, Unix) po celém světě. Je to jak interaktivní výpočetní systém, který interpretuje příkazy zadané v příkazovém okně, tak programovací jazyk vysoké úrovně, který umožňuje rychlou a jednoduchou implementaci algoritmů. Základním datovým typem jazyka je pole, což může být skalár, vektor, matice nebo dokonce více než dvourozměrné pole. Prvkem pole může být číselná hodnota v pohyblivé řádové čárce, dvojitá přesnost, rozsah od 10 308 do 10 308 (realmax=1.7977e+308, realmin=2.2251e-308), případně alfanumerický znak nebo řetězec znaků stejné délky. Logické hodnoty se vyjadřují číselně, false jako 0, true jako 1. Matlab kromě základních operací s takovým polem a spousty vestavěných dalších funkcí nabízí i programovací příkazy pro vytváření podprogramů (funkcí) a příkazy pro řízení průběhu výpočtu (podmíněný příkaz, switch, cykly) známé z běžných programovacích jazyků. Výhodou Matlabu je i velmi kvalitní dokumentace, která je přístupná online prostřednictvím Helpu a dovoluje jak rychlé vyhledávání témat, zejména funkcí Matlabu, tak rychlou a názornou instruktáž k základním operacím. Pro seznámení s ovládáním Matlabu a jeho základními možnostmi je velmi užitečné spustit Help a projít Getting Started. 3.2 Základní příkazy Pro užívání Matlabu je důležité zvládnout základní operace s vektory a maticemi a také naučit se myslet vektorově, abychom byli připraveni efektivně využít možnosti, které máme v Matlabu k dispozici. Nejdříve si ukážeme pár jednoduchých příkladů. Řádkový vektor a vytvoříme příkazem, ve kterém prvky vektoru oddělené mezerami nebo čárkou zadáme v hranatých závorkách. Po zadání příkazu se tento vektor také vypíše v příkazovém okně: >> a=[3 2 5] a = 3 2 5 8

Pokud bychom chtěli výpis potlačit, příkaz ukončíme středníkem. Tím jsme vytvořili v pracovní oblasti (Workspace) objekt s názvem odpovídajícím užitému identifikátoru, t.j. a, který můžeme dále užívat v dalších příkazech. Pozor! Matlab v identifikátorech rozlišuje malá a velká písmena, takže a a A nebo TEMP_1, temp_1 a Temp_1 jsou různé objekty. Existující objekt můžete užít např. jako vstupní parametr funkce: >> size(a) ans = 1 3 Funkce size vrací rozměry matice, první údaj je počet řádků, druhý počet sloupců. Příkazem >> b=a+1 b = 4 3 6 jsme přičetli zadanou skalární hodnotu (t.j. 1) ke každému prvku vektoru. Matici vytvoříme např. příkazem, ve kterém jsou řádkové vektory odděleny středníkem >> B=[a; b; b-5.5] B = 3.0000 2.0000 5.0000 4.0000 3.0000 6.0000-1.5000-2.5000 0.5000 Funkce length vrací maximální hodnotu z vektoru spočítaného funkcí size: >> length(b) ans = 3 Prvky matice nebo vektoru jsou přístupné přes jejich indexy, takže např. prvek na druhém řádku a v prvním sloupci můžeme přepsat: >> B(2,1)=0 B = 3.0000 2.0000 5.0000 0 3.0000 6.0000-1.5000-2.5000 0.5000 9

S vektory a maticemi můžeme snadno provádět operace známé z lineární algebry (transpozice, inverze matice, pokud je možná, atd.) Jejich zápis je velmi podobný zápisu obvyklém v lineární algebře: >> a=a a = 3 2 5 >> det(b) % determinant ans = 54 >> C=B^-1 % inverse matice B, stejný výsledek užitím inv(b) C = 0.3056-0.2500-0.0556-0.1667 0.1667-0.3333 0.0833 0.0833 0.1667 >> I=B*C I~= 1.0000 0.0000 0 0 1.0000 0 0.0000-0.0000 1.0000 3.3 Některé příkazové zkratky Pro vytvoření vektorů a matic jsou užitečné další příkazy, které zkracují práci. Pokud tvoří prvky vektoru sekvenci, pak ji můžeme zadat zkráceně zadáním dolní a horní hranice (pak je implicitně krok roven jedné) nebo požadovaný krok explicitně zadat: >> a=1:5 a = 1 2 3 4 5 >> b=10:-2:1 b = 10 8 6 4 2 10

Matice můžeme vytvářet pomocí příkazů zeros(n,p) matice (n p), samé nuly ones(n,p) matice (n p), samé jedničky eye(n) jednotková matice (n n) rand(n,p) matice (n p), náhodná čísla z rovnoměrného rozdělení na [0, 1) randn(n,p) matice (n p), náhodná čísla z normovaného normálního rozdělení Zadáme-li jen jeden parametr, pak vytvořená matice je čtvercová. Příklady: >> zeros(1,3) ans = 0 0 0 >> eye(4) ans = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 >> rand(3) ans = 0.4447 0.9218 0.4057 0.6154 0.7382 0.9355 0.7919 0.1763 0.9169 >> 10+2*randn(3) ans = 7.1181 11.3800 12.5805 11.1423 11.6312 11.3372 9.2002 11.4238 12.3817 Pro práci s vektory a maticemi je důležité prázdné pole [], které má rozměr (0 0). Zařazením prázdného prvku (matice) vypouštíme odpovídající prvky příslušného pole: a = 1 2 3 4 5 >> a(2)=[] a = 1 3 4 5 11

Řádek nebo sloupec matice můžeme přepsat vektorem >> X=ones(3,4) X = 1 1 1 1 1 1 1 1 1 1 1 1 >> X(1,:)=a X = 1 3 4 5 1 1 1 1 1 1 1 1 nebo prázdným polem, tj. vypustit >> X(:,3)=[] X = 1 3 5 1 1 1 1 1 1 Pole můžeme i zvětšovat (přidávat nové prvky). Pokud by v novém poli nebyla nějaká hodnota dosud přiřazena, automaticky se dodají nuly, jak uvidíme v následujícím příkladu: a = 1 2 3 >> a(5)=-1 a = 1 2 3 0-1 Zvláštní význam má proměnná end obsahující aktuální nejvyšší hodnotu indexu. Pak např. přepsání posledního prvku vektoru a hodnotou předposledního prvku zapíšeme takto: >> a(end)=a(end-1) a = 1 2 3 0 0 Kromě dosud zmíněných aritmetických operátorů jsou užitečné operace na odpovídajících prvcích dvou polí stejných rozměrů, tj. operátory začínající tečkou,.*,./,.^. Např. umocnit každý prvek vektoru a odpovídajícím prvkem téhož vektoru zapíšeme takto a dostaneme výsledek: >> a.^a ans = 1 4 27 1 1 12

Pokud výsledek aritmetické operace přeteče rozsah datového typu, je výsledkem hodnota Inf, např. >> realmax*1.2 ans = Inf >> -realmax*1.2 ans = -Inf Pokud výsledek aritmetické operace nelze vyhodnotit (výrazy Inf*0 nebo Inf/Inf ap.), má hodnotu NaN (not a number), např. >> -realmax*1.2/(realmax*1.2) ans = NaN 3.4 Znakové řetězce Znakový řetězec v Matlabu je řádkový vektor, jehož prvky jsou jednotlivé znaky, např. >> r2= abcda1b2 r2 =abcda1b2 length(r2) ans = 8 Pokud chceme přímo porovnávat dva řetězce, musí mít shodnou délku. Shodné řetězce musí mít stejnou délku a shodovat se na všech pozicích. Pokud potřebujete porovnávat řetězce nestejných délek, užijte vhodnou funkci, např. strcmp, viz Help, kde najdete i návody pro další operace se znakovými řetězci. 3.5 Nakreslení grafu V Matlabu je velmi snadné kreslení grafů funkcí. Zde si ukážeme jen jednoduchý příklad 2D grafu: >> x=0:pi/400:6*pi; >> y=exp(-0.2*x).*sin(x); >> plot(x,y) Zadáním těchto tří příkazů dostaneme v okně Figure(1) následující graf: 13

1 0.8 0.6 0.4 0.2 0 0.2 0.4 0 5 10 15 20 Podrobnější popis příkazu plot, jeho dalších nepovinných parametrů, možností interaktivní práce s grafem, export obrázku do různých formátů atd. nalezneme v helpu. Některé postupy vytváření 3D grafů ukážeme na příkladech později. 3.6 Logické výrazy Logické konstanty false a true se vyjařují numericky jako 0 a 1, při vyhodnocování výrazu je jakákoliv číselná hodnota různá od nuly považována za true. Logické spojky not, and, or se zapisují jako, &&,. Zdvojením && a je zajištěno zrychlené vyhodnocování logického výrazu (zleva). Pro exkluzivní nebo je k dispozici funkce xor. Relační operátory se zapisují očekávaným způsobem, tj. ==, =, <, <=, >, >=, rovnítko musí být zdvojeno, aby bylo odlišitelné od přiřazovacího příkazu. V Matlabu máme k dispozici i kvantifikátory any a all. Je-li jejich parametrem vektor, vracejí skalár, tzn. logickou hodnotu, zda aspoň jeden, resp. všechny prvky vektoru mají logickou hodnotu true. Např. a = 1 2 3 >> all(a) ans = 1 14

Pokud je jejich parametrem matice, vracejí řádkový vektor pro jednotlivé sloupce matice, např. pro A~= 0 1 1 0 0 1 >> any(a) ans = 0 1 1 >> all(a) ans = 0 0 1 Poznámka: Podobně fungují i některé numerické funkce, např. mean, std, median, min, max, sum, prod, takže můžeme velmi snadno spočítat řádkový vektor sloupcových průměrů, směrodatných odchylek atd. Pomocí operátorů any a all můžeme snad zjistit, zda aspoň jeden či všechny prvky matice nebo vektoru splňují nějakou logickou podmínku, např. zda všechny prvky matice jsou nezáporné: B = -1 3 3-1 0 3 >> all(all(b>=0)) ans = 0 nebo >> all(b(:)<=0) ans = 0 Nalezení indexů prvků vektoru splňujících logickou podmínku umožňuje funkce find. Např. záporné prvky vektoru b vypustíme snadno takto b = 0.2621-0.0435-0.4815 0.3214-0.0553 >> b(find(b<0))=[] b = 0.2621 0.3214 3.7 Řídicí příkazy, zápis algoritmu V Matlabu máme k dispozici běžné příkazy pro zápis algoritmu, známé z jiných programovacích jazyků. Sekvence příkazů je buď na následujícím řádku nebo lze příkazy oddělit středníkem. Je-li příkaz ukončen středníkem, vyhodnocený výraz se nevypisuje na displej. Pokud má zápis příkazu pokračovat na dalším řádku, je předcházen třemi tečkami. Identifikátor muže 15

mít až 31 alfanumerických znaků nebo podtržítek, začíná písmenem, velká a malá písmena se rozlišují. Jako identifikátory neužívejte Matlabem užívané názvy konstant a proměnných jako např. pi, eps, ans, Inf, NaN, realmax, realmin, neboť tím byste si přepsali jejich správné nastavené hodnoty. Vše za znakem procento je komentář. Podmíněný příkazy má tvar if podmínka příkaz1 elseif podmínka2 příkaz2 else příkaz3 end Části elseif a else jsou nepovinné, podmíněný příkaz může být zapsán i na jednom řádku. Přepínač má tvar switch(výraz) case value1 příkaz1 case value2 příkaz2 end. case valuen příkazn otherwise nějaký příkaz Část otherwise je nepovinná. Cykly lze zapsat buď jako nebo while podmínka příkaz end for identifikátor = vektor příkaz end Všude, kde je možno zapsat příkaz, může to být i sekvence více příkazů. Např. v cyklu typu for proběhne desetkrát přiřazení vektoru náhodných čísel do i tého řádku matice: 16

for i=1:10 P(i,:)=2+3*rand(1,5); end Sekvence příkazů je možné zapsat do textových souborů, jejichž jméno má příponu.m. Celou sekvenci příkazů pak vyvoláme jménem souboru bez přípony. Pokud tato sekvence nemá žádné vstupní parametry, říkáme takovému souboru skript (dávka). Při jejím vyvolaní je pak sekvence příkazů postupně interpretována. Velmi užitečným prostředkem je zapsat sekvenci příkazů jako funkci. Tak máme k dispozici postup pro modulární strukturu programů v Matlabu. Syntaxi zápisu funkce můžeme ve stručnosti vyjádřit schématem function [seznam výstupních parametrů] =jmeno_funkce(seznam vstupních parametrů)... příkazy provedené při volání funkce... Pokud funkce vrací jen jednu hodnotu (jednu proměnnou, může to být ale i vektor nebo matice), výstupní parametr není (nemusí být) v hranatých závorkách. Proměnné zavedené uvnitř funkce jsou lokální, takže nepřepisují hodnoty stejně nazvaných proměnných ve volajícím modulu. Zvolené jméno funkce musí být shodné se jménem souboru, ve kterém je zdrojový text funkce uložen (bez přípony.m ). Užívání funkcí je i výhodné s ohledem na délku výpočtu, neboť při prvním volání proběhne kompilace funkce a další volání je rychlejší než opakovaná interpretace jednotlivých příkazů. Jako příklad funkce si ukážeme náhodný výběr k hodnot (bez opakování) z množiny {1, 2,..., N}, k N. Pokud by bylo N = 49 a k = 7, je to procedura losování Sportky. Příklad pečlivě prostudujte, neboť ilustruje několik užitečných operací s vektory v Matlabu. % random sample, k of N without repetition % function result=nahvyb(n,k); opora=1:n; nahv=[]; for i=1:k index=1+fix(rand(1)*length(opora)); nahv(end+1)=opora(index); opora(index)=[]; end result=nahv; Uvedený způsob implementace náhodného výběru je jen jedním z mnoha možných. Je to vlastně velmi přímočarý model fyzického losování z osudí. 17

Jiný způsob implementace může využít funkci randperm. Vyzkoušejte to a posuďte, který postup je efektivnější. Při volání funkce nemusí být vždy zadán plný počet vstupních i výstupních parametrů. Pro ošetření takového volání jsou určeny funkce nargin a nargout (bez parametrů), které vracejí aktuální počet příslušných parametrů. Vstupním parametrem může být i jméno funkce (řetězec), takže příkazem y=feval(fnname,x); vyhodnotíme v bodě x tu funkci, jejíž jméno je aktuálně uloženo jako řetězec v proměnné fnname. Samozřejmě funkce tohoto jména musí být dostupná, např. jako m-soubor. 3.8 Doporučení pro vhodný výběr příkazů Při zápisu algoritmů v Matlabu se vyplatí uvažovat vektorově, neboť řadu operací je možno v Matlabu zapsat efektivněji než užitím postupů známých z jazyků nepodporujících vektorové a maticové operace (např. Pascal nebo C). Především je nutno velmi uvážlivě užívat cyklů, zejména vložených. Různou časovou náročnost ukazují následující příklady výpočtu součtu druhých mocnin prvků vektoru a. Časově nejnáročnější je klasický postup načítání druhých mocnin jednotlivých prvků v cyklu: N=10000 a=rand(50,1) tic for i=1:n s=0; for j=1:length(a) s=s+a(j)^2; end end toc elapsed_time = 1.2700 Využitím aritmetické operace pro všechny prvky vektoru (zde.* nebo.^2) dosáhneme téměř osminásobného zkrácení potřebného času: tic for i=1:n s=sum(a.*a); 18

end toc elapsed_time = 0.1600 A využijeme-li skalární součin, potřebný čas ještě o trochu zkrátíme: tic for i=1:n s=a *a; end toc elapsed_time = 0.1100 19

3.9 3D grafika Kreslení grafů funkcí v 3D si ukážeme jen na jednoduchých příkladech. V prvním příkladu chceme nakreslit graf funkce f(x, y) = exp( (x 2 + y 2 )) pro hodnoty x [ 1, 2; 1.2] a y [ 2; 2]. Nejdříve vytvoříme vektory hodnot x-ové i y-ové souřadnice (pro síť vhodné hustoty): x=-1.2:0.05:1.2 y=-2:0.1:2 Pak příkazem meshgrid vytvoříme matice X a Y typu (length(y) length(x)), v tomto případě tedy typu (41 49), ve kterých odpovídající prvky představují všechny dvojice hodnot prvků vektorů x a y. Pak už jen vyhodnotíme z-tovou souřadnici (matice Z typu (41 49)) [X Y]=meshgrid(x,y) Z=exp(-X.^2-Y.^2) mesh(x,y,z) % stejného výsledku dosáhneme i zadaním příkazu % ve tvaru mesh(x,y,z) a příkazem mesh nakreslíme obrázek (tzv. drátový graf), který se objeví v okně Figure 1. 1 0.8 0.6 0.4 0.2 0 2 1 0 1 2 2 1 0 1 2 V tomto okně máme pak dostupné nástroje pro interaktivní práci s obrázkem, např. popis a editaci os grafu, vkládání textů a grafických symbolů, rotace obrázku, uložení do souboru, export do jiného formátu atd. Podrobnosti 20

ponecháváme na čtenáři, který může potřebné informace získat v HELPu, kde také se dozví i o dalších možnostech 3D grafiky v Matlabu. O trochu složitější je nakreslení trojrozměrného grafu funkce tehdy, když matici z-tových souřadnic nemůžeme spočítat přímo, ale máme jen funkci vyhodnocující z-tovou souřadnici v bodě zadaném souřadnicemi x a y. Příkladem je Ackleyho funkce, která je často užívána v testování algoritmů pro globální optimalizaci a kterou v Matlabu můžeme zapsat takto: function z=ackley(x) % Ackley s function, <-30,30>, glob. minimum f(0)=0 d=length(x); a=-20*exp(-0.02*sqrt(sum(x.*x))); b=-exp(sum(cos(2*pi*ones(1,d).*x))/d); z=a+b+20+exp(1); Síť souřadnic v rovině xy vytvoříme podobně jako v předchozím příkladu x=-3:0.05:3; y=-3:0.05:3; [X Y]=meshgrid(x,y); ale výpočet z-tových souřadnic umíme pouze v bodech zadaných jako dvouprvkový vektor. Pak nezbývá než spočítat matici Z po jednotlivých prvcích for i=1:length(y) for j=1:length(x) Z(i,j)=ackley([X(i,j) Y(i,j)]); end end Výpočet je možno trochu zrychlit, když z matic X a Y vytvoříme vektory, výsledný vektor zz předem inicializujeme na požadovanou délku a pak z něho příkazem reshape vytvoříme matici požadovanou pro kreslení 3D grafu: xx=x(:); yy=y(:); zz=zeros(length(xx),1); for i=1:length(xx) zz(i)=ackley([xx(i) yy(i)]); end Z=reshape(zz,length(y),length(x)); Pak teprve můžeme nakreslit graf následujícími příkazy: 21

meshc(x,y,z) axis([-3 3-3 3-1 4]) xlabel( x ) ylabel( y ) zlabel( z ) 4 3 2 f(x) 1 0 1 2 0 x2 2 3 2 1 x1 0 1 2 3 3.10 Práce se soubory V Matlabu máme řadu možností, jak importovat data ze souborů a exportovat data do souborů různých formátů. Podrobnosti nalezneme v HELPu pod heslem file formats a odkazech na další položky. Zde uvedeme jen některé příklady práce se soubory, které se budou užitečné při interaktivní práci s Matlabem, při načítání vstupních dat z textových souborů a při ukládání výsledků do textové tabulky se sloupci s konstantní šířkou. Při interaktivní práci s Matlabem je někdy užitečné si uložit aktuální stav pracovního prostoru (workspace), tj. všechny dosud inicializované proměnné, abych v příštím sezení mohli pokračovat od současného stavu. To je možné volbou save Workspace as z menu File. Soubor se pak uloží pod zadaným jménem s příponou.mat. Tento soubor pak otevřeme z menu File ve volbě Open nebo příkazem load. Matici (6 2) z textového souboru, jehož jméno je v řetězci (proměnná) fdatname a soubor má následující obsah 22

2.138E0 1.309E0 3.421E0 1.471E0 3.597E0 1.490E0 4.340E0 1.565E0 4.882E0 1.611E0 5.660E0 1.680E0 načteme snadno do proměnné (matice) X příkazem dlmread X=dlmread(fdatname, ); Druhý parametr znamená specifikaci oddělovače (delimiter) datových položek, v tomto případě je to mezera (alespoň jedna mezera znamená konec číselné položky, u jiných oddělovačů jako je tabulátor nebo středník to je jinak, tam každý výskyt oddělovače znamená novou položku). Podobně snadno lze načítat data i z jiných formátů, např. tabulky z Excelu příkazem xlsread ap. Zapisování dat do textového souboru s pevnou šířkou sloupců zařídíme sekvencí příkazů: Otevření souboru příkazem fid=fopen(fname, a ); kde první parametr je jméno souboru (proměnná nebo konstanta typu řetězec), druhý parametr specifikuje, jakým způsobem má být soubor otevřen, v tomto případě hodnota parametru a znamená append, tj. přidání dalších záznamů, pokud soubor už existuje. Pak následují příkazy pro zápis jednotlivých položek řádku souboru. Vždy seznam položek, které mají být zapsány, je přecházen specifikací formátu, poslední příkaz ukončuje řádek ve výstupním souboru. fprintf(fid, %-10s %4.0f %11.3e %11.3e,mod_name,d,a(1),b(1)); fprintf(fid, %7.2f, alfa ); fprintf(fid, %8.0f, evals); fprintf(fid, %15.7e,RSS); for i=1:d fprintf(fid, %14.5e, beta(i)); end fprintf(fid, %1s\n, ); Další záznam do souboru pak zapíšeme voláním stejné sekvence příkazů po změně obsahu výstupních proměnných, obvykle tedy tato sekvence je umístěna uvnitř nějakého cyklu. Na závěr soubor zavřeme příkazem fclose(fid). Uvedené příklady jen ilustrují základní možnosti práce se soubory, o dalších operacích se soubory včetně práce s grafickými formáty se potřebné informace naleznou v HELPu. 23

Shrnutí Datové typy v Matlabu, prázdné pole Inicializace vektorů a matic Skripty a funkce v Matlabu 3D grafy Kontrolní otázky 1. Jak budete generovat náhodné číslo z rovnoměrného rozdělení z intervalu [a, b)? 2. Kdy může být jméno funkce vstupním parametrem jiné funkce? 3. Jak generovat náhodný výběr k hodnot z [1, 2,..., N] pomocí funkce randperm? 24

4 Náhodné prohledávání Průvodce studiem V této kapitole se seznámíte s nejjednodušším stochastickým algoritmem pro hledání globálniho minima. Kromě toho uvidíte i snadnost zápisu takových algoritmů v Matlabu a seznámíte se s pojmem konvergence stochastického algoritmu. Počítejte asi se dvěma hodinami studia. Náhodné prohledávání se také někdy nazývá slepý algoritmus, neboť v něm se opakovaně generuje náhodné řešení (nový bod y v souvislé oblasti D = d i=1 a i, b i z rovnoměrného spojitého rozdělení) a zapamatovává se tehdy, když je lepší než předtím nalezemé řešení. Náhodné prohledávání je příklad velmi jednoduchého stochastického algoritmu pro hledání globálního minima využívající velmi prostou heuristiku, kterou bychom mohli slovně vyjádřit jako zkus bez rozmyslu cokoliv. Slepý algoritmus lze zapsat v Matlabu na pár řádcích: function [x,fx] = blindsearch(fn_name,a,b,t) % input parameters: % fn_name function to be minized (M file) % a, b row vectors, limits of search space % t iteration number % output: % fx the minimal function value found % x minimum found by search d=length(a); fx=realmax; for i=1:t y=a+(b-a).*rand(1,d); fy= feval(fn_name,y); if fy < fx x=y; fx=fy; end end Na tomto jednoduchém algoritmu si také ukážeme, jak se dokazuje konvergence stochastických algoritmů, tj. platnost toho, že s rostoucím počtem iterací se nalezené řešení x přibližuje globálnímu minimu x : lim P ( (x t x ) < ɛ t) = 1, ɛ > 0, (4.1) kde (x x ) je vzdálenost nalezeného řešení x od globálního minima x (norma vektoru x x ) a P ( (x x ) < ɛ t) je pravděpodobnost jevu ( (x x ) < ɛ) za podmínky, že bylo provedeno t iterací. 25

K tvrzení vyjářenému rovnicí (4.1) dojdeme následující úvahou: Všechny body splňující podmínku (x x ) < ɛ jsou vnitřními body d-rozměrné koule D ɛ o poloměru ɛ). Jelikož ɛ > 0, je objem této koule kladný, přesněji míra této množiny λ(d ɛ ) > 0. Označme dále míru množiny D jako λ(d). Generujeme-li bod y D z rovnoměrného rozdělení, pak pravděpodobnost jevu A {y D ɛ } P (A) = λ(d ɛ) λ(d) a pravděpodobnost jevu opačného je P (Ā) = 1 λ(d ɛ) λ(d) Pravděpodobnost, že jev Ā (tj. nalezené řešení není v D ɛ) nastane v t po sobě jdoucích opakováních je ( P (Ā t) = 1 λ(d ) t ɛ). λ(d) ( ) Jelikož 0 < 1 λ(d ɛ) < 1, je potom λ(d) a tedy rovnice(4.1) platí. ( lim P (Ā t) = 1 λ(d ) t ɛ) = 0 t λ(d) Bohužel rovnice (4.1) vypovídá pouze limitně a neposkytuje nám žádnou informaci o kvalitě nalezeného řešení po konečném počtu iterací. Jak uvidíme později, s podobným problémem se budeme setkávat i u dalších stochastických algoritmů. Teoretická konvergence podle rovnice (4.1) je z praktického hlediska velmi slabé tvrzení a pro posouzení konvergence stochastických algoritmů a porovnání jejich efektivity jsou většinou důležitější experimentální výsledky na testovacích funkcích než teoretický důkaz konvergence ve formě rovnice (4.1). 26

Shrnutí Generování bodu z rovnoměrného rozdělení na D Konvergence stochastického algoritmu Kontrolní otázky 1. Jakou heuristiku užívá slepý algoritmus pro generování nového bodu? 2. Je ve slepém náhodném prohledávání modelován nějaký proces učení? Korespondenční úloha 1 Korespondenční jsou zadány v rámci kurzu daného semestru. 27

5 Simplexová metoda Průvodce studiem V této kapitole se seznámíte s algoritmem zvaným simplexová metoda. Je to příklad algoritmu, který hledá minimum funkce ve spojité oblasti a nevyužívá derivací funkce. Řada dalších stochastických algoritmů využívá některé postupy, které byly zavedeny v simplexové metodě. Proto věnujte této metodě pozornost, zejména jasnému porozumění pojmu simplex a reflexe simplexu. Počítejte zhruba se dvěma až třemi hodinami studia. Simplexová metoda je velmi jednoduchý a populární algoritmus pro hledání globálního minima. Původní verzi algoritmu publikovali Nelder a Mead v roce 1965 [15]. Od té doby bylo navrženo několik dalších modifikací simplexové metody. Zde si ukážeme její základní myšlenky. Pro účelovou funkci f : D R, D R d. hledáme její globální minimimum v souvislé oblasti D = d i=1 a i, b i, a účelovou funkci f(x) umíme vyhodnotit s požadovanou přesností v každém bodě x D. Funkce nemusí být diferencovatelná. Klíčovým pojmem algoritmu je tzv. simplex S, což je množina nekomplanárních d + 1 bodů v D, S = {x 1, x 2,..., x d+1 } V simplexu nalezneme body s nejvyšší a nejnižší funkční hodnotou x H = arg max x S f(x) x L = arg min x S f(x) a dále spočítáme souřadnice těžiště d bodů, které zůstanou v simplexu po odstranění bodu x H, tedy g = 1 d ( x S x x H ) Pomocí tohoto simplexu hledáme nový bod y, který v případě, že f(y) < f(x H ) nahradí v simplexu dosud nejhorší bod x H a pokračuje se znovu. Pro hledání nového bodu y se užívá reflexe. Reflexe znamená překlopení bodu x H přes těžiště g podle vztahu y = g + (g x H ) = 2g x H. (5.1) Graficky je reflexe znázorněna na následujícím obrázku. 28

8 7 6 x L 5 x H 4 3 g y 2 1 0 0 1 2 3 4 5 6 7 8 Pokud nový bod y získaný reflexí nesplňuje podmínku f(y) < f(x H ), užije se redukce, což je vlastně takové smrštění simplexu směrem k bodu x L, že vzdálenosti bodů simplexu budou poloviční. Formálně to zapíšeme x 1 2 (x + x L), x S, x x L. Na následujícím obrázku vidíme grafické znázornění redukce. Body původního simlexu označené kroužky se posunou k bodu x L do pozic označených křížky. 8 7 6 x L 5 x H 4 3 2 1 0 0 1 2 3 4 5 6 7 8 Nejjednodušší variantu algoritmu simplexové metody můžeme zapsat následujícím způsobem: 29

generuj simplex S, tj. d + 1 bodů náhodně v D repeat najdi x H y := reflexe(s); (y D) if f(y) < f(x H ) then x H := y else redukce(s); until podmínka ukončení; Simplexovou metodu si můžeme představit jako jakýsi píďalkovitý pohyb simplexu v prohledávaném prostoru D směrem k oblasti s nižšími funkčními hodnotami. Mezi variantami simplexové metody existují i takové, kde simplex na počátku není generován náhodně, ale počáteční body simplexu se záměrně volí tak, aby zcela jistě splňovali podmínku nekomplanarity (afinní nezávislosti), což volně řečeno znamená, že body simplexu neleží v podprostoru s menší dimenzí, než má prohledávaný prostor D. např. při d = 2 tři body tvořící simplex neleží na přímce. Sofistikovaná verze simplexové metody je užita ve funkci fminserch, která je standardní součástí Matlabu. Prostudujte help k této funkci a její zdrojový text (soubor fminserch.m), ve kterém najdete nejen popis implementované verze simplexové metody, ale také užitečnou inspiraci pro styl programování v Matlabu. Shrnutí Simplex Reflexe v simplexu Redukce simplexu Kontrolní otázky 1. Naprogramujte v Matlabu jednoduchou verzi simplexové metody popsanou v této kapitole a porovnejte počet vyhodnocení účelové funkce se slepým náhodným prohledáváním na úloze z předcházející kapitoly. Korespondenční úloha 2 Korespondenční jsou zadány v rámci kurzu daného semestru. 30

6 Řízené náhodné prohledávání Průvodce studiem V této kapitole se seznámíte s algoritmem, který pracuje s populací. Algoritmus řízeného náhodného prohledávání je jednoduchý efektivní stochastický algoritmus pro hledání globálního minima. Pochopení tohoto algoritmu je dobrým odrazovým můstkem ke složitějím evolučním algoritmům. Počítejte asi se dvěma hodinami studia a několika hodinami věnovanými implementaci algoritmu v Matlabu a jeho ověření na testovacích funkcích. Řízené náhodné prohledávání (controlled random search, CRS) je příkladem velmi jednoduchého a přitom efektivního stochastického algoritmu pro hledání minima v souvislé oblasti. Algoritmus CRS navrhl Price [17] v sedmdesátých létech minulého století. Pracuje se s populací N bodů v prohledávaném prostoru D a z nich se heuristicky generuje nový bod y, který může být zařazen do populace místo dosud nejhoršího bodu. Počet vygenerovaných bodů populace N je větší než dimenze d prohledávaného prostoru D. Jako heuristiku pro generování nového bodu y užíval Price reflexi simplexu, která je známa ze simplexové metody popsané v předcházející kapitole. Z populace se vybere náhodně d + 1 bodů tvořících simplex (optimisticky spoléháme na to, že tyto náhodně vybrané body jsou nekomplanární). Pokud v novém bodu y je funkční hodnota f(y) menší než je v nejhorším bodu populace, pak je tento nejhorší bod nahrazen bodem y. Reflexi v simplexu můžeme vyjádřit vztahem y = g + (g x H ) = 2g x H, (6.1) kde x H je bod simplexu s největší hodnotou účelové funkce a g je těžiště zbývajících d bodů simplexu. Nahrazením nejhoršího bodu populace novým bodem y dosahujeme toho, že populace se koncentruje v okolí dosud nalezeného bodu s nejmenší funkční hodnotou. Algoritmus mužeme jednoduše zapsat následujícím způsobem: generuj populaci P, tj. N bodů náhodně v D repeat najdi x worst P takové, že f(x worst ) f(x), repeat y := reflexe simplexu, y D until f(y) < f(x worst ); x worst := y; until podmínka ukončení; x P Reflexe simplexu podle rovnice (6.1) samozřejmě není jediná možnost, jak v algoritmu CRS generovat nový bod. Price později navrhl postup, kdy nový 31

bod y se generuje podle (6.1), ale do simplexu je vždy zařazen nejlepší bod populace x min s funkční hodnotou f min, f min f(x), x P a zbývajících d bodů simplexu se pak vybere náhodně z ostatních bodů populace. Další možnost je znáhodněná reflexe, která byla navržena v 90. létech. Znáhodněná reflexe v simplexu je popsána vztahem y = g + U (g x H ), (6.2) U je náhodná veličina vhodného rozdělení. Graficky je taková reflexe znázorněna na následujícím obrázku. 10 9 8 D 7 6 5 4 x H g U(g x) y 3 2 1 0 1 0 2 4 6 8 10 Pokud bychom užili reflexi podle (6.1), byla by vzdálenost bodů g, y byla stejná jako vzdálenost bodů x, g, tj. hodnota U v rovnici (6.2) je konstatntní a je rovna jedné. Při užití znáhodněné reflexe je tato vzdálenost určována náhodně podle zvoleného rozdělení náhodné veličiny U. Na testovacích úlohách bylo ověřováno několik rozdělení náhodné veličiny U. Osvědčilo se rovnoměrné rozdělení na [0, α), kde α je vstupní parametr algoritmu. Podle empirických výsledků testů nejrychleji algoritmus konvergoval na většině testovacích funkcí při hodnotách α 4. Střední hodnota je E U = α/2. Za pozornost stojí užití rovnoměrného rozdělení náhodné veličiny U na [s, α s), kde α > 0 a s (0, α/2) jsou vstupní parametry heuristiky. Střední hodnota je opět E U = α/2. Je však možno užít i jiná rozdělení produkující nezáporné hodnoty náhodné veličiny U, např. lognormální rozdělení, případně i jiné heuristiky pro generování nového bodu y, než je reflexe. 32

Reflexe podle rovnic (6.1) nebo (6.2) nezaručuje, že nově vygenerovaný bod y bude v prohledávaném prostoru D. Pokud nastane situace, že y D, jsou různé možnosti, jak postupovat dále. Buď generujeme nový bod opakovaně tak dlouho, než se podaří vygenerovat y D = d i=1 a i, b i nebo použít výpočetně úspornější postup. Např. je možné vygenerovat bod náhodně nebo užít tzv. zrcadlení (perturbace), kdy ty souřadnice y i a i, b i překlopíme dovnitř prohledávaného prostoru D kolem příslušné strany d- rozměrného kvádru D. Toto zrcadlení znázorňuje následující obrázek, jeho algoritmus je zapsán jako funkce zrcad v Matlabu. 10 9 8 D 7 6 5 y mimo D y po perturbaci 4 3 2 1 0 1 1 0 1 2 3 4 5 6 7 8 9 10 % zrcadleni, perturbation y into <a,b> function result=zrcad(y,a,b) zrc=find(y<a y>b); for i=zrc while (y(i)<a(i) y(i)>b(i)) if y(i)>b(i) y(i)=2*b(i)-y(i); elseif y(i)<a(i) y(i)=2*a(i)-y(i); end end end result=y; 33

Při stochastickém prohledávání podmínku ukončení formuluje uživatel. Obvykle je možné užít podmínku ukončení formulovanou tak, že nejlepší a nejhorší bod populace se ve funkčních hodnotách liší jen málo, tedy f(x worst ) f(x min ) ε, (6.3) kde ε > 0 je vstupní parametr algoritmu, Jinou možností je hledání ukončit při dosažení zadaného počtu vyhodnocení funkce, případně podmínka ukončení může být formulována jako disjunkce relace (6.3) a dosažení maximálního dovoleného počtu vyhodnocení účelové funkce. Shrnutí Prohledávaný prostor D, způsob zadání D Populace bodů náhodně vygenerovaných v D Simplex náhodně vybraný z populace Reflexe a znáhodněná reflexe Podmínka ukončení Kontrolní otázky 1. Jak určíte souřadnice těžiště n bodů v D? 2. Co je to zrcadlení a kdy se užívá? 3. Jak zformulovat podmínku ukončení? Korespondenční úloha 3 Korespondenční jsou zadány v rámci kurzu daného semestru. 34

7 Diferenciální evoluce Průvodce studiem V této kapitole se seznámíte s algoritmem diferenciální evoluce. Tento algoritmus byl navržen nedávno a poprvé publikován v roce 1995. Během několika let se stal velmi populární a je často aplikován na problémy hledání globálního minima. Je to příklad jednoduchého heuristického hledání užívajícího evoluční evoluční operátory. Počítejte asi se třemi hodinami studia. Diferenciální evoluce (DE) je postup k heuristickému hledání minima multimodálních funkcí, který navrhli R. Storn a K. Price [19] koncem 90. let. Algoritmus DE dosáhl značné popularity, je často aplikován a dále rozvíjen. Experimentální výsledky i zkušenosti z četných aplikací ukazují, že často konverguje rychleji než jiné stochastické algoritmy pro globální optimalizaci. Algoritmus diferenciální evoluce vytváří novou generaci Q tak, že postupně pro každý bod x i ze staré generace P vytvoří jeho potenciálního konkurenta y a do nové populace z této dvojice zařadí bod s nižší funkční hodnotou. Algoritmus můžeme zapsat takto: generuj P (N bodů náhodně v D) repeat for i := 1 to N do generuj vektor u vytvoř vektor y křížením u a x i if f(y) < f(x i ) then do Q zařaď y else do Q zařaď x i endfor P := Q until podmínka ukončení Je několik způsobů, jak generovat nový bod u. Zde uvedeme dva nejčastěji užívané. Postup označovaný RAND generuje bod u ze tří bodů ze staré populace podle vztahu u = r 1 + F (r 2 r 3 ), (7.1) r 1, r 2, r 3 jsou navzájem různé body náhodně vybrané z populace P různé od aktuálního bodu x i, F > 0 je vstupní parametr. Generování bodu u podle rovnice 7.1 je graficky znázorněno následujícím obrázkem. 35

10 9 8 7 6 D F(r 2 r 3 ) r 1 u 5 4 r 3 r 2 r 3 x i 3 r 2 2 1 0 1 0 2 4 6 8 10 Postup označovaný BEST využívá nejlepší bod z populace P a čtyři další náhodně vybrané body podle vztahu u = x best + F (r 1 + r 2 r 3 r 4 ), (7.2) kde r 1, r 2, r 3, r 4 jsou navzájem různé body náhodně vybrané z populace P různé od aktuálního bodu x i i od bodu x best s nejnižší funkční hodnotou v P. F > 0 je opět vstupní parametr. Nový vektor y vznikne křížením vektoru u a vektoru x i tak, že kterýkoli jeho prvek x ij je nahrazen hodnotou u j s pravděpodobností C. Pokud žádné x ij nebylo přepsáno hodnotou u j nebo při volbě C = 0, nahrazuje se jeden náhodně vybraný prvek vektoru x i : y j = { uj když R j C nebo j = I x ij když R j > C a j I, (7.3) kde I je náhodně vybrané celé celé číslo z {1, 2,..., d}, R j (0, 1) jsou voleny náhodně a nezávisle pro každé j a C [0, 1] je vstupní parametr. Křížení podle (7.3) se označuje jako binomiální. Kromě toho existuje ještě křížení exponenciální, ve kterém se vyměňují náhodně určený počet sousedních prvků vektorů. V diferenciální evoluci generování u podle rovnic (7.1) nebo (7.2) představuje mutaci, křížení probíhá podle (7.3), selekcí je výběr lepšího bodu z dvojice y a x i do nové populace Q. V diferenciální evoluci jsou tedy přítomny všechny tři nejdůležitější evoluční operace. 36

Ali a Törn navrhli určovat hodnotu parametru F v každém iteračním kroku podle adaptivního pravidla { max(fmin, 1 f max f F = min ) max(f min, 1 f min f max ) if f max f min < 1 jinak, (7.4) kde f min, f max jsou minimální a maximální funkční hodnoty v populaci P a F min je vstupní parametr, který zabezpečuje, aby bylo F [F min, 1). Autoři doporučují volit hodnotu F min 0.45. Předpokládá se, že tento způsob výpočtu F udržuje prohledávání diverzifikované v počátečním stadiu a intenzivnější v pozdější fázi prohledávání, což má zvyšovat spolehlivost hledání i rychlost konvergence. Výhodou algoritmu diferenciální evoluce je jeho jednoduchost a výpočetně nenáročné generování nového bodu y, které lze navíc velmi efektivně implementovat. Nevýhodou je poměrně velká citlivost algoritmu na nastavení hodnot vstupních parametrů F a C. Storn a Price doporučují volit hodnoty N = 10 d, F = 0.8 a C = 0.5 a pak tyto hodnoty modifikovat podle empirické zkušenosti z pozorovaného průběhu hledání. To je ovšem doporučení dosti vágní. K tomu, aby bylo užitečné, je nutná zkušenost a dobrá intuice řešitele problému. V testovacích úlohách v článku [19] sami užívají pro různé úlohy velmi odlišné hodnoty těchto parametrů, a to 0.5 F 1 a 0 C 1. Také velikost populace N volí často menší než doporučovanou hodnotu N = 10 d. Zde jsme si ukázali původní a nejjednodušší verzi algoritmu diferenciální evoluce. Existuje však spousta dalších variant (strategií). Tyto různé strategie se označují formální zkratkou DE/m/n/c, kde m označuje užitý typ mutace, n počet přičítaných rozdílů náhodně vybraných vektorů v mutaci a c je užitý typ křížení. Strategie užívající (7.1) a (7.3) se tedy označuje jako DE/rand/1/bin, strategie s (7.2) a (7.3) jako DE/best/2/bin. Porovnáme-li diferenciální evoluci s algoritmem CRS, vidíme, že v diferenciální evoluci se nenahrazuje nejhorší bod v populaci, ale pouze horší bod ve dvojici, což zabezpečuje větší diverzitu bodů nové populace po delší období, takže při stejné velikosti populace většinou DE ve srovnání s CRS má menší tendenci ukončit prohledávání v lokálním minimu, ale za to platíme pomalejší konvergencí při stejné podmínce ukončení. Jednoduchost implementace DE s generováním nového bodu postupem RAND ilustruje následující zdrojový text v Matlabu. 37

function [x_star,fn_star,func_evals]=... der_smp(fn_name, a, b, N, my_eps, max_evals, F, CR) % input parameters: % a, b row vectors, limits of search space, a < b % N size of population % my_eps small positive value for stopping criterion % max_evals max. evals per one dimension of search space % F,CR mutation parameters % output: % fn_star the minimal function value found by MCRS % x_star global minimum found by search % func_evals number of func_evals for reaching stop d=length(a); P=zeros(N,d+1); for i=1:n P(i,1:d)=a+(b-a).*rand(1,d); P(i,d+1)=feval(fn_name,(P(i,1:d))); end % 0-th generation initialized fmax=max(p(:,d+1)); [fmin, indmin]=min(p(:,d+1)); func_evals=n; Q=P; while (fmax-fmin > my_eps) & (func_evals < d*max_evals) %main loop for i=1:n % in each generation y=derand(p,f,cr,i); y=zrcad(y,a,b); % perturbation fy=feval(fn_name,y); func_evals=func_evals+1; if fy < P(i,d+1) % trial point y is good Q(i,:)= [y fy]; end end % end of generation P=Q; fmax=max(p(:,d+1)); [fmin,indmin]=min(p(:,d+1)); end % main loop - end x_star=p(indmin,1:d); fn_star=fmin; 38

function y=derand(p,f,c,expt); N=length(P(:,1)); d=length(p(1,:))-1; y=p(expt(1),1:d); vyb=nahvyb_expt(n,3,expt); % three random points without expt r1=p(vyb(1),1:d); r2=p(vyb(2),1:d); r3=p(vyb(3),1:d); v=r1+f*(r2-r3); change=find(rand(1,d)<c); if length(change)==0 % at least one element is changed change=1+fix(d*rand(1)); end y(change)=v(change); % random sample, k of N without repetition, % numbers given in vector expt are not included function vyb=nahvyb_expt(n,k,expt); opora=1:n; if nargin==3 opora(expt)=[]; end vyb=zeros(1,k); for i=1:k index=1+fix(rand(1)*length(opora)); vyb(i)=opora(index); opora(index)=[]; end Shrnutí Mutace jako přičtení rozdílu vektorů Křížení výměnou náhodně vybraných prvků vektoru Výběr lepšího z dvojice (selekce turnajem) Kontrolní otázky 1. Jaké jsou hlavní odlišnosti řízeného náhodného výběru a diferenciální evoluce? 2. Proč musí být F 0? Co by se stalo, kdybychom zadali F < 0? 3. Co způsobí zadání C = 0? 39

8 Genetické algoritmy Průvodce studiem Tato stručná kapitola má posloužit k základní orientaci v principech genetických algoritmů a upozornit na postupy, které jsou inspirativní pro jiné evoluční algoritmy. Počítejte asi se dvěma hodinami studia. Genetické algoritmy od svého vzniku v 70. létech [8] představují mohutný zdroj inspirace pro další evoluční algoritmy, pro zkoumání umělé inteligence a pro rozvoj soft computing. O genetických algoritmech existuje řada specializovaných monografií, viz např. Goldberger [7], Michalewicz [12] nebo Bäck [1]. Velmi dobře a srozumitelně napsaný úvod do genetických algoritmů najdete v dostupné knize Kvasničky, Pospíchala a Tiňa [10]. Zde se omezíme jen na stručné vysvětlení základních principů těchto algoritmů. Základní myšlenkou genetických algoritmů je analogie s evolučními procesy probíhajícími v biologických systémech. Podle Darwinovy teorie přirozeného výběru přežívají jen nejlépe přizpůsobení jedinci populace. Mírou přizpůsobení je tzv. fitness jedince. V biologii je fitness chápána jako relativní schopnost přežití a reprodukce genotypu jedince. Biologická evoluce je změna obsahu genetické informace populace v průběhu mnoha generací směrem k vyšším hodnotám fitness. Jedinci s vyšší fitness mají větší pravděpodobnost přežití a větší pravděpodobnost reprodukce svých genů do generace potomků. Kromě reprodukce se v populačním vývoji uplatňuje i tzv. mutace, což je náhodná změna genetické informace některých jedinců v populaci. V genetických algoritmech je fitness kladné číslo přiřazené genetické informaci jedince. Tato genetická informace jedince (chromozóm) se obvykle vyjadřuje bitovým řetězcem. Populaci jedinců pak modelujeme jako populaci chromozomů a každému chromozómu (bitovému řetězci) umíme přiřadit hodnotu účelové funkce a podle vhodného předpisu umíme přiřadit i jeho fitness, podrobněji viz [10]. Obvykle chromozómem je binární vektor konstantní délky k α = (α 1, α 2,..., α k ) {0, 1} k a populace velikosti N je potom množina takových chromozomů P = {α 1, α 2,..., α N } Pokud hledáme globální minimum účelové funkce f, pak fitness F je nějaké zobrazení, které vyhovuje následující podmínce f(α i ) f(α j ) F (α i ) F (α j ) > 0, i, j = 1, 2,..., N Nejjednodušší způsob, jak vyhovět této podmínce, je lineární zobrazení funkčních hodnot na fitness, kdy hodnotu fitness určíme podle vztahu F (α) = F max F min f min f max f(α) + f minf min f max F max f min f max, 40

kde f min a f max je nejmenší a největší hodnota funkce v populaci, F min a F max je minimální a maximální hodnota fitness, které obvykle volíme F max = 1 a F min = ɛ, kde ɛ je malé kladné číslo, např. ɛ = 0.01. Pak vztah pro fitness má tvar F (α) = 1 f min f max [(1 ɛ)f(α) + ɛf min f max ]. Pak je vhodné hodnoty fitness renormalizovat, aby jejich součet byl roven jedné. Renormalizovaná fitness i-tého jedince je F (α i ) = F (α i ) N j=1 F (α j) a tato hodnota pak udává i pravděpodobnost účasti jedince na reprodukci jeho genetické informace, tj. vytvoření potomka. Výběr (selekci) jedince s pravděpodobností F (α i ) ukazuje následující algoritmus, vstupem je vektor fitness všech jedinců populace, hodnoty fitness nemusí být renormalizovány. function res=roulette_simple(fits) % % returns an integer from [1, length(fits)] % with probability proportional % to fits(i)/ sum fits % h =length(fits); ss=sum(fits); cp(1)=fits(1); for i=2:h cp(i)=cp(i-1)+fits(i); end cp=cp/ss; res=1+fix(sum(cp<rand(1))); Reprodukce probíhá křížením dvou chromozomů tak, že si vymění své geny (části bitový řetězců). Ze dvou rodičů α, β v jednobodovém křížení vzniknou dva potomci podle následujícího schématu: (α 1,..., α l, α (l+1),..., α k ) (α 1,..., α l, β (l+1),..., β k ) (β 1,..., β l, β (l+1),..., β k ) (β 1,..., β l, α (l+1),..., α k ) Bod křížení l se volí náhodně. Někdy se také užívá dvoubodové křížení, ve kterém se určí náhodně dvě pozice pro křížení, l 1, l 2, l 2 > l 1 a v bitových řetězcích se vymění úseky α l1,..., α l2 β l1,..., β l2 41

Mutace je většinou v genetických algoritmech implementována jako změna hodnoty náhodně vybraného bitu v chromozómu, tj. hodnota 0 se změní na 1, hodnota 1 na 0. Mutací je zajištěno, aby mohla v populaci vzniknout genetická informace, která v něm v předcházejících generací nebyla, či obnovení genetické informace ztracené v průběhu dosavadního vývoje. V důsledku toho pak algoritmus může uniknout z oblasti lokálního minima, ke kterému by směřoval, pokud bychom užívali pouze křížení. Naopak, pokud bychom užívali pouze mutaci, genetický algoritmus by se choval podobně jako slepé náhodné prohledávání. Lze ukázat, že genetický algoritmus konverguje ke globálnímu extrému, viz [10]. S genetickými algoritmy a tímto důkazem jste se také setkali v předmětu Neuronové sítě, takže zde se jím nebudeme zabývat. Genetické algoritmy na rozdíl od ostatní algoritmů uváděných v tomto textu reprezentují jedince jako bitový řetězec, nikoliv jako vektor hodnot v pohyblivé řádové čárce. To je často výhodou při řešení tzv. diskrétních úloh globální optimalizace (kombinatorické úlohy jako je problém obchodního cestujícího), ale přínáší to komplikace v problémech, prohledávaná oblast D možných řešení je spojitá. Pokud bychom úseky chromozómu interpretovali jako celá čísla (datový typ integer), pak se potýkáme s obtíží, že sousední číselné hodnoty se jsou reprezentovány řetězci, které se mohou podstaně lišit, dokonce i ve všech bitech, např. dekadická hodnota 7 je binárně (0111), následující číselná hodnota 8 je (1000). Tuto nepříjemnost je nutno v genetických algoritmech nějak ošetřit, pokud mají být úspěšně používány i pro řešení spojitých problémů globální optimalizace. Je to možno řešit buď použitím Grayova kódu [10], kdy řetězce reprezentující sousední celočíselné hodnoty se liší jen v jednom bitu, ale přináší to další časový nárok na konverzi do Grayova kódu a zpět nebo se závádějí varianty genetických algoritmů s reprezentací jedince jako vektoru číselných hodnot v pohyblivé čárce. Pak je ovšem nutné užívat jiné operace křížení a mutace než ty, které jsou uvedeny výše. 42

Shrnutí Evoluce v biologických systémech Genetická informace, chromozóm, fitness Operátory selekce, křížení a mutace v genetických algoritmech Kontrolní otázky 1. Proč jako fitness nelze užívat přímo hodnotu účelové funkce? 2. Jaká je role mutace v genetických algoritmech? 43

9 Evoluční strategie Průvodce studiem V této kapitole jsou vysvětleny základy evoluční strategie, která patří k nejstarším a stále velmi populárním a inspirujícím evolučním algoritmům. Počítejte asi se třemi hodinami studia. Původní nejjednodušší verzi algoritmu navrhli v šedesátých létech Schwefel a Rechenberg. Základní myšlenka je podobná slepému náhodnému prohledávání, ale rozdíl je v tom, že nový bod y se generuje jako mutace bodu x tak, že jednotlivé složky vektoru x se změní přičtením hodnot normálně rozdělených náhodných veličin y = x + u, u N(0, σ 2 I), (9.1) tj. u = (U 1, U 2,..., U d ) je náhodný vektor, jehož každý prvek je náhodná veličina U i N(0, σ 2 ), i = 1, 2,..., d a tyto veličiny jsou navzájem nezávislé. Algoritmus lze zapsat v Matlabu takto: function [x,fx] = es1p1const(fn_name,a,b,t,sigma) % input parameters: % fn_name function to be minized (M file) % a, b row vectors, limits of search space % t iteration number % sigma standard deviation (const) % output: % fx the minimal function value found % x minimum found by search d=length(a); fx=realmax; x=a+(b-a).*rand(1,d); for i=1:t y= x + sigma*randn(1,d); fy= feval(fn_name,y); if fy < fx x=y; fx=fy; end end Evoluční terminologií může být algoritmus popsán tak, že z rodičovské generace velikosti 1 vzniká generace potomků rovněž velikosti 1, potomek vzniká mutací z jednoho rodiče podle rov. (9.1) a operárorem selekce je výběr lepšího jedince z dvojice (tzv. turnajový výběr). Zajímavou otázkou je to, jak volit hodnoty směrodatných odchylek pro mutaci. V rov. (9.1) jsou všechny σ j, j = 1, 2,..., d shodné a konstantní. To 44

samozřejmě není nutné, každá dimenze může mít svou hodnotu směrodatné odchylky, tedy budeme pracovat s vektorem směrodatných odchylek σ = (σ 1, σ 2,..., σ d ) a navíc, vektor směrodatných odchylek nemusí být v každém iteračním kroku stejný, ale hodnoty jeho prvků se mohou adaptovat podle průběhu procesu vyhledávání. Rechenberg studoval vliv velikosti mutace při generování potomka, tj. hodnot σ na rychlost konvergence algoritmu a na dvou jednoduchých funkcích odvodil tzv. pravidlo jedné pětiny úspěšnosti. Empiricky se pak byla ověřena užitečnost tohoto pravidla i pro jiné funkce. Hodnoty směrodatných odchylek se v i-té iteraci hledání upravují podle pravidla vyjádřeného rovnicí c 1 σ i 1 když ϕ(n) < 1 5 σ i = c 2 σ i 1 když ϕ(n) > 1 5 σ i 1 jinak (9.2) c 1 < 1 a c 2 > 1 jsou vstupní parametry, kterými se řídí zmenšování či zvětšování hodnot směrodatných podle relativní četnosti úspěchu ϕ(n) v předcházejících n krocích. Úspěchem se rozumí to, že f(y) < f(x). Počet kroků n je vstupní parametr. Obvykle se volí hodnoty c 1 = 0.82 a c 2 = 1/c 1 = 1.22. Pod vlivem rozvoje jiných evolučních algoritmů bylo dalším krokem v evoluční strategii zavedení populací velikostí větších než jedna. Označíme-li velikost rodičovské populace M a velikost populace potomků L, L > M, pak můžeme uvažovat o dvou variantách algoritmu evoluční strategie, v literatuře obvykle označovaných jako ES(M+L) a ES(M,L): ES(M+L) - generace potomků je vytvořena M jedinci s nejmenšími funkčními hodnotami ze všech M +L jedinců jak rodičovské populace, tak populace potomků. V této variantě se dodržuje tzv. elitismus, tj. nejlepší jedinec vždy přežívá a přechází do nové generace. ES(M,L) - generace potomků je vytvořena M jedinci s nejmenšími funkčními hodnotami z L jedinců populace potomků. Rodičovské generace tedy je kompletně nahrazena nejlepšími jedinci z populace potomků. V literatuře (viz např. [10]) se doporučuje, aby velikost populace potomků L byla volena několikanásobně větší než velikost rodičovské populace M. Také se uvádí, že varianta ES(M,L) obvykle konverguje pomaleji než ES(M+L), ale s menší tendencí ukončit prohledávání v lokálním minimu. Algoritmus ES(M+L) v Matlabu je uveden na následující stránce. 45

function [x,fx,func_evals] =... es_mpl(fn_name,a,b,m,k,lfront,my_eps,max_evals) d=length(a); sigma=(b-a)/3; % initial values of sigma fr=rand(1,lfront) < 0.2; % initial values in last lfront steps L=M*k; % k>1, integer P=ones(M,d+1); Q=ones(L,d+1); for i=1:m P(i,1:d)=a+(b-a).*rand(1,d); P(i,d+1)= feval(fn_name,p(i,1:d)); end % 0-th generation initialized P=sortrows(P,d+1); func_evals=m; while ((P(M,d+1)-P(1,d+1))>my_eps)&... (func_evals<d*max_evals) % main loop for t=1:k for i=1:m x=p(i,1:d); y=x+sigma.*randn(1,d); y=zrcad(y,a,b); fy= feval(fn_name,y); func_evals=func_evals+1; Q((t-1)*M + i,:)=[y fy]; fr(1)=[]; if fy < P(i,d+1) fr(end+1)=1; else fr(end+1)=0; end if sum(fr)/lfront < 0.2 sigma=sigma*0.82; elseif sum(fr)/lfront > 0.2 sigma=sigma*1.22; end end end PQ=[P; Q]; PQ=sortrows(PQ,d+1); P=PQ(1:M,:); P(1,d+1) end % main loop - end x=p(1,1:d); fx=p(1,d+1); 46

Autoři algoritmu evoluční strategie v minulosti museli čelit výtkám, že evoluční strategie z osvědčených evolučních operátorů evoluční strategie vůbec nevyužívá křížení. Proto byly navrženy pokročilejší varianty evoluční strategie, ve kterých je křížení obsaženo. Základní idea takového křížení spočívá v tom, že u každého jedince v populaci je kromě souřadnic v prostoru D i jeho vektor směrodatných odchylek a vektor směrodatných odchylek potomka se pak generuje křížením s náhodně vybraným jiným jedincem. Máme-li dva rodiče a, b s vektory směrodatných odchylek σ a, σ b, pak vektor směrodatných odchylek jejich potomka je určován např. jako σ = σa + σ b, 2 což je tzv. křížení průměrem nebo podle nějaké obdobného jen o trochu komplikovanějšího pravidla pro křížení. Pro funkce, u kterých je jejich globální minimum v protáhlém údolí, jehož směr není rovnoběžný se žádnou dimenzí prostoru D, se užívá ještě sofistikovanější varianta evoluční strategie, v níž u každého jedince v populaci se kromě souřadnic v prostoru D a jeho vektoru směrodatných odchylek uchovávají i mimodiagonální prvky kovarianční matice (tzv. směrové úhly, viz např. [10]) a křížení probíhá nejen na vektorech směrodatných odchylek, ale na celé kovarianční matici. Takové varianty evoluční strategie jsou však nejenom implemetačně podstatně náročnější, ale také mají větší paměťové nároky i větší časovou spotřebu na jeden iterační krok. Shrnutí mutace v evoluční strategii adaptace hodnot směrodatných odchylek ES(M,L) a ES(M+L) Kontrolní otázky 1. Co je pravidlo jedné pětiny a k čemu se užívá? 2. Porovnejte výhody a nevýhody variant ES(M,L) a ES(M+L). 3. Jak je pravidlo jedné pětiny implementováno ve variantě ES(M+L) v Matlabu a kterým parametrem řídíme délku sledovaného počtu předchozích iterací? 47

10 Experimentální ověřování a porovnávání algoritmů Průvodce studiem V této kapitole je uvedeno několik funkcí, které se užívají v testování stochastických algoritmů pro globální optimalizaci. Z nich si vyberte testovací funkce pro vaše experimenty. Druhá část kapitoly se zabývá testováním stochastických algoritmů. K orientaci v této kapitole budete potřebovat asi dvě až tři hodiny. 10.1 Testovací funkce K testování stochastických algoritmů pro globální optimalizaci se užívá celá řada funkcí, u kterých je známé správné řešení, tj. globální minimum (většinou lze najít analyticky). Zde uvádíme několik funkcí, které můžeme užít při experimentální testování vámi implementovaných algoritmů. Další testovací funkce naleznete např. v [1, 19, 23] nebo na webu. Všechny dále uvedené funkce lze užít pro různé dimenze prohledávané domény pro d 2. 48

První De Jongova funkce je jednoduchý rotační paraboloid f(x) = d x 2 i, i=1 při experimentech prohledávaný prostor pro d = 3 je obvykle vymezen podmínkou x i [ 5.12, 5.12]. Je to jednomodální funkce, globální minimum je x = (0, 0, 0), f(x ) = 0. Je považována za velmi snadnou úlohu globální optimalizace, pokud algoritmus selhává nebo pomalu konverguje v této úloze, tak nezaslouží další pozornosti. Graf této funkce pro d = 2 je na následujícím obrázku. 50 40 30 20 10 0 5 5 0 0 5 5 49

Druhá De Jongova funkce (Rosenbrockovo sedlo, známá i pod názvem banánové údolí) je definována takto: d 1 [ f(x) = 100(x 2 i x i+1 ) 2 + (1 x i ) 2], i=1 prohledávaný prostor je obvykle vymezen podmínkou x i [ 2.048, 2.048], globální minimum je x = (1, 1,... 1), f(x ) = 0, obvykle v testech užívané dimenze jsou d = 2, d = 10 a d = 30. Ač je to jednomodální funkce, nalezení minima iteračními algoritmy není jednoduchá úloha, neboť minimum leží v zahnutém údolí s velmi malým spádem a některé algoritmy končí prohledávání předčasně. Graf této funkce pro d = 2 je na následujícím obrázku. 3000 2000 minimum f [1,1] = 0 1000 0 4 2 0 2 2 1 0 1 2 50

Ackleyho funkce je f(x) = 20 exp 0.02 1 d d i=1 x 2 i exp ( 1 d d cos 2πx i )+20+exp(1), i=1 x i [ 30, 30], x = (0, 0,... 0), f(x ) = 0, v testech užívané dimenze obvykle jsou d = 2, d = 10, d = 30 a d = 50. Je to multimodální funkce s mnoha lokálními minimy, středně obtížná. Graf této funkce pro d = 2, x i [ 3, 3], je na následujícím obrázku. 4 3 2 f(x) 1 0 1 2 0 x2 2 3 2 1 x1 0 1 2 3 51

Griewankova funkce, f(x) = d i=1 2 x i d 4000 i=1 ( ) xi cos + 1, i x i [ 400, 400], x = (0, 0,... 0), f(x ) = 0, v testech obvykle užívané dimenze stejné jako u Ackleyho funkce. Nalezení minima této multimodální funkce je považováno za obtížnou úlohu globální optimalizace. Graf této funkce pro d = 2, x i [0, 15], je na následujícím obrázku. 52

Rastriginova funkce f(x) = 10d + d [x 2 i 10 cos(2πx i )] i=1 x i [ 5.12, 5.12], x = (0, 0,... 0), f(x ) = 0, v testech nejčastěji užívaná dimenze je d = 5 a d = 10. Nalezení minima této multimodální funkce je považováno za obtížnou úlohu globální optimalizace. Graf této funkce pro d = 2 je na následujícím obrázku. 53