OBJEKTOVÁ KNIHOVNA EVOLUČNÍCH ALGORITMŮ



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

STOCHASTICKÉ ALGORITMY V ODHADU PARAMETRŮ REGRESNÍCH MODELŮ

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jak se matematika poučila v biologii

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

Ing. Tomáš MAUDER prof. Ing. František KAVIČKA, CSc. doc. Ing. Josef ŠTĚTINA, Ph.D.

ÚPRAVA METODY FLEXIBILNÍHO SIMPLEXU PRO ŘEŠENÍ PROBLÉMŮ GLOBÁLNÍ OPTIMALIZACE Miroslav Provazník

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

OPTIMALIZACE. (přehled metod)

Genetické programování 3. část

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Úvod do programovacích jazyků (Java)

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

PŘEDNÁŠKA 03 OPTIMALIZAČNÍ METODY Optimization methods

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

Numerické metody a programování. Lekce 8

TÉMATICKÝ OKRUH Softwarové inženýrství

Smysl metodiky IS/IT. Koncentrovaná zkušenost Checklist na nic nezapomeneme

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Optimalizace & soft omezení: algoritmy

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Generické programování

typová konverze typová inference

Metaheuristiky s populacemi

Evolučníalgoritmy. Dále rozšiřována, zde uvedeme notaci a algoritmy vznikléna katedře mechaniky, Fakulty stavební ČVUT. Moderní metody optimalizace 1

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.


KTE / ZPE Informační technologie

Datové struktury 2: Rozptylovací tabulky

Abstraktní třídy, polymorfní struktury

20. Projekt Domácí mediotéka

1. Dědičnost a polymorfismus

Úvod do stochastických optimalizačních metod (metaheuristik) Moderní metody optimalizace 1

1. Programování proti rozhraní

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

Jazyk C++ I. Šablony

Objektově orientovaná implementace škálovatelných algoritmů pro řešení kontaktních úloh

Úvod do programování - Java. Cvičení č.4

VE 2D A 3D. Radek Výrut. Abstrakt Tento článek obsahuje postupy pro výpočet Minkowského sumy dvou množin v rovině a pro výpočet Minkowského sumy

Popis zobrazení pomocí fuzzy logiky

Grammar-based genetic programming

Genetické programování

3. Třídy P a NP. Model výpočtu: Turingův stroj Rozhodovací problémy: třídy P a NP Optimalizační problémy: třídy PO a NPO MI-PAA

METODY DOLOVÁNÍ V DATECH DATOVÉ SKLADY TEREZA HYNČICOVÁ H2IGE1

ODR metody Runge-Kutta

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Evoluční výpočetní techniky (EVT)

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

Objekt. základní prvek v OOP. má vlastnosti. má metody. vznikne vytvoření nové instance definován pomocí třídy

Úvod do optimalizace, metody hladké optimalizace

AVDAT Mnohorozměrné metody, metody klasifikace Shluková analýza

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Poslední nenulová číslice faktoriálu

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Kolekce, cyklus foreach

LFLC MATLAB/SIMULINK - SYSTÉM PRO UNIVERSÁLNTÍ APLIKACE FUZZY LOGIKY. Antonín Dvořák, Hashim Habiballa, Vilém Novák a Vikátor Pavliska

X36SIN: Softwarové inženýrství. Životní cyklus a plánování

Matematická indukce a správnost programů. Základy diskrétní matematiky, BI-ZDM ZS 2011/12, Lekce 13

Genetické algoritmy. Informační a komunikační technologie ve zdravotnictví

Základy objektové orientace I. Únor 2010

Hledání extrémů funkcí

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Optimalizace obecný úvod. [proč optimalizovat?] Formalizace problému. [existují podobné problémy?]

Navrženy v 60. letech jako experimentální optimalizační metoda. Velice rychlá s dobrou podporou teorie

Stochastické algoritmy pro globální optimalizaci

Úvod do programovacích jazyků (Java)

Základy algoritmizace. Hašování

Matematika pro informatiky

Úvod do optimalizace Matematické metody pro ITS (11MAMY)

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Seminář z umělé inteligence. Otakar Trunda

Složitost Filip Hlásek

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

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.

LADISLAV RUDOLF. Doc., Ing., Ph.D., University of Ostrava, Pedagogical fakulty, Department of Technical and Vocational Education, Czech Republic

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Algoritmizace diskrétních. Ing. Michal Dorda, Ph.D.

OSA. maximalizace minimalizace 1/22

Kombinatorická minimalizace

OPTIMALIZACE A MULTIKRITERIÁLNÍ HODNOCENÍ FUNKČNÍ ZPŮSOBILOSTI POZEMNÍCH STAVEB D24FZS

Seminář Java IV p.1/38

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

REGRESNÍ ANALÝZA V PROSTŘEDÍ MATLAB

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Základy umělé inteligence

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

GLOBÁLNÍ OPTIMALIZACE S VYUŽITÍM SOFTWARU MATHEMATICA

Konstruktory a destruktory

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Jazyk C# (seminář 3)

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Adaptace v algoritmu diferenciální evoluce

Dynamické datové struktury I.

Genetické algoritmy. a jejich praktické využití. Pavel Šturc. průmyslu, stejně tak je zde uvedeno i několik případů jejich úspěšné implementace.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Základní datové struktury

Transkript:

OBJEKTOVÁ KNIHOVNA EVOLUČNÍCH ALGORITMŮ David Bražina, Hashim Habiballa, Viktor Pavliska Katedra informatiky a počítačů, PřF OU, 30. dubna 22, Ostrava 1 Ústav pro výzkum a aplikace fuzzy modelování, OU, 30. dubna 22, Ostrava 1 david.brazina@osu.cz, hashim.habiballa@osu.cz, viktor.pavliska@osu.cz * Abstrakt Příspěvek popisuje návrh knihovny pro implementaci evolučních algoritmů v optimalizačních problémech. Tato problematika je řešena v rámci grantu GAČR "Evoluční algoritmy se soutěžícími a spolupracujícími heuristikami". Článek postupně stručně popisuje principy evolučních algoritmů a zejména se zaměřuje na návrh objektové hierarchie pro řešení optimalizačních problémů s možností jejího rozšiřování uživatelem. Abstract The article describes the design of software library for evolutionary algorithms implementation in optimization problems. Creation of the library is related to the project GAČR "Evolutionary algorithms with competition and cooperation of heuristics". The paper briefly shows principles of evolutionary algorithms and it focuses mainly to the structure of the library for solutions of optimization problems with the possibility to extend it by its user. Úvod Úlohou nalezení globálního minima účelové funkce je nalezení bodu s nejnižší funkční hodnotou v prohledávaném prostoru. V řadě metod je potřeba nalézt globální minimum (nebo maximum) v souvislé oblasti a účelovou funkci umíme vyhodnotit s požadovanou přesností v každém bodu. Tuto úlohu lze formulovat následovně. Mějme účelovou funkci f : D R, D R d. Pak x * = arg min x D f(x) je globální minimum. V takových úlohách však je možné užít stochastických algoritmů pro globální optimalizaci, zejména evolučních algoritmů [1], [2]. Z 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í, není diferencovatelná, případně má * Tato práce byla podporována z projektu GAČR: 201/05/0284 Evoluční algoritmy se soutěžícími a spolupracujícími heuristikami.

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 NPobtíž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ému použitelné [5]. Evoluční algoritmy jsou ve své podstatě modely Darwinovského vývoje populací. Charakteristické pro ně je to, že pracují s jednou či více populacemi jedinců (jedinec je většinou bod v prohledávaném prostoru a využívají tzv. evoluční operátory: - selekce nejsilnější jedinci z populace mají větší pravděpodobnost přežití a rozmnožení svých vlastností, - 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 muže být náhodně modifikována, - migrace u tzv. paralelních algoritmu, kdy existuje více populací vedle sebe, někteří jedinci migrují mezi populacemi. V rámci řešení projektu GAČR je na katedře informatiky a počítačů Ostravské Univerzity vyvíjena objektová knihovna těchto algoritmů, která má poskytnout praktickou realizaci teoretických výsledků výzkumu. Knihovna umožní nejen použití teoreticky zkoumaných technik založených na principu evolučních algoritmů, ale i eventuální rozšiřování jejími uživateli. Knihovna je programována v jazyce C++ a je založena na objektových principech. V tomto článku se věnujeme popisu práce, která byla provedena v prvních měsících práce na projektu, kdy jde především o specifikaci cílů a návrhu struktury knihovny. Tento návrh se opírá nejen o identifikaci a deklaraci abstraktních tříd, které vyplývají z logiky řešeného problému, ale i o konkrétní potomky těchto tříd pro jeden z nejjednodušších algoritmů jednoduchou variantu řízeného náhodného prohledávání (CRS). Objektová knihovna V rámci návrhu vytvářené objektové knihovny byly specifikovány základní třídy objektů pro univerzální aplikaci evolučních algoritmů pomocí jazyka UML [3]. Jedná se o následující třídy: EAlgorithm: Jedná se o nejdůležitější třídu, která v sobě obsahuje jádro konkrétního algoritmu pro řešení optimalizačního problému. Potomci této abstraktní třídy musí implementovat minimálně dvě metody Compute, která řídí vlastní proces výpočtu konkrétního algoritmu a NewPopulation, která specifikuje způsob tvorby nové populace. EAProblem: Tato třída obsahuje zadání konkrétního řešeného problému. Instanci potomka této třídy musí mít k dispozici algoritmus, který má za úkol daný problém vyřešit. Potomci této třídy musí implementovat metodu dimension, která určuje dimenzi (rozměr) problému a dále metodu InitialPopulation, která vytvoří počáteční populaci, k čemuž může využít metody RandomPopulation (generuje náhodnou populaci) anebo může sama vygenerovat konkrétní populaci. Klíčovou metodou je NewMember, která je schopna z předložených dat vytvořit nového člena populace odpovídající typu řešené úlohy.

EAPopulation: Implementuje seznam členů populace a umožňuje s nimi pracovat pomocí následujících metod: addmember, která přidá do populace nového člena a randomselect umožňující náhodný výběr. EAPopulationMember: Zapouzdřuje datovou strukturu Vector, která slouží k uchovávání dat specifikujících člena v prohledávaném prostoru a dále důležitou metodu Criteria, která umí ohodnotit člena pomocí funkce popisující řešenou úlohu. EASearchSpace: Nese informace o prohledávaném prostoru a pomocí metody ContainsVector umožňuje určit příslušnost k němu a dále poskytuje metodu RandomVector, která vygeneruje náhodný vektor. EADomain: Abstraktní třída, jejíž potomci implementují strukturu jednoho rozměru prohledávaného prostoru. Nejpoužívanější implementací je jednoduchý interval EAInterval. EAPopulation EASearchSpace EAlgorithm #currentpopulation : EAPopulation* #oldpopulation : EAPopulation* #problem : EAProblem* oldpopulation currentpopulation EAPopulation +ContainsVector( v : Vector& ) : bool +dimension() : int +Domains( index : int ) : EADomain* +RandomVector() : Vector 1 +Compute( aproblem : EAProblem* ) : void +NewPopulation() : void problem searchspace EAlgorithmSimplex +Compute( aproblem : EAProblem* ) : void +NewPopulation() : void +ReflectionBySimplex() : EAPopulationMember* +Simplex( members : EAPopulation* ) : Vector EAProblem +searchspace : EASearchSpace* +dimension() : int <<constructor>>+eaproblem() +InitialPopulation() : EAPopulation* +newmember( adata : Vector ) : EAPopulationMember* +newrandommember() : EAPopulationMember* +Output( str : AnsiString ) : void +RandomPopulation( count : int ) : EAPopulation* Domains n EAExampleProblem +dimension() : int <<constructor>>+eaexampleproblem() +InitialPopulation() : EAPopulation* +newmember( adata : Vector ) : EAPopulationMember* +Output( str : AnsiString ) : void EADomain +ContainsValue( value : TReal ) : bool +RandomValue() : TReal EAInterval +high : TReal +low : TReal +ContainsValue( value : TReal ) : bool <<constructor>>+eainterval( alow : TReal, ahigh : TReal ) +RandomValue() : TReal

EAPopulation +addmember( amember : EAPopulationMember* ) : void +addmembers( members : EAPopulation* ) : void +Members( index : int ) : EAPopulationMember* +PrintPopulation() : AnsiString +randomselect( remove : bool=false ) : EAPopulationMember* +randomselect( selection : EAPopulation*, number : int, remove : bool=false ) : EAPopulation* 1 +data : Vector Members n EAPopulationMember +Criteria() : TReal <<constructor>>+eapopulationmember( adata : Vector ) +print() : AnsiString EAExampleMember +Criteria() : TReal <<constructor>>+eaexamplemember( adata : Vector ) data +data : TReal* +dimension : int Vector +newvector( adimension : int,... ) : Vector operator * operator * operator + operator - operator = operator [] +Reflection( S : Vector& ) : Vector <<constructor>>+vector( v : Vector& ) <<constructor>>+vector( adimension : int, adata : TReal*=NULL ) <<destructor>>+~vector() Způsob využití Objektová knihovna poskytuje dva základní přístupy k jejímu využití: 1. Uživatelský: spočívá ve využití existujících potomků třídy EAlgorithm (uživatel si nevytváří vlastní algoritmy, ale pouze využívá již hotových). V tomto případě musí specifikovat pouze vlastní potomky tříd EAProblem a EAPopulationMember. 2. Programátorský: jde o náročnější úroveň použití, která spočívá ve vytváření vlastních potomků třídy EAlgorithm, čímž si může rozšířit knihovnu o implementaci vlastních evolučních algoritmů specifických pro jeho úlohy. Pro oba přístupy je nutná znalost programovacího jazyka C++ včetně zásad objektově orientovaného programování. Dokumentace projektu bude tyto dva přístupy rozlišovat. Řešený příklad Ukázkou programátorského rozšíření knihovny je implementace algoritmu jednoduché varianty řízeného náhodného prohledávání (CRS) [4]. Ří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. Algorimus CRS navrhl Price 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 vetší 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. Z populace se vybere náhodně d + 1 nekomplanárních bodů tvořících simplex. 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 = 2g - x, kde x 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 můžeme jednoduše zapsat následujícím způsobem: generuj populaci P, tj. N bodů náhodně v D repeat najdi xworst z P takové, že f(xworst) >= f(x), x z P repeat y := reflexe simplexu, y z D until f(y) < f(xworst); xworst := y; until podmínka ukončení; V této ukázce je vytvořen potomek EAlgorithmSimplex odvozený z abstraktní třídy EAlgorithm. class EAlgorithmSimplex : public EAlgorithm { public: virtual void Compute(EAProblem *aproblem); virtual void NewPopulation(); Vector Simplex(EAPopulation *members); EAPopulationMember* ReflectionBySimplex(); ; void EAlgorithmSimplex::Compute(EAProblem *aproblem) { problem = aproblem; oldpopulation = problem->initialpopulation(); problem->output("initial Population:"); problem->output(oldpopulation->printpopulation()); for (int i = 0; i < 50; i++) { NewPopulation(); problem->output("new Population " + IntToStr(i+1) + ":"); problem->output(currentpopulation->printpopulation()); oldpopulation = currentpopulation; Vector EAlgorithmSimplex::Simplex(EAPopulation *members) { // simplex se vytvori jako aritmeticky prumer z prvnich dim clenu Vector suma(problem->dimension()); for(int i = 0; i < problem->dimension(); i++) { suma = suma + members->members(i)->data; return suma * (1.0 / problem->dimension()); EAPopulationMember* EAlgorithmSimplex::ReflectionBySimplex() { // novy clen vznikly reflexi podle simplexu EAPopulationMember *reflection = NULL; EAPopulation *selection = new EAPopulation;

oldpopulation->randomselect(selection, problem->dimension() + 1, rsremove); // vypocet simplexu z prvnich dim hodnot (0..dimension-1) Vector simplexvector = Simplex(selection); /* kontrola, zda se vektor nachazi v prohledavanem prostoru */ if(problem->searchspace->containsvector(simplexvector)) { // nejhorsi clen, ktery bude pouzit pro reflexi // clenove jsou setrizeni, takze posledni je nejhorsi EAPopulationMember *memberx = selection->members(problem->dimension()); // vypocet reflexe podle simplexu Vector reflectedvector = memberx->data.reflection(simplexvector); // novy clen vznikly reflexi podle simplexu reflection = problem->newmember(reflectedvector); // pridani vsech clenu pouzitych pro reflexi podle simplexu currentpopulation->addmembers(selection); delete selection; return reflection; void EAlgorithmSimplex::NewPopulation() { currentpopulation = oldpopulation; // konrola min poctu clenu pro simplex if(oldpopulation->count < problem->dimension() + 1) { return; EAPopulationMember *newmember; bool populationchanged = false; while(!populationchanged) { newmember = ReflectionBySimplex(); if(newmember == NULL) { continue; // nejhorsi clen soucasne populace EAPopulationMember *worst = oldpopulation->worst(); // kdyz je nove vytvoreny clen lepsi nez nejhorsi, // tak jej vytlaci z populace pryc if(newmember->criteria() < worst->criteria()) { currentpopulation->remove(worst); delete worst; currentpopulation->addmember(newmember); populationchanged = true; else { // kdyz je nove vytvoreny clen horsi nez puvodni, tak se zahodi delete newmember; class EAExampleMember : public EAPopulationMember { public: EAExampleMember(Vector adata); virtual TReal Criteria(); ;

class EAExampleProblem : public EAProblem { public: EAExampleProblem(); virtual EAPopulationMember* newmember(vector adata); virtual void Output(AnsiString str); virtual EAPopulation* InitialPopulation(); virtual int dimension(); ; TReal EAExampleMember::Criteria() { return data*data; EAExampleMember::EAExampleMember(Vector adata) : EAPopulationMember(aData) { EAExampleProblem::EAExampleProblem() { searchspace->add(new EAInterval(-1, 1)); searchspace->add(new EAInterval(-1, 1)); searchspace->add(new EAInterval(-1, 1)); int EAExampleProblem::dimension() { return searchspace->dimension(); EAPopulationMember* EAExampleProblem::newMember(Vector adata) { return new EAExampleMember(aData); EAPopulation* EAExampleProblem::InitialPopulation() { return RandomPopulation(20); Závěr Prezentovaný projekt (resp. jeho implementační část) je prozatím v úvodní fázi. Další fáze bude spočívat v implementaci jednotlivých typů již známých algoritmů včetně jejich nově zkoumaných modifikací. Pro tento účel konkrétní specifikace abstraktních tříd vytvoří hierarchii algoritmů podle jejich typu. Projekt je plánován na dobu tří let a výsledná verze by měla být tedy k dispozici v roce 2007. Literatura [1] TVRDÍK, J. Stochastické algoritmy pro globální optimalizaci a jejich aplikace ve výpočetní statistice. Habilitační práce : Přírodovědecká fakulta OU, 2004. 135 s. [2] KVASNIČKA, V., POSPÍCHAL, J., TIŇO, P.: Evolučné algoritmy. STU, Bratislava, 2000. [3] MERUNKA, V. Objektový přístup a UML v návrhu IS. In Tvorba Softwaru 2002, Tanger 2002, Ostrava. s. 123-133. [4] TVRDÍK, J., Generalized controlled random search and competing heuristics. In MENDEL 2004, 10th Internetional Conference on Soft Computing (Matoušek R. and Ošmera P. eds). University of Technology, Brno, 2004. s. 228-233. [5] TVRDÍK, J. Evoluční algoritmy. Učební texty Ostravské Univerzity, Ostrava 2004, 73 s.