01.12.2014 Views

vysoké učení technické v brně evoluční algoritmy - matlab gate toolbox

vysoké učení technické v brně evoluční algoritmy - matlab gate toolbox

vysoké učení technické v brně evoluční algoritmy - matlab gate toolbox

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ<br />

BRNO UNIVERSITY OF TECHNOLOGY<br />

FAKULTA STROJNÍHO INŽENÝRSTVÍ<br />

ÚSTAV AUTOMATIZACE A INFORMATIKY<br />

FACULTY OF MECHANICAL ENGINEERING<br />

INSTITUTE OF AUTOMATION AND COMPUTER SCIENCE<br />

EVOLUČNÍ ALGORITMY - MATLAB GATE TOOLBOX<br />

EVOLUTIONARY ALGORITHMS – MATLAB GATE TOOLBOX<br />

DIPLOMOVÁ PRÁCE<br />

DIPLOMA THESIS<br />

AUTOR PRÁCE<br />

AUTHOR<br />

VEDOUCÍ PRÁCE<br />

SUPERVISOR<br />

BC. JAN MINAŘÍK<br />

ING. RADOMIL MATOUŠEK, PH.D.<br />

BRNO 2007


ZADÁNÍ ZÁVĚREČNÉ PRÁCE<br />

3


5<br />

1. Pan/paní<br />

LICENČNÍ SMLOUVA<br />

POSKYTOVANÁ K VÝKONU PRÁVA UŽÍT ŠKOLNÍ DÍLO<br />

(dále jen „autor“)<br />

uzavřená mezi smluvními stranami:<br />

Jméno a příjmení: Jan Minařík<br />

Bytem: Blatnička 161, 696 71<br />

Narozen/a (datum a místo): 17.12.1979, Zlín<br />

2. Vysoké učení technické v Brně<br />

Fakulta strojního inženýrství<br />

se sídlem Technická 2896/2, 616 69 Brno<br />

a<br />

jejímž jménem jedná na základě písemného pověření děkanem fakulty:<br />

Doc. RNDr. Ing. Miloš Šeda, Ph.D., ředitel ÚAI<br />

(dále jen „nabyvatel“)<br />

LICENČNÍ SMLOUVA<br />

Čl. 1<br />

Specifikace školního díla<br />

1. Předmětem této smlouvy je vysokoškolská kvalifikační práce (VŠKP):<br />

□ disertační práce<br />

□ P diplomová práce<br />

□ bakalářská práce<br />

□ jiná práce, jejíž druh je specifikován jako .................................................<br />

(dále jen VŠKP nebo dílo)<br />

Název VŠKP:<br />

Vedoucí/ školitel VŠKP:<br />

Ústav:<br />

Datum obhajoby VŠKP:<br />

Evoluční <strong>algoritmy</strong> – Matlab GATE <strong>toolbox</strong><br />

Ing. Radomil Matoušek, PhD.<br />

Ústav Automatizace a Informatiky<br />

VŠKP odevzdal autor nabyvateli v * :<br />

□ P tištěné formě – počet exemplářů: 2<br />

□ P elektronické formě – počet exemplářů: 3<br />

*<br />

hodící se zaškrtněte


6<br />

2. Autor prohlašuje, že vytvořil samostatnou vlastní tvůrčí činností dílo shora popsané<br />

a specifikované. Autor dále prohlašuje, že při zpracovávání díla se sám nedostal do<br />

rozporu s autorským zákonem a předpisy souvisejícími a že je dílo dílem původním.<br />

3. Dílo je chráněno jako dílo dle autorského zákona v platném znění.<br />

4. Autor potvrzuje, že listinná a elektronická verze díla je identická.<br />

Článek 2<br />

Udělení licenčního oprávnění<br />

1 Autor touto smlouvou poskytuje nabyvateli oprávnění (licenci) k výkonu práva<br />

uvedené dílo nevýdělečně užít, archivovat a zpřístupnit ke studijním, výukovým a<br />

výzkumným účelům včetně pořizovaní výpisů, opisů a rozmnoženin.<br />

2 Licence je poskytována celosvětově, pro celou dobu trvání autorských a<br />

majetkových práv k dílu.<br />

3 Autor souhlasí se zveřejněním díla v databázi přístupné v mezinárodní síti<br />

□ P ihned po uzavření této smlouvy<br />

□ 1 rok po uzavření této smlouvy<br />

□ 3 roky po uzavření této smlouvy<br />

□ 5 let po uzavření této smlouvy<br />

□ 10 let po uzavření této smlouvy<br />

(z důvodu utajení v něm obsažených informací)<br />

4 Nevýdělečné zveřejňování díla nabyvatelem v souladu s ustanovením § 47b zákona<br />

č. 111/ 1998 Sb., v platném znění, nevyžaduje licenci a nabyvatel je k němu povinen<br />

a oprávněn ze zákona.<br />

Článek 3<br />

Závěrečná ustanovení<br />

1. Smlouva je sepsána ve třech vyhotoveních s platností originálu, přičemž po jednom<br />

vyhotovení obdrží autor a nabyvatel, další vyhotovení je vloženo do VŠKP.<br />

2. Vztahy mezi smluvními stranami vzniklé a neupravené touto smlouvou se řídí<br />

autorským zákonem, občanským zákoníkem, vysokoškolským zákonem, zákonem o<br />

archivnictví, v platném znění a popř. dalšími právními předpisy.<br />

3. Licenční smlouva byla uzavřena na základě svobodné a pravé vůle smluvních stran,<br />

s plným porozuměním jejímu textu i důsledkům, nikoliv v tísni a za nápadně<br />

nevýhodných podmínek.<br />

4. Licenční smlouva nabývá platnosti a účinnosti dnem jejího podpisu oběma<br />

smluvními stranami.<br />

V Brně dne: 23.5.2007<br />

……………………………………<br />

Nabyvatel<br />

……………………………………<br />

Autor


7<br />

ABSTRAKT<br />

Tato diplomová práce se zabývá problematikou řešení optimalizačních úloh za pomocí<br />

vybraných heuristických metod. Hlavním cílem bylo zdokonalení již existujícího Matlab GATE<br />

<strong>toolbox</strong>u pomocí externí dynamicky linkované knihovny DLL napsané v programovacím jazyce<br />

C++. Tato knihovna přebírá většinu stěžejních funkcí GATE <strong>toolbox</strong>u a veškeré kritické<br />

operace nadále probíhají v ní. GATE-DLL <strong>toolbox</strong> je rozšířen také o univerzální rozhraní XML,<br />

které umožňuje ukládání a uživatelskou editaci důležitého nastavení. Do služeb DLL knihovny<br />

byla také přidána podpora pro distribuované výpočty.<br />

V teoretické části práce jsou stručně popsány principy metod použitých při praktické<br />

realizaci. Jedná se o horolezecký algoritmus HCA a genetický algoritmus GA.<br />

V praktické části je nastíněna celková koncepce knihovny DLL, popis jejího rozhraní,<br />

implementace použitých algoritmů a rozhraní XML. Ke konci kapitoly je vysvětlen systém<br />

komunikace klient – server pro distribuované výpočty.<br />

Závěr práce je věnován praktickým testům vylepšeného GATE-DLL <strong>toolbox</strong>u, srovnání<br />

rychlosti, schopnosti nalezení optimálního řešení a testování distribuovaných výpočtů.<br />

ABSTRACT<br />

This thesis deals with the solution of optimizing problems by means of selected<br />

heuristic methods. The main purpose of the work was to improve still existing Matlab GATE<br />

<strong>toolbox</strong> through the use of external dynamic-link library DLL written in the programming<br />

language C++. This library takes over most of the pivotal functions of GATE <strong>toolbox</strong> and<br />

performs all the critical operations. In addition, GATE-DLL <strong>toolbox</strong> is enlarged with the<br />

universal interface XML which enables storage and user’s editing of the important setup. The<br />

services of the DLL library were supplemented with the support for distributed computing.<br />

The section of the thesis dealing with theory describes in brief the principles of methods<br />

applied to practical implementation. Respectively hill climbing algorithm HCA and genetic<br />

algorithm GA.<br />

The practical section outlines the general concept of the DLL library, gives the<br />

description of its interface, implementation of applied algorithms and XML interface. The client<br />

– server system of communication used for distributed computing is explained at the end of the<br />

chapter.<br />

The final section deals with practical tests of improved GATE-DLL <strong>toolbox</strong>, as well as<br />

with comparison of the speed, ability of finding the optimal solution and with testing the<br />

distributed computing.<br />

KLÍČOVÁ SLOVA<br />

Optimalizační problém, optimalizační funkce, horolezecký algoritmus, genetický<br />

algoritmus, Matlab, GATE, DLL, C++, XML, klient - server komunikace, distribuované<br />

výpočty.<br />

KEYWORDS<br />

Optimizing problem, optimizing function, hill climbing algorithm, genetic algorithm,<br />

Matlab, GATE, DLL, C++, XML, client - server communication, distributed computing.


9<br />

PODĚKOVÁNÍ<br />

Touto cestou bych chtěl poděkovat mému vedoucímu diplomové práce Ing. Radomilu<br />

Matouškovi, PhD. za jeho cenné rady a čas, který mi při realizaci této práce věnoval.


11<br />

Obsah:<br />

Zadání závěrečné práce...................................................................................................3<br />

Licenční smlouva.............................................................................................................5<br />

Abstrakt...........................................................................................................................7<br />

Poděkování......................................................................................................................9<br />

Seznam použitých zkratek............................................................................................13<br />

1 Úvod...............................................................................................................................15<br />

2 Teoretické základy........................................................................................................17<br />

2.1 Optimalizační problém...............................................................................................17<br />

2.2 Heuristické metody....................................................................................................18<br />

2.2.1 Horolezecký algoritmus........................................................................................18<br />

2.2.2 Genetický algoritmus ...........................................................................................18<br />

3 GATE <strong>toolbox</strong>................................................................................................................21<br />

3.1 Koncepce původního GATE <strong>toolbox</strong>u........................................................................21<br />

3.2 Vylepšení GATE – DLL GATE.................................................................................22<br />

3.2.1 Koncepce GATE-DLL.........................................................................................22<br />

4 Implementace................................................................................................................25<br />

4.1 Vnitřní implementace DLL.........................................................................................25<br />

4.1.1 Optimalizační jádro COptMethod.........................................................................25<br />

4.1.2 HCA <strong>algoritmy</strong>.....................................................................................................28<br />

4.1.3 Genetický algoritmus GA a GA-HC.....................................................................30<br />

4.1.4 XML parser..........................................................................................................31<br />

4.2 Rozhraní DLL knihovny.............................................................................................34<br />

4.3 Popis exportních funkcí DLL......................................................................................34<br />

4.3.1 Základní funkce....................................................................................................34<br />

4.3.2 Výkonné metody..................................................................................................36<br />

4.3.3 Funkce pro GA-HC..............................................................................................36<br />

4.3.4 Funkce pro kompatibilitu s původním GATE........................................................37<br />

4.3.5 Funkce pro podporu XML....................................................................................38<br />

4.3.6 Funkce pro podporu distribuovaných výpočtů.......................................................38<br />

4.3.7 Koeficient „míry pokrytí“ Hammingova prostoru.................................................39<br />

4.3.8 Struktura OptParams............................................................................................40<br />

4.4 Propojení DLL se systémem Matlab...........................................................................40<br />

4.4.1 Systém GATE-DLL.............................................................................................41<br />

4.4.2 Popis hlavní struktury GATE-DLL.......................................................................41<br />

4.4.3 Popis GATE-DLL funkcí.....................................................................................42<br />

4.4.4 Sestavení vektorizované funkce............................................................................45<br />

4.5 Systém distribuovaných výpočtů ................................................................................46<br />

4.5.1 Struktura master XML souboru............................................................................47<br />

4.5.2 Průběh komunikace:.............................................................................................47<br />

4.5.3 Server aplikace.....................................................................................................48<br />

4.5.4 Popis ovládání server aplikace:.............................................................................48<br />

4.5.5 Klientská část.......................................................................................................51<br />

5 Praktické testy GATE-DLL..........................................................................................53<br />

5.1 Testovací funkce F6...................................................................................................53<br />

5.2 Testování rychlosti GATE vs. GATE-DLL.................................................................54<br />

5.3 Test využití paměti RAM...........................................................................................56<br />

5.4 Schopnost nalezení řešení...........................................................................................57<br />

5.5 Srovnání algoritmů GA a GA-HC...............................................................................58<br />

5.6 Statistické zobrazení vývoje výpočtů GA....................................................................59<br />

5.7 Testování distribuovaných výpočtů.............................................................................60<br />

6 Závěr..............................................................................................................................63<br />

Seznam literárních zdrojů.............................................................................................65


13<br />

SEZNAM POUŽITÝCH ZKRATEK<br />

CPU<br />

DLL<br />

GA<br />

GA-HC<br />

HCA<br />

HW<br />

LAN<br />

PC<br />

RAM<br />

XML<br />

- Central Processing Unit, procesor počítače<br />

- Dynamic Linking Library<br />

- Genetic Algorithm, genetický algoritmus<br />

- Genetický algoritmus s vylepšenou mutací pomocí HCA<br />

- Hill Climbing Algorithm, horolezecký algoritmus<br />

- Hardware<br />

- Local Area Network<br />

- Personal Computer<br />

- Random Access Memory<br />

- eXtended Markup Language


15<br />

1 ÚVOD<br />

Cílem této diplomové práce je zdokonalení již existujícího GATE <strong>toolbox</strong>u, jenž slouží<br />

k optimalizaci úloh pomocí implementovaných heuristických metod. GATE <strong>toolbox</strong> je<br />

naprogramován a pracuje v systému Matlab, který se však příliš nehodí k operacím s binárními<br />

řetězci dat. GATE obsahuje několik variant horolezeckých algoritmů HCA, genetický<br />

algoritmus GA a v neposlední řadě také vylepšený genetický algoritmus GA-HC.<br />

Hlavním požadavkem bylo zvýšení rychlosti výpočtů, protože rychlost stávajícího<br />

GATE nebyla příliš vysoká. Zároveň bylo požadováno zachování určité kompatibility<br />

s původním GATE. Dalšími úkoly bylo navrhnout, implementovat a otestovat univerzální XML<br />

rozhraní pro ukládání nastavení GATE <strong>toolbox</strong>u. Posledním bodem zadání byla realizace a<br />

testování distribuovaných výpočtů při řešení složitých optimalizačních problémů.<br />

Problém rychlosti výpočtů jsem se rozhodl řešit jako externí dynamicky linkovanou<br />

knihovnu DLL, která je připojena k systému Matlab, a veškeré kritické výpočty probíhají v ní.<br />

Kompatibilitu s původním GATE řeší několik funkcí, které se starají o export a import<br />

binárních dat. Knihovna totiž pracuje zcela autonomně a veškeré datové struktury se uchovávají<br />

uvnitř.<br />

XML rozhraní umožňuje uložení většiny nastavení do XML souboru, což se hodí např.<br />

když chceme ve výpočtu později pokračovat, nebo když provádíme testy se stejným<br />

nastavením, atp.<br />

Systém distribuovaných výpočtů je řešen netradičně s komunikací pomocí master XML<br />

souboru, do kterého serverová aplikace uloží potřebné nastavení. Připojující se klienti si jej<br />

načítají a posílají výsledky své činnosti v nadefinovaných intervalech zpět serveru. Ten<br />

umožňuje jejích zobrazování, porovnávání a manuální nebo automatické předávání lepších<br />

hodnot klientům, kteří se nejlepšímu nalezenému řešením už příliš vzdálili.


17<br />

2 TEORETICKÉ ZÁKLADY<br />

V dnešní době se k řešení optimalizačních úloh používá mnoho různých metod a<br />

postupů. Vhodnost použití dané metody či algoritmu ovlivňuje mnoho faktorů, jako např. oblast<br />

použití, požadovaná přesnost nalezeného řešení, implementační a časová složitost a mnoho<br />

dalších. Jak tomu obvykle bývá, většina metod má svoje výhody i nevýhody. Výběr vhodné<br />

metody závisí zejména na složitosti dané problematiky, požadované přesnosti získaného řešení,<br />

ale také zde hraje nemalou roli otázka časových výpočetních nároků.<br />

O metodách řešení optimalizačních problémů již bylo napsáno velmi mnoho, proto se<br />

v této kapitole zmíním jen okrajově o metodách, které souvisí s problémem řešeným v této<br />

práci. Místo toho se budu věnovat praktické realizaci a testování dosaženého řešení.<br />

2.1 Optimalizační problém<br />

Je charakterizován především účelovou funkcí, omezujícími podmínkami a požadavkem<br />

minimalizace nebo maximalizace, dále mohou být stanoveny ještě další speciální podmínky,<br />

např. nalezené parametry řešení musí být celočíselného typu.<br />

Účelová funkce charakterizuje daný problém a většinou obsahuje více parametrů, které<br />

chceme optimalizovat. Úkolem je nalézt její optimum, tj. nalézt minimální nebo maximální<br />

hodnotu této funkce.<br />

Omezující podmínky udávají, v jakém rozsahu se mohou dané parametry pohybovat.<br />

Bývají většinou zadány jako přídavné rovnice, nebo rozpětí hodnot, kterých může daný<br />

parametr nabývat.<br />

Požadavek minima nebo maxima určuje, jaký extrém hledáme na účelové funkci.<br />

Hledáme-li minimum, je třeba nalézt globální minimum účelové funkce v rozsazích, které určují<br />

omezující podmínky pro jednotlivé parametry. Pokud hledáme maximum, je tomu naopak.<br />

Heuristické metody a <strong>algoritmy</strong> hledání optima pracují obvykle s diskrétní reprezentací<br />

účelové funkce. To znamená, že je nejdříve potřeba takovou funkci převést do tvaru vhodného<br />

ke zpracování heuristickými metodami; tento proces nazýváme vzorkování. Ta převede funkci<br />

ze spojitého tvaru do tvaru diskrétního. Obvykle se vzorkuje jenom ta část funkce, která nás<br />

zajímá (tedy část ohraničená omezujícími podmínkami) a ta se rozdělí na 2 n bitů. To umožní<br />

algoritmům převést optimalizační problém na bitové řetězce, se kterými obvykle heuristické<br />

metody pracují. Vzorkování má ovšem jednu velkou nevýhodu. Dost často se může stát, že se<br />

hledané optimum při vzorkování spojité funkce „ztratí“, pokud neleží přímo v bodě, ve kterém<br />

se provede diskrétní konverze. Proto většinou nemohou heuristické metody nalézt hledané<br />

optimum úplně přesně, ale s přesností pouze omezenou. Čím užší bude kódovací interval a čím<br />

více kódujících bitů použijeme, tím větší přesnosti bude možno dosáhnout při hledání optima.<br />

f(x)<br />

kódovací interval<br />

.....................<br />

..........<br />

x<br />

Obr. 1 Provedení vzorkování u spojité funkce mezi hranicemi omezujících podmínek


18<br />

2.2 Heuristické metody<br />

V posledních letech se rok od roku neustále zvyšuje výpočetní síla počítačů, což<br />

otevřelo dveře mnoha novým odvětvím. Nový rozmach také nastal ve vývoji a experimentování<br />

s heuristickými metodami řešení složitých optimalizačních problémů. Tyto optimalizační<br />

metody sice nezaručují nalezení globálního řešení úplně přesně, ale poskytují řešení, které se<br />

globálnímu optimu velmi blíží. Výsledné řešení je nalezeno v uspokojivé době a s dostatečnou<br />

přesností. Používají se zejména pro optimalizaci mnohaparametrových funkcí, které nabývají<br />

mnoha extrémů.<br />

2.2.1 Horolezecký algoritmus<br />

Tento algoritmus je zástupcem jednoduchých heuristických metod. V každém kroku<br />

řešení vygeneruje nejbližší okolí v určitém rozsahu a v něm hledá další nejlepší řešení. Nalezené<br />

lepší řešení se použije v následujícím kroku jako základ pro generování nového okolí.<br />

f(x)<br />

I 1<br />

I 6<br />

Obr. 2 Prohledávání okolí HCA algoritmem a uváznutí v lokálním extrému<br />

x<br />

Horolezecký algoritmus má jednu velikou nevýhodu. Jeho prohledávání je totiž závislé<br />

na šířce generování nejbližšího okolí. Pokud nastane případ, kdy v cestě prohledávání stojí<br />

lokální extrém, může se stát, že se zde algoritmus zastaví. Říkáme, že algoritmus uvázne<br />

v lokálním extrému a v tom případě nenajde globální optimum, ale optimum pouze lokální. Vše<br />

je patrné z Obr. 2. Ten zachycuje, jak postupuje algoritmus při hledání optimálního řešení a<br />

uvázne v lokálním extrému v šestém iteračním kroku. Volba šířky generovaného okolí nám<br />

určuje časovou složitost algoritmu. Šířka okolí nemůže být příliš velká, protože by se neúměrně<br />

zvedla časová složitost algoritmu.<br />

Ukončení výpočtu u horolezeckých algoritmů může nastat např. sledováním hodnot<br />

nejlepších řešení. K ukončení dojde tehdy, pokud dva kroky jdoucí po sobě naleznou dvě<br />

naprosto stejné hodnoty. Ukončení lze také provést omezením iteračních kroků.<br />

2.2.2 Genetický algoritmus<br />

Genetické <strong>algoritmy</strong> jsou inspirovány přírodou a Darwinovými zákony přirozeného<br />

výběru. Jedinci dané populace nesou informace zakódované pomocí genetických chromozomů.<br />

Tyto chromozomy je možno dekódovat a určit, jaké vlastnosti má určitý člen populace.<br />

Sledujeme charakteristiky, které jsou důležité pro hodnocení řešeného problému, tedy v případě<br />

řešení optimalizačního problému hodnotu účelové funkce. Jedinci s lepšími charakteristikami<br />

jsou vybíráni do další generační populace a horší jedinci jsou eliminováni.<br />

Genetický algoritmus provede v jedné generaci několik kroků, které mají tři základní,<br />

jasně dané cíle – nejlepší jedince vybrat do další generace, vytvořit z nich pomocí křížení<br />

potencionálně lepší jedince a v poslední řadě udržovat celkovou populaci dostatečně<br />

heterogenní (překonání lokálních extrémů, zefektivnění křížení). Počáteční populace jedinců je<br />

obvykle generována náhodně na předem definovaném prostoru možných řešení.


19<br />

Počáteční<br />

populace<br />

fitness<br />

selekce<br />

křížení<br />

mutace<br />

fitness<br />

-<br />

podmínka<br />

ukončení<br />

+<br />

Konec<br />

Obr. 3 Typický průběh genetického algoritmu<br />

Jeden iterační krok genetického algoritmu je naznačen na Obr. 3. Počáteční populace je<br />

nejdříve ohodnocena, a vzápětí jsou z ní vybráni nejlepší jedinci. Poté je provedeno<br />

mezijedincové křížení, které pomáhá vytvářet jedince s potencionálně lepšími vlastnostmi.<br />

V závěru iteračního kroku je provedena mutace, jenž má za úkol udržovat celou populaci<br />

dostatečně různorodou, aby se pokrylo co nejširší okolí od aktuálně nejlepšího jedince.<br />

Základní operátory genetického algoritmu jsou tedy čtyři a to:<br />

• fitness – provádí ohodnocení jedinců podle určitého kritéria<br />

• selekce – vybírá předem definovaným způsobem jedince do další generace<br />

• křížení – výměna genů mezi jedinci, získání potenciálně lepšího<br />

• mutace – náhodná změna některých genů v populaci, zachování heterogenity<br />

Genetické <strong>algoritmy</strong> jsou obvykle v počítačích reprezentovány pomocí binárních čísel,<br />

ale mohou být řešeny i jinak, záleží na dané implementaci a cílené oblasti použití. Pokud<br />

uvažujeme binární kódování, jedinci jsou kódováni binárními řetězci, které představují jejich<br />

chromozomy. Ohodnocování může probíhat různými způsoby, např. konverzí binárních řetězců<br />

na reálná čísla apod. Křížení pak výměnou bitů mezi jedinci a mutace náhodnou změnou<br />

některých bitů v celé populaci.<br />

V dnešní době existuje nepřeberné množství variant a typů genetických algoritmů. Liší<br />

se způsobem implementace, různými způsoby křížení, mutace a selekce, reprezentací řešeného<br />

problému apod. Genetické <strong>algoritmy</strong> mají v dnešní době velké uplatnění a velmi širokou oblast<br />

použití.


21<br />

3 GATE TOOLBOX<br />

GATE <strong>toolbox</strong> je sada optimalizačních funkcí, určených pro heuristickou optimalizaci,<br />

patřící do tzv. „soft-computing“ metod. Je napsán a určen pro použití v systému Matlab, což<br />

s sebou přináší jisté „výhody“, ale bohužel i nevýhody. Za výhody lze považovat zejména<br />

snadnou uživatelskou deklaraci účelové funkce, její grafické zobrazení, zobrazení průběhu<br />

optimalizace, dosaženého řešení, apod. Jedna z jeho nevýhod je, jak se později ukázalo, příliš<br />

pomalé výpočetní jádro, pokud se snažíme provádět nějaké binární operace. Systém Matlab je<br />

sice velmi efektivním nástrojem pro matematické výpočty, avšak naprosto neefektivní, co se<br />

týče práce a metod prováděných v čistém binárním kódu. Genetické a horolezecké <strong>algoritmy</strong><br />

jsou však na binárních operacích a binární reprezentaci postaveny.<br />

GATE balík funkcí ve své implementaci obsahuje několik variant horolezeckého<br />

algoritmu, genetický algoritmus a rozšířenou verzi genetického algoritmu, kombinujícího<br />

výhody GA a HC algoritmů.<br />

3.1 Koncepce původního GATE <strong>toolbox</strong>u<br />

Celá implementace původního GATE <strong>toolbox</strong>u se dá rozdělit na několik částí:<br />

• definice účelové funkce<br />

• servisní metody<br />

• datové struktury<br />

• sada výkonných metod HCA, GA, GA-HC<br />

Celý původní GATE je implementován v prostředí systému Matlab. Obsahuje několik<br />

výkonných HCA algoritmů (HCA5, HCA6, HCA7), genetický algoritmus GA. Varianta<br />

horolezeckého algoritmu HCA7 se používá k mutaci v tzv. hybridním genetickém algoritmu<br />

GA-HC.<br />

GATE <strong>toolbox</strong><br />

VÝKONNÉ HCA METODY<br />

VSTUPY<br />

GA-HC<br />

DATOVÁ<br />

STRUKTURA<br />

GA<br />

VÝKONNÉ<br />

GA<br />

METODY<br />

SERVISNÍ<br />

METODY<br />

ÚČELOVÁ FUNKCE<br />

VÝSTUPY<br />

Obr. 4 Blokové schéma původního GATE <strong>toolbox</strong>u<br />

Datová struktura GATE <strong>toolbox</strong>u je hlavní datová struktura, ve které jsou uchovávána<br />

veškerá nastavení, ale i výsledky a průběh celého optimalizačního procesu. Část této struktury<br />

definuje uživatel před samotným spuštěním procesu optimalizace. Zadává zde požadavek


22<br />

minimalizace či maximalizace, odkaz na definici účelové funkce, počet parametrů, kolika bity<br />

jsou kódovány jednotlivé parametry, typ binárního kódování, aj.<br />

Jako servisní metody jsou označovány v GATE <strong>toolbox</strong>u takové funkce, které jsou<br />

nezbytné pro činnost výkonných metod, nebo mají ještě i další pomocné funkce.<br />

Účelovou funkci je třeba sestavit jako vektorizovanou Matlab funkci. Musí být napsána<br />

tak, aby byla schopna vypočítat matici s parametrovými vektory.<br />

Problém celého řešení je, jak jsem již naznačil v úvodu kapitoly, velmi pomalá<br />

implementace. Pro systém Matlab je evidentně velký problém, pokud se snažíme provádět<br />

nějaké binární operace. Veškeré výpočty zřejmě provádí na hodnotách, které převede na datový<br />

typ double. Každá taková hodnota je v paměti počítače zakódována 64 bity, ačkoliv se jedná o<br />

binární číslo, které by bylo možno zakódovat pouze v jediném bitu. Proto je práce v binárních<br />

operacích dost neefektivní.<br />

Více informací a detailní popis struktur a funkcí GATE 2.0 je možno najít v [1].<br />

3.2 Vylepšení GATE – DLL GATE<br />

Počáteční nápad byl použít stávající GATE <strong>toolbox</strong> a k němu připojit externí<br />

dynamicky linkovanou knihovnu DLL, ve které by byly veškeré stěžejní funkce pro práci<br />

s binárním kódem. Postupem času jsem však zjistil, že takto postupovat nelze. GATE uchovává<br />

binární populaci v matici s prvky typu double. Při každé operaci by se tak musela neustále<br />

posílat z Matlabu do DLL velká matice čísel a v zápětí opět matice stejného rozměru zpět do<br />

Matlabu, což by značně snižovalo rychlost celé implementace.<br />

Rozhodl jsem se vytvořit DLL tak, aby pracovalo interně naprosto autonomně. Veškeré<br />

datové struktury jsou uchovávány uvnitř DLL a teprve na požadavek uživatele jsou data (binární<br />

populace) odesílána zpět do systému Matlab. Tato koncepce se později ukázala jako velice<br />

výhodná a vysoce efektivní z hlediska rychlosti výpočtů.<br />

Dále jsem se snažil, aby byl nový GATE-DLL <strong>toolbox</strong> z větší části kompatibilní<br />

s původním <strong>toolbox</strong>em; aby se postup zadávání optimalizačního problému z hlediska uživatele<br />

změnil co možná nejméně. Při inicializačním volání DLL knihovny se jí předá nastavení<br />

z původní datové struktury, která zůstává kompatibilní s původním <strong>toolbox</strong>em.<br />

Nový <strong>toolbox</strong> byl také vylepšen o rozhraní XML, které umožňuje v jakékoliv části<br />

výpočtu uložit nastavení do XML datového souboru. Z tohoto XML je možné spustit znovu celý<br />

optimalizační proces s uloženými parametry a hodnotami. Načtení parametrů z XML lze provést<br />

v jakékoliv části výpočtu, nebo přímo inicializovat nový výpočet pomocí XML souboru.<br />

Další věcí, která je v GATE-DLL nová, je podpora pro distribuované výpočty.<br />

Umožňuje připojit jakýkoliv GATE-DLL před započetím optimalizačního procesu k serveru,<br />

který registruje GATE klienty, umožňuje jejich sledování, automatické předávání lepší hodnoty<br />

nalezeného optima horším klientům, apod. Koncepce klient - server je pojata poněkud<br />

netradičním způsobem. Komunikace probíhá přes master XML soubor, který zakládá serverová<br />

aplikace. Klienti komunikují se serverem prostřednictvím tohoto souboru.<br />

3.2.1 Koncepce GATE-DLL<br />

Jak jsem již zmínil v předchozím odstavci, knihovna DLL zcela nahrazuje většinu<br />

funkcí GATE <strong>toolbox</strong>u a má také vlastní datovou strukturu, ve které uchovává nastavení,<br />

binární populaci, hodnocení populace, aktuální vektor, aj. Všechny výpočty pracují s touto<br />

interní datovou strukturou, čímž se značně zvyšuje výpočetní síla oproti původně navrhované<br />

koncepci volaných funkcí z DLL. Jediné, v čem Matlab zůstává nadále nápomocen výpočtům,<br />

je v ohodnocování jedinců pomocí vektorizované účelové funkce. Definice této funkce zůstává<br />

(opět z důvodů kompatibility) naprosto stejná s původním GATE.


23<br />

GATE-DLL <strong>toolbox</strong><br />

ÚČELOVÁ FUNKCE<br />

XML<br />

SOUBOR<br />

VSTUPY<br />

DLL<br />

DATOVÁ<br />

STRUKTURA<br />

GA<br />

KOMUNIKAČNÍ<br />

ROZHRANÍ S<br />

MATLABEM<br />

HC1<br />

HC2<br />

HC12<br />

GA<br />

GA-HC<br />

XML<br />

PARSER<br />

VÝSTUPY<br />

Obr. 5 Blokové schéma GATE-DLL <strong>toolbox</strong>u<br />

Na Obr. 5 je naznačeno celkové blokové schéma spojení DLL knihovny se systémem<br />

Matlab. Jak je ze schématu patrné, veškeré výkonné metody a servisní funkce byly vypuštěny a<br />

nové funkce obstarává knihovna DLL. Dále byly implementovány vybrané <strong>algoritmy</strong> a to: HC1,<br />

HC2, HC12, GA a GA-HC. Zachovány byly možnosti původních konverzních metod<br />

REAL⇔INT⇔BIN nebo REAL⇔INT⇔GRAY. Komunikační rozhraní tvoří systém vhodně<br />

navržených funkcí, který dokáže datové typy a požadavky Matlabu přeložit do tvaru<br />

kompatibilního s vnitřními <strong>algoritmy</strong> DLL knihovny. XML parser je schopen načítat a ukládat<br />

nastavení do souboru XML a to jak ve standardním módu, tak i v klient módu (distribuované<br />

výpočty).


25<br />

4 IMPLEMENTACE<br />

Jak již bylo naznačeno v dřívějších kapitolách, bylo potřeba vytvořit dynamicky<br />

linkovanou knihovnu DLL, která by přebrala veškeré stěžejní funkce pro práci s binárním<br />

kódem. Volba programovacího jazyka byla od počátku jasná. Programovací jazyk Java byl po<br />

předběžných testech rychlosti zcela vyloučen, proto jsem se rozhodl pro objektové C++. Java je<br />

sice moderní programovací jazyk, v systému Matlab je velmi dobře podporován, avšak běží<br />

(stejně jako sytém Matlab) ve virtuálním stroji, proto jsem ani neočekával přílišné zvýšení<br />

rychlosti výpočtů. Ukázalo se, že C++ kód přeložený vhodným kompilátorem dokáže být při<br />

složitějších matematických operacích až 4x rychlejší než podobně napsaný zdrojový kód<br />

v jazyce Java.<br />

Od začátku jsem ještě přesně nevěděl, jak bude finální knihovna vypadat co se týče<br />

počtu a odlišnosti algoritmů. Nejdříve jsem psal metody do samostatných zdrojových kódů a<br />

chtěl jsem mít ve finálním řešení několik samostatných DLL knihoven (každá metoda<br />

optimalizace ve zvláštní knihovně). Nakonec se ukázalo, že <strong>algoritmy</strong> mají mnoho společného,<br />

takže jsem celou knihovnu přepracoval a <strong>algoritmy</strong> sloučil do jedné DLL knihovny.<br />

4.1 Vnitřní implementace DLL<br />

DLL se skládá z několika celků, naprogramovaných jako samostatné objekty. Jedná se o<br />

hlavní jádro COptMethod, metody HCA: CHca1, CHca2, CHca12, genetický algoritmus CGa<br />

(obsahuje také modifikaci GA-HC), XML parser CXml, a v poslední řadě také celé DLL<br />

exportní rozhraní.<br />

DLL knihovna<br />

CGa<br />

CHca1<br />

Matlab<br />

DLL<br />

I/O<br />

rozhraní<br />

COptMethod<br />

CHca2<br />

CXml<br />

CHca12<br />

Obr. 6 Vnitřní blokové schéma knihovny DLL<br />

V I/O rozhraní DLL knihovny mohou být pouze exportní a importní metody. Jsou<br />

uzpůsobeny tak, aby dokázaly obsloužit vstupní a výstupní požadavky všech optimalizačních<br />

metod a XML parseru.<br />

4.1.1 Optimalizační jádro COptMethod<br />

Hlavní jádro obsahuje veškeré metody společné pro všechny <strong>algoritmy</strong>. Je to hlavní<br />

objekt, který je předek pro objekty optimalizačních metod HCxx a GA. Obsahuje strukturu pro<br />

nastavení parametrů optimalizace, dynamická pole pro binární populaci a její ohodnocení,<br />

všechny konverzní metody mezi binárním kódem a reálnými čísly, funkce pro náhodnou<br />

inicializaci populace, exportní funkce pro XML nastavení, podporu pro distribuované výpočty a<br />

výkonné metody. Výkonné části kódu jsou řešeny virtuálními metodami, protože potomci<br />

(konkrétní optimalizační <strong>algoritmy</strong>) mají tyto metody zcela odlišné.


26<br />

Všechny potřebné struktury a metody ke správné funkci jádra jsou uvedeny na<br />

následujícím obrázku:<br />

Hlavní datové struktury:<br />

Konverzní metody:<br />

Důležité parametry:<br />

nParam<br />

1<br />

iParam<br />

ActVect<br />

ActValue<br />

sVect<br />

Gray/Bin ⇔ Int ⇔ Real<br />

Podpora XML:<br />

Save/Load XML,<br />

ReinitXMLCore,<br />

FreeXMLCore<br />

Kompatibilita s GATE:<br />

nParam<br />

nBitParam<br />

nIndi<br />

mCode<br />

funcOpt<br />

funcName<br />

iParam<br />

sVect<br />

Get/SetBinPool,<br />

Get/SetActVect,<br />

ExportParams<br />

Podpora distrib. výpočtů:<br />

nIndi<br />

PopArr<br />

Fz<br />

AddClient,<br />

GetClientStatus<br />

Výkonné metody:<br />

nParam ⋅ nBitParam<br />

1<br />

Fitness,<br />

Selection,<br />

Cross,<br />

Mutation,<br />

FitnessHC,<br />

MutationHC<br />

Obr. 7 Důležité metody a struktury jádra COptMethod<br />

Popis důležitých parametrů:<br />

nParam - počet parametrů optimalizační úlohy<br />

nBitParam - udává, kolika bity je kódován každý parametr<br />

nIndi - počet jedinců populace (liší se u jednotlivých metod HCA a GA)<br />

mCode - druh použitého kódování chromozomů – binární nebo Grayův kód<br />

funcOpt - požadavek optimalizace – minimum nebo maximum<br />

funcName - jméno účelové funkce (Matlab „m“ souboru)<br />

Popis důležitých struktur:<br />

PopArr - hlavní binární struktura pro populaci jedinců ( nIndi× nParam ⋅nBitParam<br />

)<br />

Fz - fitness, tedy ohodnocení jedinců ( nIndi × 1)<br />

ActVect - aktuální, nejlepší nalezený jedinec ( 1 × nParam ⋅ nBitParam )<br />

ActValue - ohodnocení nejlepšího jedince ( 1× 1)<br />

iParam - rozsahy kódovaných parametrů (omezující podmínky) ( nParam × 2 )<br />

sVect - vektor reálných čísel použitý pro start HCA ( 1 × nParam )<br />

Binární populace jedinců PopArr je řešena jako dvourozměrné dynamické pole typu<br />

unsigned char, takže každá binární hodnota je uchovávána v jednobajtové buňce. Toto řešení se<br />

mi jevilo jako nejlepší, uvažoval jsem i o implementaci typu „bit na bit“. Ovšem adresace<br />

takového pole by byla extrémně složitá a pole by muselo by být „slepeno“ z mnoha např. 32<br />

bitových neznaménkových buněk, musel by se řešit plynulý přechod bitů mezi jednotlivými<br />

buňkami, atp. Celá implementace by se zřejmě dosti zpomalila, ovšem za cenu osminásobně<br />

menšího obsazení paměti. Vzhledem k tomu, že dnešní počítače jsou vybaveny operační pamětí


s velkou kapacitou, zvolil jsem raději rychlejší implementaci, byť za cenu vyššího využití<br />

operační paměti. Pole fitness Fz je jednorozměrné dynamické pole typu double. Při každém<br />

iteračním kroku do něj systém Matlab ukládá ohodnocení jedinců. ActVect je pole typu<br />

unsigned char, ukládá se do něj nejlepší jedinec z populace, ActValue pak ohodnocení<br />

nejlepšího jedince. iParam je důležitá vstupní tabulka, jsou zde uloženy rozsahy pro kódování<br />

parametrů do reálných čísel (omezující podmínky optimalizačního problému). sVect je vstupní<br />

parametr pouze pro <strong>algoritmy</strong> HCA, pokud uživatel požaduje začátek výpočtu od konkrétních<br />

bodů. Je to pole hodnot, které reprezentuje tzv. start vektor.<br />

27<br />

Konverzní metody Gray/Bin Int Real<br />

Optimalizační problém je na začátku obvykle zadáván v podobě reálných čísel. Taktéž<br />

ohodnocení jedinců je prováděno na základě účelové funkce, která se pohybuje v prostoru<br />

reálných čísel. Ovšem varianta algoritmů HCA a GA implementovaná v GATE potřebuje<br />

převést reálná čísla do binární podoby, jelikož provádí operace přímo s binárními řetězci. Je<br />

potřeba metod, které převedou reálná čísla do binární formy a zpět. O to se stará sada<br />

konverzních metod implementovaných v jádře COptMethod. Jedná se o Gray2Int, Int2Gray,<br />

Bin2Int, Int2Bin, Int2Real a Real2Int. Tyto metody jsou základním stavebním kamenem pro<br />

správnou funkci všech optimalizačních algoritmů.<br />

Převod reálných čísel probíhá následujícím způsobem: reálné číslo se převede pomocí<br />

kódovacích rozsahů z tabulky iParam na číslo typu unsigned int64 (Real2Int) a poté na číslo<br />

v binárním (Int2Bin) nebo Grayově kódu (Int2Gray), zároveň se bere v potaz, kolika bity je<br />

nutno kódovat daný parametr (nBitParam).<br />

Re − Μin<br />

Int = MaxInt ⋅<br />

(1)<br />

Μax − Μin<br />

Max − Min<br />

Re = Int ⋅ + Min<br />

(2)<br />

MaxInt<br />

Vzorce (1) a (2) udávají převodní vztah pro konverzi mezi reálným a přirozeným<br />

číslem. Int je hodnota celočíselného typu a Re je reálné číslo. Min a Max jsou kódovací rozsahy<br />

parametrů uvedené v tabulce iParam. MaxInt je číslo, jehož hodnota udává maximální hodnotu<br />

pro kódování na nBitParam bitech (3).<br />

nBitParam<br />

MaxInt = 2<br />

(3)<br />

Převodní metody pro převod z přirozených čísel Int do čísel binárních a zpět fungují<br />

tradičním způsobem podle vzorce (4).<br />

Int = a0<br />

⋅2<br />

+ a1<br />

⋅ 2 + ... + ai<br />

⋅ 2 + ... + an−1<br />

⋅2<br />

+ an<br />

⋅2<br />

Kde : a ...a − bity binárního čísla Bin<br />

0<br />

0<br />

n<br />

1<br />

i<br />

n−1<br />

n<br />

(4)<br />

Chromozomy lze také kódovat pomocí Grayova kódování (Int2Gray, Gray2Int).<br />

Uvážíme-li, že v Grayově kódu je mezi dvěma libovolnými sousedními čísly změna pouze<br />

v jediném bitu, jeví se takové kódování jako výhodnější (změna jednoho bitu v chromozomu<br />

způsobí adekvátní změnu v reprezentaci reálného čísla). Převod probíhá nejdříve do binárního<br />

kódu a poté se převede do Grayova kódu pomocí následujícího algoritmu:<br />

1) Dvojková číslice přímého binárního kódu s nejvyšší vahou se ponechá beze změny.<br />

2) Každá následující dvojková číslice přímého binárního kódu se invertuje, pokud jí<br />

v přímém kódu předchází na vyšší váze jednička.


28<br />

V konverzních metodách jsem nejdříve používal datový typ double, který pracuje<br />

s 64bitovou přesností. Reálné číslo je zde uloženo ve formátu plovoucí desetinné čárky jako<br />

52bitová mantisa, 11bitový exponent a 1 bit na znaménko. Reálné číslo potom dostaneme podle<br />

vztahu (5).<br />

e<br />

X<br />

Re<br />

= 10 ⋅ m Kde : e = exponent,m = mantisa<br />

(5)<br />

Jde o to, že takový datový typ může poskytnout pouze přesnost v omezeném rozsahu.<br />

Problémy s přesností v plovoucí desetinné čárce jsou již dlouho známy, více o této problematice<br />

pojednává článek [2].<br />

Po pár zkušebních testech jsem dospěl k závěru, že přesnost typu double nedostačuje.<br />

Některé kompilátory C++ podporují ještě datový typ long double, který pracuje s 80bitovou<br />

rozšířenou přesností.<br />

Př.: Provedeme konverzi pomocí funkce Int2Real. Funkce bude pracovat nejprve<br />

s přesností typu double, posléze s přesností long double. Konvertujeme na rozsahu 0.1− 0. 8 ,<br />

simulujeme konverzi na čtyř bitech, tedy rozparcelujeme rozsah na celkem 16 hodnot.<br />

Konvertujeme číslo 7. Výsledná hodnota by měla být Re = 0.426<br />

. Výsledky jsou následující:<br />

R double = 0.42666666666666675<br />

R long double = 0.42666666666666669<br />

Z předchozího příkladu je vidět, že přesnost datového typu long double je o něco vyšší,<br />

než v případě datového typu double. Uvážíme-li však, že takových konverzních cyklů probíhá<br />

v jednom kroku výpočtu HCA či GA až několik desítek tisíc, je i takové malé zlepšení<br />

obrovským úspěchem.<br />

Bohužel systém Matlab odmítl komunikovat s knihovnou DLL ve zvýšené 80bitové<br />

přesnosti, nakonec jsem tedy vyřešil tento problém následujícím způsobem: konverzní metody<br />

pracují interně se zvýšenou 80bitovou přesností, ale vrací reálné číslo pouze v 64bitové<br />

přesnosti. Podle pár zkušebních testů měla i taková úprava velice pozitivní vliv na celkové<br />

zvýšení přesnosti výsledků.<br />

Jelikož maximální velikost přirozeného čísla, které lze ve většině vyšších<br />

programovacíh jazyků efektivně uložit, je 64 bitů (datový typ unsigned long long), jsou<br />

konverzní metody a tím pádem i všechny optimalizační <strong>algoritmy</strong> GA a HCA omezeny na<br />

maximálně 64 bitovou přesnost na 1 optimalizovaný parametr.<br />

4.1.2 HCA <strong>algoritmy</strong><br />

Do implementace knihovny DLL jsem zahrnul tyto HCA <strong>algoritmy</strong>: HC1, HC2 a HC12.<br />

Jedná se o horolezecké <strong>algoritmy</strong> s reprezentací pomocí binárního kódování. Využil jsem výhod<br />

dědičnosti objektů a implementoval je jako potomky jádra COptMethod. Využívají jeho<br />

sdílených metod (konverze, XML podpora, fitness, nalezení nejlepšího vektoru v populaci, aj.).<br />

Tyto <strong>algoritmy</strong> mají navíc pouze jednu metodu: generování okolí pro aktuální vektor. Vyřešil<br />

jsem ji jako virtuální metodu jádra COptMethod, což umožnilo využití výhod polymorfního<br />

objektového programování a tím pádem i velké zjednodušení komunikačního rozhraní DLL<br />

knihovny.<br />

Jednotlivé <strong>algoritmy</strong> se od sebe liší pouze šířkou generovaného okolí:<br />

• HC1 - generuje šířku okolí se vzdáleností ρ = 1 od původního řešení<br />

• HC2 - generuje šířku okolí se vzdáleností ρ = 2 od původního řešení<br />

• HC12 - generuje šířku okolí se vzdáleností ρ = 1 a ρ = 2 od původního řešení<br />

H<br />

H<br />

H<br />

H


29<br />

ρ H =1<br />

00000<br />

ρ H = 2<br />

00000<br />

10000<br />

01000<br />

00100<br />

00010<br />

00001<br />

11000<br />

10100<br />

10010<br />

10001<br />

01100<br />

01010<br />

01001<br />

00110<br />

00101<br />

00011<br />

Obr. 8 Příklad generování šířky okolí ρ = 1 a ρ = 2 pro nulový vektor<br />

H<br />

H<br />

Parametry optimalizační úlohy jsou uloženy za sebou v binárním řetězci, ze kterého se<br />

následně generuje okolí. Pracuje se s celou délkou řetězce, tedy s parametry uloženými<br />

postupně vedle sebe, jak je vidět z následujícího obrázku.<br />

Hodnoty parametrů<br />

x 3 =+1.9898039216<br />

x 2 =+0.9996078431<br />

x 1 =+0.4847058824<br />

iParam<br />

[-5.100;5.000]<br />

[-5.100;5.000]<br />

[-5.100;5.000]<br />

nParam = 3<br />

nBitparam = 8<br />

10000011 10001010 10000101<br />

Aktuální binární vektor<br />

Obr. 9 Reprezentace parametrů v binárním řetězci algoritmu HCA<br />

Inicializace algoritmů HCA může být provedena dvěma způsoby: buď pomocí<br />

startvektoru nebo náhodného vektoru. Při inicializaci startvektorem uživatel zadá požadavek<br />

počátečních bodů pro každý parametr. Pro druhý případ se vygeneruje náhodný startvektor.<br />

Algoritmy HCA pracují podle následujících kroků:<br />

F Z =+0.169896039984621210<br />

Hodnota účelové funkce<br />

1) Na začátku je uživatelem zadán startvektor nebo je vygenerován náhodně, který se<br />

stává zároveň vektorem aktuálním.<br />

2) Provede se vygenerování dané šířky okolí pro aktuální vektor.<br />

3) Pošle se požadavek na ohodnocení okolí systému Matlab v podobě matice reálných<br />

čísel (matice rozměru nInd × nParam ).<br />

4) Systém Matlab ohodnotí vygenerované okolí pomocí vektorizované účelové funkce.<br />

5) Ohodnocené okolí je posláno zpět do knihovny DLL ve formě vektoru reálných čísel<br />

a uloží se do dynamického pole Fz.<br />

6) DLL knihovna vyhledá pomocí pole Fz nejlepší binární vektor a ten překopíruje na<br />

místo aktuálního vektoru.<br />

7) Pokračuje se znovu bodem 2, ukončení se provádí omezením počtu iteračních cyklů.<br />

Algoritmy HC2 a HC12 generují okolí s relativně mnoha řádky matice, zvlášť pokud je<br />

potřeba optimalizovat více parametrů s velkým počtem bitů na parametr. Např. při optimalizaci<br />

pěti parametrů s 64 bity na parametr generuje HC2 binární matici o rozměru 51360× 320 . Pro<br />

optimalizaci více parametrů je proto vhodnější použít nějakou efektivnější metodu, např.<br />

genetický algoritmus.


30<br />

4.1.3 Genetický algoritmus GA a GA-HC<br />

Genetický algoritmus zahrnutý v DLL má chromozomy kódovány pomocí binárních<br />

řetězců. Ty jsou opět tvořeny parametry v binární reprezentaci poskládanými za sebou. Celý<br />

algoritmus je řešen jako potomek jádra COptMethod, výkonné části kódu jsou opět deklarovány<br />

jako virtuální metody. Algoritmy GA a GA-HC se od sebe liší pouze typem mutace, GA-HC<br />

využívá mutaci s jádrem, které je optimalizováno <strong>algoritmy</strong> HCA. Velikost populace jedinců a<br />

ostatní parametry volí uživatel při inicializaci modelu algoritmu (nIndi, nParam, nBitParam,<br />

iParm, mCode, funcOpt, funcName).<br />

Popis všech důležitých metod:<br />

Selection<br />

- metoda selekce nejlepších jedinců, je řešena turnajovým výběrem, uživatel volí<br />

počet jedinců vstupujících do turnaje. Turnaj probíhá tak dlouho, dokud se<br />

nenaplní nová populace, tj. nIndikrát.<br />

Stará populace<br />

011001011100101001<br />

101001010010110101<br />

011010100111010101<br />

101010100101010101<br />

011100111010111010<br />

Nová populace<br />

101001010010110101<br />

101010100101010101<br />

Obr. 10 Příklad dvou cyklů turnajové selekce ze dvou jedinců<br />

Cross<br />

- metoda křížení jedinců, implementovány jsou tři druhy křížení, které volí<br />

uživatel: bodové, bodové pouze v parametrech a uniformní. Uživatel volí, kolik<br />

procent jedinců z populace bude zkříženo.<br />

Bodové křížení<br />

111111 111111 111111<br />

000000 000000 000000<br />

111100 000001 111111<br />

000011 111110 000000<br />

Bodové křížení s respektováním parametrů<br />

111111 111111 111111<br />

000000 000000 000000<br />

111111 000000 111111<br />

000000 111111 000000<br />

Uniformní křížení (swapbits)<br />

111111 111111 111111<br />

000000 000000 000000<br />

110111 111111 101111<br />

001000 000000 010000<br />

Obr. 11 Příklady všech druhů křížení pro dva náhodné body<br />

Mutation<br />

- metoda mutace, která je řešena jako náhodná změna určitého počtu bitů v celé<br />

populaci, uživatel volí počet mutovaných bitů, nebo kolik procent populace má<br />

mutovat.<br />

00000000000000000<br />

00000000000000000<br />

00000000000000000<br />

00000000000000000<br />

00000000000000000<br />

00000000000000000<br />

00000000000000000<br />

00001000000000000<br />

00000000000000000<br />

00000000000000000<br />

Obr. 12 Mutace náhodného bitu v populaci jedinců


MutationHC - metoda mutace pro GA-HC, jedná se o cílenou mutaci několika jader bitů. Ty<br />

jsou nejdříve optimalizovány pomocí algoritmu HCA a pro mutaci se použije<br />

jádro s nejlepším fitness po aplikaci HCA. Šířku jádra, algoritmus HCA a počet<br />

jader v populaci volí uživatel. Pozice jádra v populaci se vybírá náhodně, je<br />

možno volit náhodnou nebo náhodnou s respektováním parametrů. Počet jader<br />

v populaci může být zadán procentuálně (0-50%) nebo číslem, udávajícím kolik<br />

náhodně umístěných jader se bude v populaci vyskytovat.<br />

31<br />

00000000000000000<br />

00000000000000000<br />

00000000000000000<br />

00000000000000000<br />

00000000000000000<br />

best<br />

HC1<br />

00001000000000000<br />

00000100000000000<br />

00000010000000000<br />

00000001000000000<br />

00000000000000000<br />

00000000000000000<br />

00000001000000000<br />

00000000000000000<br />

00000000000000000<br />

Obr. 13 MutationHC s optimalizací jádra metodou HC1<br />

Kroky GA jsou následující:<br />

1) Inicializace binární populace jedinců je náhodná.<br />

2) Systému Matlab je poslána k ohodnocení matice reálných čísel, která reprezentuje<br />

parametry v populaci jedinců.<br />

3) Ohodnocení jedinců z Matlabu je uloženo do pole Fz.<br />

4) Je provedena selekce s uživatelským nastavením.<br />

5) Jedinci jsou kříženi metodou Cross se zadaným nastavením.<br />

6) Proběhne mutace bitů v populaci podle nastavení.<br />

7) Systému Matlab je poslána k ohodnocení matice reálných čísel, která reprezentuje<br />

parametry v populaci jedinců.<br />

8) Ohodnocení jedinců z Matlabu je uloženo do pole Fz.<br />

9) Ukončení algoritmu je provedeno omezením iteračních cyklů.<br />

Algoritmus GA-HC se od kroku 6 liší:<br />

6) MutationHC provede optimalizaci jádra pomocí zvoleného algoritmu HCA.<br />

7) Systému Matlab je poslána k ohodnocení matice reálných čísel, která reprezentuje<br />

parametry ve vygenerované HCA populaci.<br />

8) Z ohodnocených jedinců HCA populace se vybere nejlepší řešení a vloží se zpět na<br />

místo původního chromozomu.<br />

9) Skok na krok 6, dokud se neprovede mutace požadovaného počtu jader.<br />

10) Systému Matlab je poslána k ohodnocení matice reálných čísel, která reprezentuje<br />

parametry v populaci jedinců.<br />

11) Ohodnocení jedinců z Matlabu je uloženo do pole Fz.<br />

12) Ukončení algoritmu je provedeno omezením iteračních cyklů.<br />

Genetické <strong>algoritmy</strong> mají proti HCA algoritmům velkou výhodu v tom, že v relativně<br />

malé populaci jedinců (obvykle 50-5000) dokáží optimalizovat až několik desítek parametrů.<br />

Velikost populace přitom není závislá na počtu parametrů a nastavené bitové přesnosti, ale je<br />

volena uživatelem.<br />

4.1.4 XML parser<br />

Tato část kódu nemá s optimalizačními <strong>algoritmy</strong> příliš mnoho společného, proto jsem<br />

ji vytvořil jako samostatný univerzální objekt CXml. Poskytuje podporu pro zápis a načítání<br />

klíčů z XML souboru. Zápis a čtení dat ze souboru je řešeno pomocí souborových streamů.<br />

Tento objekt je připojen do jádra COptmethod a je využíván při požadavku ukládat či načítat


32<br />

nastavení do/z XML souboru na pevném disku počítače. XML parser je také využit v serverové<br />

aplikaci pro podporu distribuovaných výpočtů. Metody, které poskytuje CXml jsou následující:<br />

WriteKey - založení nového XML a zápis nového klíče na konec XML<br />

AddKey - přidání klíče do XML před ukončovací hlavičku<br />

ReadKey - načtení hodnoty klíče, vrací ji ve tvaru pole znaků<br />

DeleteKey - smazání klíče z XML<br />

ChangeKey - změna hodnoty zvoleného klíče za hodnotu jiné délky (vyžaduje použití<br />

dočasného souboru)<br />

ChangeKeyDirect - změna hodnoty zvoleného klíče za hodnotu stejné délky<br />

Struktura zapisovaného souboru je naznačena na Obr. 14. XML byl uložen metodou<br />

GA a dále bylo nastaveno: dva optimalizované parametry s přesností 16 bitů na parametr, byla<br />

prováděna minimalizace, použito binární kódování chromozomů, optimalizační funkce „f6.m“,<br />

velikost populace 500 jedinců, rozsahy kódovaných parametrů na rozsazích − 5; 5 a hodnota<br />

pro inicializaci generátoru náhodných čísel byla 1179507480. Nejlepší nalezené řešení v době<br />

−6<br />

uložení XML bylo 2,3096583170456597 ⋅ 10 a vítězný chromozom je uložen jako BestVector.<br />

Hodnota sVect je zde kvůli kompatibilitě s <strong>algoritmy</strong> HCA, které zde ukládají hodnotu<br />

startovních pozic.<br />

<br />

<br />

GA<br />

2<br />

16<br />

min<br />

BC<br />

f6<br />

500<br />

[-5.000000e+000 +5.000000e+000;-5.000000e+000 +5.000000e+000]<br />

[+0.000000e+000 +0.000000e+000]<br />

1179507480<br />

+2.3096583170456597e-006<br />

10000000000000000111111111111111<br />

<br />

Obr. 14 Struktura uloženého XML souboru<br />

I když je soubor exportován z metody HCA, lze jej opět načíst do jiné metody, např.<br />

GA. Položka OptMethod zde má pouze informativní charakter.<br />

Takové XML rozhraní má mnoho výhod. Uživatel si může podobný sobor XML<br />

sestavit sám (pomocí vhodného textového editoru), definovat veškeré parametry zde a následně<br />

jej jenom načítat v procesech optimalizovaných pomocí GATE-DLL. Další možností je úprava<br />

a editace již existujícího XML, možná změna parametrů, atp. Neposlední výhodou je i to, že<br />

v XML je uložena i inicializační hodnota pro generátor náhodných čísel, potom lze libovolný<br />

průběh optimalizace zopakovat s naprosto stejným výsledkem. Je ovšem nutno provést stejné<br />

nastavení výkonných metod použitého algoritmu (vhodné např. pro účely různého testování,<br />

atp.).


33<br />

Popis a formáty jednotlivých položek XML:<br />

<br />

OptMethod<br />

nParam<br />

nBitParam<br />

mCode<br />

funcOpt<br />

funcName<br />

nIndi<br />

rndSeed<br />

iParam<br />

sVect<br />

BestFitness<br />

BestVector<br />

Popis<br />

Formát, možné hodnoty<br />

Příklad hodnoty<br />

- Informační hodnota pro identifikaci algoritmu, který byl {HC1, HC2, HC12, GA}<br />

použit při optimalizaci před uložením XML<br />

- Nepovinná položka, je možno vynechat HC12<br />

- Počet parametrů optimalizační úlohy<br />

celé číslo [1..999]<br />

15<br />

- Počet bitů, kolika budou kódovány jednotlivé parametry<br />

celé číslo [1..64]<br />

64<br />

- Typ kódování chromozomů, Grayovo nebo binární<br />

{GC, BC}<br />

GC<br />

- Požadavek optimalizace, minimum nebo maximum<br />

{min, max}<br />

min<br />

znakový řetězec, max. 50<br />

- Jméno Matlab „m“ funkce<br />

znaků<br />

f6<br />

- Velikost populace jedinců pro GA<br />

celé číslo [2..2 64 ]<br />

- Nepovinná položka pro HCA 500<br />

- Inicializační hodnota pro generátor náhodných čísel celé číslo [-2 32 ..(2 32 -1)]<br />

- Pokud je zadána 0, bude provedena náhodná<br />

inicializace 1179507480<br />

- Rozsahy, na kterých jsou kódovány parametry<br />

- Jedná se o matici reálných čísel ve stylu zápisu Matlab<br />

[min max;min max; ...]<br />

- Co řádek, to parametr<br />

- Čísla musí být v exponenciálním tvaru tohoto formátu<br />

[+/-][1 číslice].[6 číslic]e[+/-][3 číslice]<br />

- Matice startovacích bodů pro HCA algoritmus, pokud<br />

požadujeme inicializaci startvektorem<br />

- Načítá se pouze pokud je v XML u HCA nastaven<br />

rndSeed na hodnotu 0<br />

- Pro algoritmus GA není třeba definovat<br />

- Vektor reálných čísel (1 x nParam)<br />

- Čísla musí být v exponenciálním tvaru tohoto formátu<br />

[+/-][1 číslice].[6 číslic]e[+/-][3 číslice]<br />

- Nejlepší nalezená hodnota optima<br />

- Reálné číslo<br />

- Číslo musí být v exponenciálním tvaru tohoto formátu<br />

[+/-][1 číslice].[16 číslic]e[+/-][3 číslice]<br />

- Pokud je zadána možnost pokračování výpočtu, načítá<br />

se tato hodnota, jinak má pouze informativní charakter<br />

- Nejlepší nalezený chromozom<br />

- Jedná se o binární řetězec znaků<br />

- Délka (nParam x nBitParam) znaků<br />

- Povoleny jsou pouze znaky „0“ a „1“<br />

- Pokud je zadána možnost pokračování výpočtu, načítá<br />

se tato hodnota, jinak má pouze informativní charakter<br />

Matice reálných čísel ve<br />

formátu Matlab. Délka<br />

každého čísla musí být přesně<br />

14 znaků!<br />

[-5.000000e+000<br />

+5.000000e+000;-<br />

5.000000e+000<br />

+5.000000e+000]<br />

Matice reálných čísel ve<br />

formátu Matlab. Délka<br />

každého čísla musí být přesně<br />

14 znaků!<br />

[+1.000000e+000<br />

+1.000000e+000<br />

+2.000000e+000]<br />

Reálné číslo v exponenciálním<br />

tvaru. Délka musí být přesně<br />

24 znaků!<br />

+2.3096583170456597e-006<br />

binární řetězec délky<br />

(nParam x nBitParam)<br />

0101001100011010<br />

Tab. 1 Popis všech možných položek v XML souboru<br />

Vytvoření souboru XML může být provedeno uživatelem na základě dokumentace dle<br />

Tab.1. Pokud budou hodnoty zadány nekorektně nebo mimo rozsah, který udává tato tabulka,<br />

není zaručena správná funkčnost GATE-DLL <strong>toolbox</strong>u po načtení takového XML. Příklady<br />

XML souborů s různým nastavením jsou přiloženy na CD s přílohami.


34<br />

4.2 Rozhraní DLL knihovny<br />

Knihovna DLL komunikuje se systémem Matlab pomocí vhodně navržených funkcí.<br />

Sestavit vhodné komunikační rozhraní bylo v začátcích velmi problematické. Algoritmy<br />

obsažené v DLL knihovně potřebují k správné funkci komunikovat se systémem Matlab<br />

prostřednictvím matic reálných čísel, které jsou obvykle dost velkého rozměru. Také je potřeba<br />

přenášet některé struktury (např. při inicializaci algoritmů ze souboru XML) a nastavení.<br />

Několik měsíců po sestavení rozhraní jsem zjistil, že systém Matlab používá při<br />

ukládání matic do paměti počítače naprosto odlišný přístup, než jak je zvykem deklarovat<br />

matice v C++. Nepoužívá model dvourozměrného pole, ale pouze jednorozměrné pole, navíc<br />

jsou přehozeny řádky a sloupce. To značně zkomplikovalo práci a musel jsem celé rozhraní<br />

přepsat do jiné podoby.<br />

Postupem času jsem narazil ještě na jiný problém, který začal pomalu celkovou<br />

koncepci čím dál víc ovlivňovat. Ze začátku měla knihovna jenom velmi málo funkcí a<br />

algoritmů. Posléze však začínalo být čím dál obtížnější ladění a nalezení chyb, které vznikaly<br />

uvnitř knihovny DLL. Knihovnu DLL nebylo možno ladit v klasickém debugeru, jak se to<br />

běžně dělá u aplikací, které běží autonomně z EXE souboru. Začínal jsem tak, že jsem odladil<br />

<strong>algoritmy</strong> a objekty v klasickém EXE souboru a poté připojil na rozhraní DLL. Tato metoda<br />

ovšem nemohla odhalit chyby, které byly ve vlastním komunikačním rozhraní, jak jsem brzy<br />

zjistil. Nakonec jsem postupoval tak, že jsem si vytvořil menší simulační prostředí, které<br />

nahrazovalo systém Matlab a ladil jsem celý projekt nejdříve takto a až potom byla knihovna<br />

testována v sytému Matlab. I tak byl postup ladění dosti zdlouhavý, ve srovnání s laděním EXE<br />

projektu.<br />

4.3 Popis exportních funkcí DLL<br />

Komunikační rozhraní sestává právě z takových funkcí. Jsou navrženy tak, aby byl<br />

systém Matlab schopen načíst, modifikovat a poslat zpět data, ať se jedná o matice, struktury či<br />

jednotlivé hodnoty. Součástí DLL knihovny je i externí hlavičkový „h“ soubor, který je potřeba<br />

distribuovat s knihovnou. Jsou v něm uloženy všechny prototypy funkcí, které nabízí DLL. Při<br />

načítání knihovny v systému Matlab je potřeba i tento „h“ soubor. Hlavní hlavičkový soubor je<br />

dále závislý na souboru „globals.h“, ve kterém jsou předdefinovány datové typy a také prototyp<br />

struktury pro export parametrů. Tento způsob se jevil jako nejvhodnější, protože jinak by byla<br />

deklarace vlastních prototypů v hlavním hlavičkovém souboru knihovny extrémně dlouhá.<br />

4.3.1 Základní funkce<br />

Funkce<br />

Popis<br />

Parametry<br />

InitModel(Method,OptType,mCode,funcName,nParam,nBitParam,*iParam,*sVect,PopSize,rSeed)<br />

Inicializace paměti pro vybraný optimalizační algoritmus, nastavení hodnot<br />

Parametr Popis Možné hodnoty<br />

Method Volba algoritmu optimalizace (HC1,HC2,HC12,GA) {0,1,2,3}<br />

OptType Volba optimalizace (min,max) {0,1}<br />

mCode Volba kódování (BC,GC) {0,1}<br />

funcName Jméno vektorizované „m“ fukce<br />

max. 50 znaků<br />

nParam Počet parametrů optimalizační úlohy [1..999]<br />

nBitparam Počet bitů kódujících jeden parametr v binárním kódu [1..64]<br />

vektor rozměru<br />

*iParam Pole hodnot typu double - rozsah kódování parametrů<br />

( 1× nParam ⋅ 2 )<br />

Vektor hodnot typu double - start vektory pro HCA, nebo nulový vektor rozměru<br />

*sVect<br />

ukazatel (pokud je požadována náhodná inicializace HCA) ( 1 × nParam )<br />

PopSize Velikost populace pro GA (nIndi), pro HCA se ignoruje [2..2 64 ]<br />

rSeed<br />

- Hodnota pro inicializaci generátoru náhodných čísel<br />

- Pokud je 0, použije se inicializace pomocí aktuálního času TIME<br />

[-2 32 ..(2 32 -1)]


35<br />

Funkce FreeModel()<br />

Popis Uvolnění paměti, zavolání destruktorů modelu algoritmu vybraného při InitModelu<br />

Parametry Žádné<br />

Funkce<br />

Popis<br />

Parametry *RealArr<br />

Funkce<br />

Popis<br />

GetRealPop(*RealArr)<br />

- Načtení hodnot populace ve formě matice čísel typu double<br />

- Důležitá pro to, aby mohl systém Matlab spočítat fitness pro danou populaci jedinců<br />

- Je třeba volat s parametrem naalokované matice správného rozměru!<br />

Parametr Popis Možné hodnoty<br />

SendFitness(*Fz)<br />

- Ukazatel na matici typu double<br />

- Matice musí být předem naalokována!<br />

- Musí být rozměru (nIndi x nParam)<br />

- Pro <strong>algoritmy</strong> HCA lze zjistit rozměr nIndi voláním funkce<br />

HowMuchAlloc<br />

Odeslání ohodnocení jedinců zpět do DLL<br />

ukazatel na<br />

jednorozměrné<br />

double pole<br />

Parametr Popis Možné hodnoty<br />

Parametry - Matice ohodnocení jedinců, typu double<br />

jednorozměrné<br />

*Fz<br />

- Rozměru (nIndi x 1)<br />

double pole<br />

Funkce<br />

Popis<br />

Parametry<br />

ret = HowMuchAlloc(BitWidth,Mthd)<br />

- Pomocná funkce, vrací počet řádků matice, kolik je třeba naalokovat<br />

- Pro <strong>algoritmy</strong> HCA a GA-HC<br />

Parametr Popis Možné hodnoty<br />

BitWidth Počet sloupců matice (X rozměr) int [1..2 32 ]<br />

Mthd Algoritmus HCA (HC1,HC2,HC12) int {0,1,2}<br />

ret Návratová hodnota (počet řádků matice, Y rozměr) int [1..2 64 ]<br />

Funkce<br />

Popis<br />

ret = GetActualValue()<br />

Zjištění aktuálně nejlepšího ohodnocení (Best Fitness)<br />

Parametr Popis Možné hodnoty<br />

Parametry ret Návratová hodnota typu double double<br />

Funkce<br />

Popis<br />

SetActualValue(Value)<br />

Nastavení aktuálně nejlepšího ohodnocení (Best Fitness)<br />

Parametr Popis Možné hodnoty<br />

Parametry Value Hodnota typu double double<br />

Funkce<br />

Popis<br />

GetActualVectors(*dblArr)<br />

Zjištění aktuálně nejlepších hodnot parametrů<br />

Parametr Popis Možné hodnoty<br />

Parametry<br />

- Ukazatel na matici typu double<br />

jednorozměrné<br />

*dblArr - Matice musí být předem naalokována!<br />

double pole<br />

- Musí být rozměru (1 x nParam)<br />

Funkce<br />

Popis<br />

ret = GetnParam()<br />

Zjištění počtu parametrů nastavených v DLL; pomocná funkce<br />

Parametr Popis Možné hodnoty<br />

Parametry ret Návratová hodnota typu int int [1..2 16 ]


36<br />

4.3.2 Výkonné metody<br />

Funkce<br />

Popis<br />

Parametry<br />

Mutation(Type,Percent)<br />

- Metoda mutace populace<br />

- V případě zavolání této funkce pro HCA provede vygenerování okolí v šířce podle zvoleného<br />

algortimu HCA<br />

Parametr Popis Možné hodnoty<br />

Type - Rezervováno, ignoruje se int {0}<br />

Percent<br />

- Kolik procent bitů populace bude mutovat (0,00..0,99)<br />

- Kolik bitů v populaci bude zmutováno (1..N)<br />

- Pokud je toto číslo < 1, bere se tento parametr jako procento,<br />

v druhém případě jako počet bitů<br />

double [1..N]<br />

[0,00 - 0,99]<br />

Funkce<br />

Popis<br />

Parametry<br />

Cross(Percent,Method,nCrossPts)<br />

- Metoda křížení populace<br />

- Pouze pro algoritmus GA<br />

Parametr Popis Možné hodnoty<br />

Percent Kolik procent populace bude zkříženo (0,00..0,99)<br />

double<br />

[0,00 - 0,99]<br />

Method<br />

- Metoda křížení (pcross,paramcross,ucross)<br />

pcross – bodové křížení<br />

paramcross – bodové s respektováním parametrů<br />

ucross – uniformní křížení (swapbits)<br />

int {0,1,2}<br />

- Počet křížících bodů, pozice se generuje náhodně<br />

nCrossPts - Interně je počet křížících bodů omezen na maximálně<br />

int [0..2 16 ]<br />

(nParam x nBitparam)<br />

Funkce<br />

Selection(nInd)<br />

- Turnajová selekce jedinců<br />

Popis<br />

- Pouze pro GA<br />

Parametr Popis Možné hodnoty<br />

Parametry - Počet jedinců vstupujících do turnaje<br />

nInd<br />

int [1..2 16 ]<br />

- Interně omezeno na max (nIndi)<br />

4.3.3 Funkce pro GA-HC<br />

Funkce<br />

Popis<br />

Parametry<br />

MutationHC(Method,Selection,CoreSize)<br />

Metoda mutace populace pro algoritmus GA-HC<br />

Parametr Popis Možné hodnoty<br />

Method Volba algoritmu optimalizace jader (HC1,HC2,HC12) int {0,1,2}<br />

Selection<br />

- Metoda výběru pozice jádra (rand,randp)<br />

rand – náhodná kdekoliv<br />

randp – náhodná pouze v hranicích parametrů<br />

int {0,1}<br />

CoreSize Velikost jádra v bitech int [0..2 16 ]<br />

Funkce<br />

Popis<br />

Parametry *RealArr<br />

GetRealHC(*RealArr)<br />

- Načtení hodnot bloku populace zoptimalizované pomocí HCA<br />

- Matice čísel typu double<br />

- Důležitá pro to, aby mohl systém Matlab spočítat fitness pro daný blok populace jedinců<br />

- Je třeba volat s parametrem naalokované matice správného rozměru!<br />

Parametr Popis Možné hodnoty<br />

- Ukazatel na matici typu double<br />

- Matice musí být předem naalokována!<br />

- Musí být rozměru (Y x nParam)<br />

- Rozměr Y zjistíme voláním funkce<br />

HowMuchAlloc(CoreSize,Method)<br />

ukazatel na<br />

jednorozměrné<br />

double pole


37<br />

Funkce<br />

Popis<br />

FitnessHC(*FzHC)<br />

Odeslání ohodnocení bloku jedinců, kteří jsou optimalizovaní HCA algoritmem, zpět do DLL<br />

Parametr Popis Možné hodnoty<br />

- Matice ohodnocení jedinců, typu double<br />

Parametry - Rozměru (Y x 1)<br />

jednorozměrné<br />

*FzHC<br />

- Rozměr Y zjistíme voláním funkce<br />

double pole<br />

HowMuchAlloc(CoreSize,Method)<br />

Algoritmus GA-HC pracuje stejně jako algoritmus GA, pouze mutace je vylepšena.<br />

V populaci jsou náhodně vybírána jádra o předem zvolené šířce a tato jádra jsou optimalizována<br />

pomocí definovaného algoritmu HCA. Poté je třeba tento nový blok jedinců (blok populace<br />

celých chromozomů se změněnými jádry) ohodnotit v systému Matlab a hodnocení odeslat zpět<br />

do knihovny DLL. Metoda MutationHC tedy není pouze jenom jedna exportní funkce, ale je<br />

součástí tří metod (MutationHC,GetRealHC,FitnessHC). Bez dalších dvou metod by ji nebylo<br />

možné realizovat (vzhledem k tomu, že DLL jádro pracuje interně, ale ohodnocování provádí<br />

externě systém Matlab).<br />

4.3.4 Funkce pro kompatibilitu s původním GATE<br />

Tyto funkce jsou implementovány proto, aby zůstal nový GATE-DLL kompatibilní<br />

s původním GATE <strong>toolbox</strong>em. Uvážíme-li, že knihovna DLL pracuje interně naprosto<br />

autonomně (veškeré struktury a nastavení jsou modifikovány pouze uvnitř), je třeba doplnit<br />

několik funkcí, které by dokázaly exportovat některé struktury do systému Matlab. Jedná se<br />

hlavně o binární populaci jedinců, která je nutná, pokud by se uživatel rozhodl pokračovat ve<br />

výpočtu v původním GATE <strong>toolbox</strong>u. Rozhodnutí udržovat struktury po celou dobu<br />

optimalizačního procesu pouze v DLL knihovně bylo učiněno na základě rychlostních testů.<br />

Když si uvědomíme, že v každém kroku libovolného algoritmu by bylo třeba exportovat celou<br />

binární populaci (jedná se většinou o matici dost velkého rozměru) do systému Matlab, je jasné,<br />

že rychlost výpočtů nového GATE-DLL by zřejmě nebyla o moc vyšší, než u původního<br />

GATE. A GATE-DLL byl zadán s jasným cílem: urychlit stávající výpočty.<br />

Funkce<br />

Popis<br />

Parametry *BinArr<br />

Funkce<br />

Popis<br />

GetBinPool(*BinArr)<br />

- Získání populace jedinců z DLL v binárním tvaru<br />

- Je třeba volat s parametrem naalokované matice správného rozměru!<br />

Parametr Popis Možné hodnoty<br />

SetBinPool(*BinArr)<br />

- Ukazatel na matici typu double<br />

- Matice musí být předem naalokována!<br />

- Rozměr matice musí být (nInd x nParam ∙ nBitParam)<br />

Nastavení interní binární populace jedinců DLL na určité hodnoty<br />

jednorozměrné<br />

double pole<br />

Parametr Popis Možné hodnoty<br />

Parametry - Matice typu double<br />

jednorozměrné<br />

*BinArr<br />

- Rozměr matice musí být (nInd x nParam ∙ nBitParam) double pole<br />

Funkce<br />

Popis<br />

Parametry *BinArr<br />

GetBinActVec(*BinArr)<br />

- Získání nejlepšího chromozmu z DLL v binárním tvaru<br />

- Je třeba volat s parametrem naalokované matice správného rozměru!<br />

Parametr Popis Možné hodnoty<br />

- Ukazatel na matici typu double<br />

- Matice musí být předem naalokována!<br />

- Rozměr matice musí být (1 x nParam ∙ nBitParam)<br />

jednorozměrné<br />

double pole


38<br />

Funkce<br />

Popis<br />

SetBinActVec(*BinArr)<br />

Nastavení nejlepšího interního chromozmu v DLL na určité hodnoty<br />

Parametr Popis Možné hodnoty<br />

Parametry - Matice typu double<br />

jednorozměrné<br />

*BinArr<br />

- Rozměr matice musí být (1 x nParam ∙ nBitParam)<br />

double pole<br />

4.3.5 Funkce pro podporu XML<br />

Tyto funkce zajišťují obsluhu požadavků uživatele na uložení či načtení nastavení z/do<br />

XML souboru. SaveXML je možné volat kdykoliv v průběhu výpočtu, uloží právě aktuální<br />

hodnoty (aktuální v DLL). LoadXML je možné použít dvěma způsoby. Buď je možno volat tuto<br />

funkci kdekoliv v průběhu výpočtu, nebo ji použít jako inicializaci hodnot pro odstartování<br />

nového výpočtu. V případě, že ji použijeme pro inicializaci, je třeba nejdříve zavolat tzv. slepý<br />

start, tj. zavolat funkci InitModel(Method,0,0,'',0,0,[],0,0,0). Method je číslo metody, kterou<br />

hodláme pokračovat po načtení hodnot z XML {0, 1, 2, 3}, což odpovídá metodám {HC1, HC2,<br />

HC12, GA}. Slepá inicializace je nutná, protože je potřeba spustit konstruktory objektů.<br />

Alokace paměti pro dynamická pole se provede až ve funkci LoadXML.<br />

Funkce<br />

Popis<br />

Parametry<br />

ret = SaveXML(filename)<br />

Uloží parametry interních struktur DLL do XML souboru<br />

Parametr Popis Možné hodnoty<br />

filename<br />

Jméno XML souboru (včetně cesty), do kterého chceme uložit<br />

parametry („d:\\test.xml“)<br />

pole znaků<br />

ret Návratová hodnota, zda se zápis XML podařil či ne (no,yes) int {0,1}<br />

Funkce<br />

Popis<br />

Parametry<br />

ret = LoadXML(filename,StartMode)<br />

Načte parametry z XML souboru a reincializuje interní struktury podle těchto parametrů<br />

Parametr Popis Možné hodnoty<br />

filename<br />

Jméno XML souboru (včetně cesty), ze kterého chceme načíst<br />

parametry („d:\\test.xml“)<br />

pole znaků<br />

StartMode<br />

- Určuje způsob pokračování výpočtu (restart,continue)<br />

restart – reinicializuje výpočet od začátku<br />

continue – načte hodnoty z XML a pokračuje od těchto hodnot<br />

int {0,1}<br />

ret<br />

Návratová hodnota, zda se XML podařilo otevřít a načíst všechny<br />

položky (no,yes)<br />

int {0,1}<br />

Funkce<br />

Popis<br />

ExportParams(*aStruct)<br />

Export parametrů do systému Matlab po načtení hodnot z XML<br />

Parametr Popis Možné hodnoty<br />

- Struktura typu OptParams<br />

Parametry 1<br />

struktura<br />

*aStruct - Struktura musí být dopředu naalokována!<br />

OptParams<br />

- Do této struktury se uloží načtené parametry<br />

1 Jedná se o strukturu se všemi uloženými parametry, detailní popis je v kapitole 4.3.7<br />

4.3.6 Funkce pro podporu distribuovaných výpočtů<br />

Do knihovny DLL byla přidána podpora pro distribuované výpočty. V takovém případě<br />

se z ní stává klientská aplikace, tudíž musí obsahovat podporu i pro tento druh činnosti. Snažil<br />

jsem se maximálně zjednodušit ovládání na straně klientské aplikace, veškeré ovládání klienta<br />

spočívá pouze ve dvou funkcích. Funkce AddClient jej připojí do právě probíhajícího<br />

distribuovaného výpočtu. Ovládání veškeré činnosti potom probíhá na straně serverové<br />

aplikace, klient potom pracuje zcela autonomně a nezávisle. Aby však mohla serverová aplikace


klienta ukončit i v prostředí systému Matlab (hlavní výpočetní cyklus probíhá zde), je třeba ještě<br />

jedna funkce, která bude zjišťovat stav klienta a určovat, zda má být výpočet ukončen či ne. O<br />

to se stará funkce ClientStatus.<br />

Komunikace mezi serverem a klienty při distribuovaných výpočtech je prováděna přes<br />

master XML soubor, který zakládá serverová aplikace. Nejdříve je tedy nutno spustit server a<br />

založit tento XML. Poté je možno připojit klienty na tento soubor. Z toho vyplývá ještě jedna<br />

věc. Před samotným přidáním klienta do distribuovaných výpočtů je potřeba nejdříve<br />

inicializovat model genetického algoritmu z master XML souboru (LoadXML), odkud si načte<br />

veškeré nastavení. Poté je možno volat funkci AddClient a klient se automaticky připojí<br />

k serveru prostřednictvím master XML souboru. Na závěr nutno dodat, že distribuované<br />

výpočty pracují pouze s <strong>algoritmy</strong> GA nebo GA-HC.<br />

39<br />

Popis funkcí:<br />

Funkce<br />

Popis<br />

AddClient()<br />

Parametry Žádné<br />

- Přepne DLL knihovnu do módu klient pro distribuované výpočty<br />

- Před samotným voláním této funkce je třeba načíst master XML soubor (LoadXML)<br />

Funkce<br />

Popis<br />

ret = ClientStatus()<br />

Zjištění stavu klienta při průběhu distribuovaného výpočtu<br />

Parametr Popis Možné hodnoty<br />

Parametry - Návratová hodnota<br />

ret<br />

int {0,1}<br />

- Vrací stav klienta (working,stopped)<br />

4.3.7 Koeficient „míry pokrytí“ Hammingova prostoru<br />

Jedná se o speciální funkci, která dokáže spočítat, jaká je variabilita jedinců v dané<br />

populaci, bližší informace viz [4].<br />

Funkce<br />

Popis<br />

ret = GetQHD()<br />

Vypočtení koeficientu „míry pokrytí“ Hammingova prostoru pro aktuální populaci<br />

Parametr Popis Možné hodnoty<br />

Parametry - Návratová hodnota<br />

ret<br />

double <br />

- Vrací hodnotu q var HD<br />

Funkce<br />

Popis<br />

ret = GetRoHsum()<br />

Vypočtení sumy Hammingovy matice pro aktuální populaci<br />

Parametr Popis Možné hodnoty<br />

Parametry - Návratová hodnota<br />

ret<br />

int [0..2<br />

- Vrací hodnotu ρ<br />

32 ]<br />

Hsum


40<br />

4.3.8 Struktura OptParams<br />

Struktura OptParams je definována v hlavičkovém souboru „globals.h“. Jedná se o<br />

strukturu, ve které se odesílají parametry do systému Matlab po načtení z XML souboru. Tato<br />

struktura musí být dopředu alokována, aby do ní mohla DLL knihovna exportovat patřičné<br />

parametry.<br />

Popis položek struktury<br />

nParam<br />

nBitParam<br />

PopSizeX<br />

PopSizeY<br />

funcName<br />

funcOpt<br />

mCode<br />

*iParam<br />

*sVect<br />

rSeed<br />

- počet parametrů optimalizační úlohy<br />

- počet bitů, kolika jsou kódovány jednotlivé parametry v binárním kódu<br />

- velikost binární populace jedinců, počet sloupců<br />

- velikost binární populace jedinců, počet řádků<br />

- jméno vektorizované účelové funkce (Matlab „m“ souboru)<br />

- požadavek optimalizace, minimum nebo maximum {0, 1} ~ {min, max}<br />

- typ kódování, binární nebo Grayovo {0, 1} ~ {BC, GC}<br />

- matice intervalů, na kterých jsou kódovány jednotlivé intervaly, je potřeba ji<br />

alokovat také dopředu; je rozměru ( nParam × 2 )<br />

- vektor start bodů pro HCA, je třeba alokovat také dopředu; má rozměr<br />

( 1 × nParam )<br />

- hodnota pro inicializaci generátoru náhodných čísel<br />

4.4 Propojení DLL se systémem Matlab<br />

V systému Matlab lze používat externí knihovny ve formě dynamicky linkovaných<br />

knihoven DLL, nebo tříd Java. Využil jsem tedy rychlosti C++ jazyka a podpory DLL<br />

k urychlení výpočtů původního GATE <strong>toolbox</strong>u. Zpočátku jsem nevěděl, jak přenášet rozsáhlé<br />

struktury (velké matice čísel, struktura s parametry) mezi DLL a Matlabem. Jediná rozumná<br />

nápověda, která se k tomuto problému dala najít, byl help Matlabu, kde byly příklady, jak použít<br />

podpory DLL knihoven. Ovšem žádný příklad, jak předat např. rozsáhlé pole čísel. Nakonec<br />

jsem tedy skončil u experimentování a testování, což práci na začátku poněkud zpomalilo.<br />

Systém Matlab podporuje předávání datových struktur i velkých matic v klasickém<br />

formátu C++ jako ukazatele do paměti. Je však potřeba kontrolovat alokaci paměti a také to, zda<br />

se čte a zapisuje z/do povolené oblasti paměti. Jedná se o trochu netradiční přístup k datovým<br />

položkám. Pro získání pole čísel je potřeba postupovat následovně: nejdříve se musí alokovat<br />

matice správného rozměru v Matlabu. Poté předáme knihovně DLL ukazatel na tuto matici a<br />

DLL je schopno do této matice zapsat hodnoty. Nakonec se tyto hodnoty mohou přiřadit do<br />

matice Matlabu. U struktury je to ještě o něco složitější, nejdříve se musí založit prototyp<br />

struktury, kterou chceme získat z DLL, alokovat paměť pro veškeré položky, poté je potřeba<br />

volat DLL s ukazatelem na tuto strukturu a nakonec je možno hodnoty z ukazatele předat<br />

založené struktuře v Matlabu.<br />

Další problém nastal u přenášení dvourozměrných polí. Jak jsem již zmínil v kapitole<br />

4.2, systém Matlab používá odlišný přístup k ukládání rozsáhlých polí čísel (matic), než jak je<br />

to obvyklé ve vyšších programovacích jazycích (C++, Delphi). V jazyce C++ obvykle<br />

deklarujeme matici jako dvourozměrné dynamické nebo statické pole. Systém Matlab podobnou<br />

matici ale ukládá do paměti jako jednorozměrné datové pole. Při přenosu dat mezi Matlabem a<br />

DLL knihovnou nastává tedy problém, že data je třeba konvertovat do jiného formátu a při<br />

předávání zpět opět do původního tvaru. O transformaci dat se stará rozhraní DLL knihovny,<br />

které převádí indexaci datových polí z jednorozměrného formátu do dvourozměrné<br />

reprezentace.<br />

Původní GATE <strong>toolbox</strong> byl vyřešen jako sada Matlab funkcí, které uživatel volal a<br />

používal v prostředí Matlab. Jelikož je přístup k algoritmům v DLL přes rozhraní knihovny<br />

dosti komplikovaný (je třeba deklarovat vhodné ukazatele a struktury), sestavil jsem podobnou<br />

sadu Matlab funkcí, které se liší od původního GATE <strong>toolbox</strong>u co možná nejméně. Ovládání<br />

nového GATE se tak stává velmi jednoduchým a pro uživatele velmi příjemným (ve srovnání


s přímým voláním funkcí DLL knihovny). Toto zjednodušení si ovšem vybralo menší daň<br />

v podobě nepatrného zpomalení výpočtů (časové náklady na volání Matlab funkcí a návrat zpět<br />

do hlavního programu). Pro získání maximální rychlosti výpočtů by bylo potřeba sestavit hlavní<br />

program, který by volal přímo funkce DLL. Tímto by bylo možno dosáhnout dalšího, až<br />

50procentního urychlení oproti programu, který bude volat GATE-DLL funkce.<br />

4.4.1 Systém GATE-DLL<br />

Koncepce GATE-DLL je z pohledu uživatele tvořena sadou předdefinovaných Matlab<br />

funkcí, které je třeba volat v určitém smysluplném pořadí. GA a HCA <strong>algoritmy</strong> mají odlišnou<br />

strukturu volání funkcí, ale některé funkce jsou pro všechny <strong>algoritmy</strong> společné. GATE-DLL<br />

funkce mají téměř shodnou syntaxi jako zápis funkcí původního GATE. Snažil jsem se o<br />

maximální kompatibilitu funkcí. Také hlavní struktura je z větší části naprosto stejná. Některé<br />

funkce a parametry nebyly implementovány (externí DLL by v tomto případě nepřineslo žádné<br />

urychlení, nebo byla vhodnost parametrů posouzena jako ne moc výhodná, proto byl vývoj DLL<br />

zaměřen hlavně na ty funkce a parametry, které jsou důležitější).<br />

4.4.2 Popis hlavní struktury GATE-DLL<br />

Hlavní struktura GATE-DLL byla navržena tak, aby byla co nejvíce podobná původní<br />

GATE struktuře a uživatel mohl v případě nutnosti pokračovat ve výpočtu pomocí GATE. Jako<br />

strukturu pro GATE by však použil GATE-DLL strukturu.<br />

Jedná se o strukturu, ve které jsou uchovávány veškeré parametry a nastavení pro řešení<br />

dané optimalizační úlohy.<br />

Popis položek GATE-DLL Matlab struktury:<br />

nParam - počet parametrů optimalizační úlohy<br />

nBitParam - počet bitů, kolika jsou kódovány jednotlivé parametry<br />

nIndi - velikost populace jedinců GA algoritmů<br />

funName - jméno vektorizované účelové funkce<br />

funOpt - druh optimalizace, minimum nebo maximum {'min', 'max'}<br />

mCode - typ binárního kódování, binární nebo Grayovo {'BC', 'GC'}<br />

iParam - rozsahy, na kterých jsou kódovány jednotlivé parametry; matice rozměru<br />

nParam × 2<br />

mInit - typ inicializace, náhodná nebo startvektorem {'random', 'svect'}<br />

(inicializace startvektorem pouze pro HCA)<br />

rndSeed - inicializační hodnota pro generátor náhodných čísel<br />

Method - typ metody HCA {'HC1', 'HC2', 'HC12'}<br />

sVect - startvektor pro inicializaci HCA ve formě matice rozměru 1 × nParam<br />

GA.funName = 'f6';<br />

GA.funOpt = 'min';<br />

GA.iParam = [-5 5];<br />

GA.nParam = 2;<br />

GA.nBitParam = 16;<br />

GA.nIndi = 500;<br />

GA.mCode = 'BC';<br />

GA.mInit = 'random'<br />

GA.rndSeed = 156;<br />

HC.funName = 'f1';<br />

HC.funOpt = 'min';<br />

HC.iParam = [-5.1 5];<br />

HC.mCode = 'BC';<br />

HC.Method = 'HC12';<br />

HC.mInit = 'svect';<br />

HC.sVect = [1 1 2];<br />

HC.nParam = 3;<br />

HC.nBitParam = 63;<br />

HC.rndSeed = 156;<br />

Obr. 15 Příklady správně definovaných struktur pro GA a HCA<br />

41


42<br />

4.4.3 Popis GATE-DLL funkcí<br />

V následujících tabulkách bude shrnut popis všech funkcí a parametrů, které jsem<br />

sestavil v systému Matlab. Zdrojové kódy těchto funkcí jsou přiloženy na CD, kde je možno se<br />

podívat, jak jsou řešeny, nebo použít přímo sestavené demo aplikace (demoGA a demoHC). Pro<br />

odlišení od původního GATE začínají všechny metody GATE-DLL slovem „DLL“.<br />

Společné funkce:<br />

Funkce<br />

Popis<br />

Parametry<br />

Funkce<br />

Popis<br />

Parametry<br />

Funkce<br />

Popis<br />

Parametry<br />

[GA|HC res] = DLLXMLinit(Method,Filename,Mode)<br />

Inicializuje <strong>algoritmy</strong> GA nebo HCA ze souboru XML<br />

Parametr Popis Možné hodnoty<br />

Method Volba algoritmu optimalizace (HC1,HC2,HC12,GA) int {0,1,2,3}<br />

Filename<br />

Jméno XML souboru (včetně cesty), ze kterého chceme načíst<br />

parametry ('d:\test.xml')<br />

pole znaků<br />

Mode<br />

- Určuje způsob pokračování výpočtu (restart,continue)<br />

restart – reinicializuje výpočet od začátku<br />

int {0,1}<br />

continue – načte hodnoty z XML a pokračuje od těchto hodnot<br />

GA|HC Jméno GA nebo HC hlavní struktury, kterou funkce vrací jméno struktury<br />

res<br />

Validační hodnota, zda se podařilo otevřít soubor a načíst všechny<br />

int {0,1}<br />

parametry (no,yes)<br />

[GA|HC res] = DLLloadXML(GA|HC,Filename,Mode)<br />

- Načte nastavení GA nebo HCA algoritmů z XML souboru<br />

- Pokračuje v optimalizaci dříve vybraným algoritmem<br />

Parametr Popis Možné hodnoty<br />

Jméno vstup/výstupní GA nebo HC hlavní struktury, kterou funkce<br />

GA|HC<br />

jméno struktury<br />

modifikuje a vrací<br />

Jméno XML souboru (včetně cesty), ze kterého chceme načíst<br />

Filename<br />

pole znaků<br />

parametry ('d:\test.xml')<br />

Mode<br />

res<br />

- Určuje způsob pokračování výpočtu (restart,continue)<br />

restart – reinicializuje výpočet od začátku<br />

continue – načte hodnoty z XML a pokračuje od těchto hodnot<br />

Validační hodnota, zda se podařilo otevřít soubor a načíst všechny<br />

parametry (no,yes)<br />

[res] = DLLsaveXML(Filename)<br />

Uloží aktuální nastavení do XML souboru<br />

'restart'<br />

'continue'<br />

int {0,1}<br />

Parametr Popis Možné hodnoty<br />

Filename<br />

Jméno XML souboru (včetně cesty), ze kterého chceme načíst<br />

parametry ('d:\test.xml')<br />

pole znaků<br />

res<br />

Validační hodnota, zda se podařilo otevřít soubor a načíst<br />

všechny parametry (no,yes)<br />

int {0,1}<br />

Funkce<br />

[GA|HC] = DLLfitness(GA|HC)<br />

- Ohodnocení populace jedinců<br />

Popis<br />

- Pro GA i HCA <strong>algoritmy</strong><br />

Parametr Popis Možné hodnoty<br />

Parametry Jméno vstup/výstupní GA nebo HC hlavní struktury, kterou funkce<br />

GA|HC<br />

jméno struktury<br />

modifikuje a vrací


43<br />

Funkce<br />

Popis<br />

Parametry<br />

DLLviewProgress(GA|HC,Mode)<br />

Zobrazí průběh a výsledky optimalizačního procesu<br />

Parametr Popis Možné hodnoty<br />

GA|HC<br />

Jméno vstup/výstupní GA nebo HC hlavní struktury, kterou<br />

funkce modifikuje a vrací<br />

jméno struktury<br />

Mode<br />

Typ výpisu, jenom účelová funkce, nebo i parametry<br />

'small'<br />

(small,full)<br />

'full'<br />

Funkce<br />

[GA|HC] = DLLfreeModel(GA|HC)<br />

- Uvolnění paměti a DLL knihovny<br />

Popis<br />

- Je třeba volat na konci výpočetního cyklu<br />

Parametr Popis Možné hodnoty<br />

Parametry Jméno vstup/výstupní GA nebo HC hlavní struktury, kterou funkce<br />

GA|HC<br />

jméno struktury<br />

uvolní<br />

Funkce<br />

[GA|HC] = DLLGetPool(GA|HC)<br />

- Export binární populace jedinců do Matlab GA/HCA struktury<br />

Popis - Kvůli zachování kompatibility s původním GATE<br />

- Je třeba zavolat před převedením výpočtu do původního GATE<br />

Parametr Popis Možné hodnoty<br />

Parametry Jméno vstup/výstupní GA nebo HC hlavní struktury, kterou funkce<br />

GA|HC<br />

jméno struktury<br />

vrací<br />

Metody pro HCA <strong>algoritmy</strong>:<br />

Funkce<br />

[HC] = DLLstepHC(HC)<br />

- Jeden krok HCA algoritmu<br />

Popis<br />

- Je dobré volat opakovaně v cyklu spolu např. výpisem hodnot (DLLviewProgress)<br />

Parametr Popis Možné hodnoty<br />

Parametry Jméno vstup/výstupní GA nebo HC hlavní struktury, kterou funkce<br />

GA|HC<br />

jméno struktury<br />

vrací<br />

Metody pro GA <strong>algoritmy</strong>:<br />

Funkce<br />

Popis<br />

Parametry<br />

Funkce<br />

Popis<br />

Parametry<br />

[GA] = DLLselect(GA,mSelect,pSelect)<br />

Výkonná metoda selekce pro GA<br />

Parametr Popis Možné hodnoty<br />

GA<br />

Jméno vstup/výstupní GA hlavní struktury, kterou funkce<br />

modifikuje a vrací<br />

jméno struktury<br />

mSelct<br />

- Metoda selekce (tournament)<br />

tournament – turnajová selekce z několika jedinců<br />

'tournament'<br />

pSelect Počet jedinců vstupujících do turnaje int [2..N]<br />

[GA] = DLLcross(GA,mCross,pCross)<br />

Výkonná metoda křížení pro GA<br />

Parametr Popis Možné hodnoty<br />

GA<br />

Jméno vstup/výstupní GA hlavní struktury, kterou funkce<br />

modifikuje a vrací<br />

jméno struktury<br />

mCross<br />

- Metoda křížení (pcross,paramcross,ucross)<br />

'pcross'<br />

pcross – bodové křížení<br />

'paramcross'<br />

paramcross – bodové s respektováním parametrů<br />

'ucross'<br />

ucross – uniformní křížení (swapbits)<br />

- Matice se dvěma parametry [p1 p2]<br />

pCross p1 – kolik procent populace bude zkříženo [0.00 – 0.99] matice (1 x 2)<br />

p2 – počet křížících bodů [1..N]


44<br />

Funkce<br />

Popis<br />

Parametry<br />

Funkce<br />

Popis<br />

Parametry<br />

[GA] = DLLmutation(GA,mMut,pMut)<br />

Výkonná metoda mutace pro algoritmus GA<br />

Parametr Popis Možné hodnoty<br />

GA<br />

Jméno vstup/výstupní GA hlavní struktury, kterou funkce<br />

modifikuje a vrací<br />

jméno struktury<br />

mMut<br />

- Metoda mutace (bitmut)<br />

bitmut – náhodná bitová mutace<br />

'bitmut'<br />

pMut - Kolik procent bitů (pMut < 1), nebo bitů mutuje<br />

[1..N]<br />

[0.00 – 0.99]<br />

[GA] = DLLmutationHC(GA,mHC,nKer,mKer,pKer)<br />

Výkonná metoda mutace pro algoritmus GA-HC<br />

Parametr Popis Možné hodnoty<br />

GA<br />

Jméno vstup/výstupní GA nebo HC hlavní struktury, kterou<br />

funkce modifikuje a vrací<br />

jméno struktury<br />

mHC Volba algoritmu optimalizace jader (HC1,HC2,HC12)<br />

'HC1'<br />

'HC2'<br />

'HC12'<br />

nKer<br />

- Počet jader nebo procent populace jedinců<br />

[1..N]<br />

[1..N] nebo [0.00 - 0.50]<br />

[0.00 – 0.50]<br />

mKer<br />

- Metoda výběru pozice jádra (rand,randp)<br />

'rand'<br />

rand – náhodná kdekoliv<br />

'randp'<br />

randp – náhodná pouze v hranicích parametrů<br />

pKer Velikost jader v bitech [1..N]<br />

Metody pro distribuované výpočty:<br />

Funkce<br />

DLLAddClient<br />

- Přepne DLL knihovnu do módu klient pro distribuované výpočty<br />

Popis - Před samotným voláním této funkce je třeba načíst master XML soubor (DLLLoadXML) nebo<br />

(DLLXMLinit)<br />

Parametr Popis Možné hodnoty<br />

Parametry Žádný<br />

Funkce<br />

Popis<br />

[res] = DLLClientStatus<br />

Zjištění stavu klienta při průběhu distribuovaného výpočtu<br />

Parametr Popis Možné hodnoty<br />

Parametry - Návratová hodnota<br />

res<br />

{0,1}<br />

- Vrací stav klienta (working,stopped)<br />

Metody pro výpočet „míry pokrytí Hammingova prostoru:<br />

Funkce<br />

Popis<br />

[res] = DLLGetQHD<br />

Výpočet „míry pokrytí“ Hammingova prostoru pro aktuální populaci jedinců<br />

Parametr Popis Možné hodnoty<br />

Parametry - Návratová hodnota<br />

res<br />

<br />

- Vrací hodnotu q var HD<br />

Funkce<br />

Popis<br />

[res] = DLLGetRoHsum<br />

Výpočet sumy Hammingovy matice pro aktuální populaci jedinců<br />

Parametr Popis Možné hodnoty<br />

Parametry - Návratová hodnota<br />

res<br />

[0..2<br />

- Vrací hodnotu ρ<br />

32 ]<br />

Hsum


45<br />

Příklady použití GATE-DLL funkcí:<br />

[HC res] = DLLXMLinit('hc12','d:\hc.xml','restart');<br />

if(res)<br />

HC = DLLfitness(HC);<br />

for i=1:100<br />

if(mod(HC.nGener,10) == 0)<br />

DLLviewProgress(HC,'small');<br />

end<br />

HC = DLLstepHC(HC);<br />

HC = DLLfitness(HC);<br />

HC.nGener = HC.nGener + 1;<br />

end<br />

DLLviewProgress(HC,'small');<br />

else<br />

fprintf('Chyba pri nacitani XML souboru.\n');<br />

end<br />

HC = DLLfreeModel(HC);<br />

clear HC i res;<br />

Obr. 16 Příklad GATE-DLL funkcí při použití HCA<br />

GA.funName = 'f6';<br />

GA.funOpt = 'min';<br />

GA.iParam = [-5 5];<br />

GA.iType = '[0)';<br />

GA.nParam = 4;<br />

GA.nBitParam = 16;<br />

GA.nIndi = 500;<br />

GA.mCode = 'BC';<br />

GA.mInit = 'random';<br />

GA = DLLinitPool(GA);<br />

GA = DLLfitness(GA);<br />

for i=1:1000<br />

GA = DLLselect(GA,'tournament',10);<br />

GA = DLLcross(GA,'pcross',[0.2 5]);<br />

GA = DLLmutation(GA,'bitmut',0.02);<br />

GA = DLLfitness(GA);<br />

if(mod(GA.nGener,100) == 0)<br />

DLLviewProgress(GA,'small');<br />

end<br />

GA.nGener = GA.nGener + 1;<br />

end<br />

DLLviewProgress(GA,'small');<br />

GA = DLLfreeModel(GA);<br />

clear GA i;<br />

Obr. 17 Příklad GATE-DLL funkcí při použití GA<br />

4.4.4 Sestavení vektorizované funkce<br />

Správné sestavení vektorizované funkce je pro řešení optimalizačního problému pomocí<br />

GATE nebo GATE-DLL klíčovou záležitostí. Aby bylo možno spočítat víceparametrovou<br />

optimalizaci, musí být účelová funkce převedena na vektorizovaný tvar. Je třeba funkci sestavit<br />

tak, aby pracovala s jedním vstupním parametrem hodnot. Tímto parametrem je matice hodnot<br />

rozměru ( m× n), ve které jsou jednotlivé sloupce jako parametry optimalizační úlohy, tedy<br />

vektory hodnot. Výstupním parametrem pak musí být vektor rozměru ( m × 1), který<br />

reprezentuje ohodnocení jednotlivých řádků pomocí účelové funkce.


46<br />

Matice vstupních vektorů<br />

x 10 x 20 ......... x n0<br />

x 11 x 21 ......... x n1<br />

. . .<br />

. . .<br />

. . .<br />

. . .<br />

x 1m x 2m ......... x nm<br />

Vektorizovaná<br />

účelová funkce<br />

Výstupní vektor<br />

y 10<br />

y 11<br />

.<br />

.<br />

.<br />

.<br />

y 1m<br />

Obr. 18 Princip správně sestavené vektorizované účelové funkce<br />

Převedení funkce na tento tvar nemusí být vždy snadnou záležitostí, podrobnější<br />

informace lze najít v [1].<br />

Příklady správně sestavených vektorizovaných funkcí:<br />

Jednorozměrná funkce:<br />

f ( x)<br />

= x − e<br />

2<br />

x<br />

function [fce] = fce1(x)<br />

fce = x-(exp(x.^2));<br />

end<br />

Víceparametrová funkce:<br />

1<br />

f ( x)<br />

= 12⋅<br />

x1 + ⋅ x2<br />

+ 2⋅<br />

x<br />

2<br />

2<br />

3<br />

function [fce] = fce2(x)<br />

fce = 12.*x(:,1)+1./2.*x(:,2)+2.*x(:,3);<br />

end<br />

Obr. 19 Příklady správně sestavených vektorizovaných funkcí<br />

4.5 Systém distribuovaných výpočtů<br />

Pro účely optimalizace funkcí s mnoha parametry, kdy by jeden výpočetní stroj hledal<br />

optimální řešení velmi dlouho, byla do GATE-DLL přidána podpora pro distribuované výpočty.<br />

Umožňuje spustit výpočet složitého optimalizačního problému na více výpočetních strojích a<br />

tím získat potenciálně velmi výkonný nástroj optimalizace. Nutno dodat, že při distribučních<br />

výpočtech lze využívat pouze genetické <strong>algoritmy</strong> jak GA tak GA-HC, ale ne <strong>algoritmy</strong> HCA.<br />

Každý klient může být nastaven naprosto nezávisle na jiných klientech (samozřejmě kromě<br />

globálních hodnot optimalizace jako: počet parametrů, počet bitů na parametr, ap.).


4.5.1 Struktura master XML souboru<br />

V dřívějších kapitolách jsem již zmínil, že komunikace probíhá netradičním způsobem,<br />

a to přes master XML soubor, který zakládá serverová aplikace. Klienty jsou jednotlivé<br />

GATE−DLL sady funkcí, spouštěné v systému Matlab. Zamezení kolizím při zápisu je řešeno<br />

pomocí archivního atributu souboru. Každá zapisující strana nejdříve testuje stav atributu a<br />

pokud není nastaven, nastaví jej a provede čtení/zápis z/do XML. Po dokončení operace jej zase<br />

vrátí do původního stavu.<br />

Popis položek master XML souboru:<br />

nParam - počet parametrů optimalizační úlohy<br />

nBitParam - počet bitů, kolika bude kódován každý parametr<br />

nIndi - velikost populace jedinců<br />

mCode - typ binárního kódování – binární nebo Grayovo<br />

funcOpt - požadavek optimalizace – minimum nebo maximum<br />

funcName - jméno vektorizované účelové funkce (Matlab „m“ souboru)<br />

iParam - intervaly, na kterých jsou kódovány parametry (omezující podmínky)<br />

rndSeed - inicializační hodnota pro generátor náhodných čísel (vždy 0)<br />

GenStep - počet generací GA algoritmu, po kterých hlásí klienti svůj stav server aplikaci<br />

BestFit - celkově nejlepší fitness ze všech připojených klientů<br />

BestBinFit - celkově nejlepší chromozom ze všech připojených klientů<br />

Clients - počet klientů připojených k serveru<br />

Položky, které přidávají jednotliví klienti:<br />

ClientXFit - nejlepší fitness nalezené klientem číslo X<br />

ClientXBinFit - nejlepší chromozom nalezený klientem číslo X<br />

ClientXStatus - stav klienta číslo X (0, 1, 2, 3) ~ (working, restart, stop, starting)<br />

4.5.2 Průběh komunikace:<br />

Komunikace mezi serverem a klienty probíhá následujícím způsobem:<br />

1) Server aplikace založí master XML soubor s celkovým nastavením optimalizační úlohy.<br />

2) Master soubor musí být nasdílen na síti, aby byl pro klienty pracující na různých<br />

výpočetních strojích dostupný.<br />

3) Server poté monitoruje master XML v 3sekundových intervalech, zda se připojil nějaký<br />

nový klient.<br />

4) Spuštěný klient si ihned na začátku načte globální nastavení z XML souboru, zároveň<br />

zvětší hodnotu Clients o 1. Dále nastaví svůj ClientStatus na hodnotu 3 (starting), čímž<br />

dá najevo serveru, že se připojil nový klient a že ještě nemá vypočteno žádné řešení.<br />

Také si načte hodnotu GenStep, která udává, po kolika generacích GA má hlásit stav<br />

výpočtu serveru.<br />

5) Klient dokončí jeden výpočetní cyklus a předá nalezené řešení do XML. Svůj status<br />

nastaví na hodnotu 0 (runing).<br />

6) Server zaznamená při dalším intervalu monitoringu XML souboru, že se připojil nový<br />

klient a načte jeho řešení.<br />

7) Pokud nastane požadavek restartovat nebo zastavit klienta, zapíše do stavu klienta buď<br />

1 (restart), nebo 2 (stop).<br />

8) Klient si v dalším cyklu nejdříve testuje status, pokud je požadavek k ukončení, zastaví<br />

se. Pokud je požadavek k restartu, načte celkovou nejlepší hodnotu serveru BestFit a<br />

porovnává, zda mezitím on sám nenašel lepší hodnotu (komunikace je zpožděna o 1<br />

cyklus klienta). Pokud je celková hodnota serveru lepší, zařadí chromozom BestBinFit<br />

do populace místo nejhoršího jedince a pokračuje ve výpočtech.<br />

9) Při zastavení serveru se odešle všem klientům stav stop.<br />

47


48<br />

4.5.3 Server aplikace<br />

Server aplikace je vytvořena jako klasická EXE aplikace v prostředí C++ s grafickým<br />

rozhraním. Nastavování všech hodnot je tedy pro uživatele velmi snadné a příjemné. Pokud je<br />

server spuštěn, může uživatel klienty ovládat na dálku manuálně nebo nastavit automatické<br />

hlídání, kdy server aplikace nezávisle na uživatelově zásahu restartuje klienty, kteří mají<br />

nejlepší fitness pod určitou procentuální hranicí celkového fitness.<br />

Obr. 20 Grafické rozhraní server aplikace<br />

4.5.4 Popis ovládání server aplikace:<br />

Nejdříve je potřeba zadat globální nastavení optimalizační úlohy. Zadává se počet<br />

parametrů, počet bitů na parametr, velikost populace jedinců, druh binárního kódování, druh<br />

optimalizace, jméno funkce (Matlab „m“ souboru) a hodnota, po kolika generacích GA hlásí<br />

klienti stav výpočtu serveru.


49<br />

Počet parametrů optimalizační úlohy<br />

Počet bitů, kolika jsou kódovány jednotlivé parametry<br />

Velikost populace jedinců<br />

Typ binárního kódování<br />

Druh optimalizace<br />

Jméno vektorizované účelové funkce<br />

Číslo, které udává, po kolika generacích GA<br />

mají hlásit klienti serveru nalezené fitness<br />

Obr. 21 Globální nastavení serveru<br />

Po nastavení těchto hodnot je možno vkládat intervaly, na kterých jsou kódovány<br />

jednotlivé parametry. Tlačítkem „+“ přidáváme daný interval a tlačítkem „−“ intervaly<br />

odebíráme. Všechny intervaly jsou zobrazeny v okně ve formátu Matlab matice. Počet<br />

vložených intervalů se zobrazuje dole a je třeba je zadávat tak dlouho, dokud počet vložených<br />

intervalů nebude roven počtu nastavených parametrů (poté se zobrazí dole zelený nápis „OK“).<br />

Hodnota minima kódovaného intervalu<br />

Hodnota maxima kódovaného intervalu<br />

Tlačítko pro odebrání hodnot intervalu<br />

Tlačítko pro přidání hodnot intervalu<br />

Zobrazení všech vložených intervalů<br />

Stav kódovaných intervalů<br />

Celkový počet intervalů<br />

Obr. 22 Přidávání intervalů, na kterých jsou kódovány parametry<br />

Nyní je možno uložit master XML soubor (tlačítko dole „Save XML and Start Server“).<br />

Zároveň začne server aplikace po 3sekundových intervalech monitorovat, zda se nepřipojují<br />

klienti. Po připojení klientů server zobrazuje klienty v okně označeném „Clientlist“.


50<br />

Číslo připojeného klienta<br />

Rozdíl fitness klientů od nejlepšího<br />

fitness serveru (v procentech)<br />

Stav klienta (starting, stopped,<br />

restarting, running)<br />

Hodnota fitness klienta<br />

Seznam připojených klientů<br />

Obr. 23 Seznam připojených klientů<br />

Činnost klientů lze ovládat buď manuálně nebo lze nechat ovládání klientů na<br />

automatice serveru. V případě manuálního ovládání lze libovolného klienta restartovat nebo<br />

úplně zastavit. V případě automatického ovládání server sleduje fitness jednotlivých klientů a<br />

klienti, kteří se dostanou pod nastavenou procentuální hranici rozdílu fitness, jsou automaticky<br />

restartováni s novou hodnotou.<br />

Aktivace automatického sledování<br />

Nastavení maximálního rozdílu pro<br />

automatický restart klientů (v procentech)<br />

Nejlepší hodnota fitness ze všech klientů<br />

Manuální restart klienta číslo X<br />

Manuální stop klienta číslo X<br />

Výběr klienta X<br />

Obr. 24 Ovládání klientů a nejlepší hodnota fitness<br />

Server je možno kdykoliv zastavit tlačítkem „Stop“. V tom případě se všem klientům<br />

rozešle požadavek na ukončení práce; jejich stav se přepne na stav 2 (stop).<br />

Server aplikace byla otestována při optimalizaci až 999 parametrů při maximální bitové<br />

přesnosti 64 bitů na parametr. Takový druh optimalizace ovšem není velmi častý a vyžadoval by


adekvátní velikost populace jedinců. Průběh optimalizace by tak byl velmi pomalý a vyžadoval<br />

by výpočet za použití mnoha klientů.<br />

4.5.5 Klientská část<br />

Je tvořena GATE-DLL <strong>toolbox</strong>em, ve kterém je na začátku výpočtu volána funkce<br />

DLLinitXML s parametrem master XML souboru, založeným serverovou aplikací. Poté je<br />

možné zavolat funkci DLLAddClient. Ta připojí klienta do master XML. Následně probíhá<br />

klasický výpočetní cyklus genetického algoritmu, který má jako ukončovací podmínku volání<br />

funkce DLLClientStatus.<br />

Příklad typického GATE-DLL klient Matlab kódu:<br />

[GA res] = DLLXMLinit('GA','d:\server.xml','restart');<br />

if(res)<br />

DLLAddClient;<br />

GA = DLLfitness(GA);<br />

GA.nGener = GA.nGener + 1;<br />

while(~DLLClientStatus)<br />

GA = DLLselect(GA,'tournament',10);<br />

GA = DLLcross(GA,'pcross',[0.3 30]);<br />

GA = DLLmutationHC(GA,'HC12',10,'rand',15);<br />

GA = DLLfitness(GA);<br />

GA.nGener = GA.nGener + 1;<br />

if(mod(GA.nGener,100) == 0)<br />

DLLviewProgress(GA,'small');<br />

end<br />

end<br />

DLLviewProgress(GA,'full');<br />

else<br />

fprintf('Chyba pri nacitani XML souboru.\n');<br />

end<br />

GA = DLLfreeModel(GA);<br />

clear GA res;<br />

51


53<br />

5 PRAKTICKÉ TESTY GATE-DLL<br />

V této kapitole bude provedeno srovnání původního GATE a GATE-DLL týkající se<br />

rychlosti výpočtů a využití paměti RAM. Dále se zaměřím na statistické zpracování schopnosti<br />

GATE-DLL nalézt řešení optimalizačního problému do určité generace jedinců. V závěru<br />

kapitoly budou popsány praktické zkušenosti při testování distribuovaných výpočtů.<br />

5.1 Testovací funkce F6<br />

Tato funkce byla vytvořena pro testování optimalizačních algoritmů zahrnutých v<br />

GATE a DLL−GATE <strong>toolbox</strong>ech. Jedná se o funkci, která simuluje optimalizační problém s<br />

mnoha lokálními extrémy. Je sestavena v tzv. optimálním vektorizovaném tvaru a je na ní<br />

možno testovat optimalizační problémy v libovolné dimenzi prostoru řešení<br />

n .<br />

F<br />

n<br />

2<br />

2<br />

∑( xi − A⋅cos(2⋅<br />

⋅ x i<br />

)<br />

6 ( x)<br />

= A⋅<br />

n +<br />

π )<br />

i=<br />

1<br />

kde: A = 10<br />

n = dimenze prostoru řešení<br />

n<br />

Zápis funkce F 6 v systému Matlab:<br />

function fce = f6(x)<br />

[r s] = size(x);<br />

A = 10;<br />

fce = A*s + sum((x.^2-A*cos(2*pi.*x)),2);<br />

end<br />

Definice testovacího problému:<br />

min{ F 6<br />

( x) | xi<br />

∈[<br />

−5.1,5.0],<br />

i ∈ Ν}<br />

Řešení testovacího problému:<br />

min F 6<br />

(0,...,0) =<br />

0<br />

Obr. 25 Testovací funkce F 6 a testovací optimalizační problém<br />

Obr. 26 Průběh funkce F 6 na rozsahu x = (-5,5)


54<br />

5.2 Testování rychlosti GATE vs. GATE-DLL<br />

Při vytváření GATE-DLL jsem uvažoval, jak využít potenciál vícejádrových CPU. Po<br />

pár testech jsem zjistil, že systém výpočtů a celá koncepce řešení GATE-DLL je příliš<br />

roztříštěná (hlavní cyklus běží v systému Matlab a volají se funkce DLL knihovny) a že nelze<br />

provést vhodnou optimalizaci pro vícejádrové CPU (část výpočetního času připadne na volání<br />

Matlab funkcí). To ovšem nemění nic na faktu, že na vícejádrových CPU lze spustit systém<br />

distribuovaných výpočtů a že na každém jádře CPU lze nechat běžet jednoho klienta.<br />

Testovací PC sestava při prováděných testech rychlosti byla následující:<br />

AMD Athlon X2 2.5GHz, 2GB RAM.<br />

Test 1: Rychlost GA při nastavení:<br />

nParam = 3, nBitParam = 64, nIndi = 500, funName = 'F6', funOpt = 'min',<br />

iParam = [−5.1 5], iType = [-], mInit = 'random'<br />

select(GA,'tournament',10)<br />

cross(GA,'pcross',[0.3 5])<br />

mutation(GA,'bitmut',0.01)<br />

Bylo testováno při obou typech binárního kódování mCode (BC i GC), průběh 1000 generací GA, měřeno v<br />

systému Matlab pomocí funkcí TIC a TOC.<br />

GATE:<br />

číslo měření 1 2 3 4 5 6 7 8 9 10 průměr<br />

t [s]<br />

BC 32,46 32,45 32,59 32,57 32,35 32,63 32,69 32,79 32,32 32,55 32,540<br />

GC 38,34 38,12 38,20 38,34 38,18 38,71 38,23 38,30 38,26 38,91 38,359<br />

GATE-DLL<br />

číslo měření 1 2 3 4 5 6 7 8 9 10 průměr<br />

t [s]<br />

BC 1,59 1,60 1,60 1,60 1,59 1,60 1,60 1,59 1,60 1,60 1,597<br />

GC 2,33 2,33 2,32 2,32 2,32 2,32 2,33 2,36 2,32 2,34 2,329<br />

GATE-DLL, přímé volání DLL funkcí:<br />

číslo měření 1 2 3 4 5 6 7 8 9 10 průměr<br />

BC 0,93 0,95 0,97 0,96 0,94 0,99 0,93 0,97 0,93 0,99 0,956<br />

t [s]<br />

GC 1,67 1,68 1,67 1,69 1,67 1,68 1,67 1,69 1,69 1,66 1,677<br />

40<br />

t [s]<br />

35<br />

30<br />

25<br />

20<br />

BC<br />

GC<br />

15<br />

10<br />

5<br />

0<br />

GATE GATE-DLL DLL-Direct<br />

Obr. 27 Srovnání rychlostí GATE, GATE-DLL a přímého volání DLL funkcí při GA


Z provedených testů rychlosti je zřejmé, že nový GATE-DLL je průměrně 16 až 20krát<br />

rychlejší než původní GATE <strong>toolbox</strong>. Poslední tabulka byla sestavena jen pro zajímavost, jaké<br />

rychlosti by bylo možno dosáhnout při přímém volání DLL funkcí (bez obálky Matlab funkcí).<br />

Test 2: Rychlost GA-HC při nastavení:<br />

nParam = 3, nBitParam = 64, nIndi = 500, funName = 'F6', funOpt = 'min',<br />

iParam = [−5.1 5], iType = [-], mInit = 'random'<br />

select(GA,'tournament',10)<br />

cross(GA,'pcross',[0.3 5])<br />

mutationHC(GA,'HC12',10,'rand',15)<br />

Bylo testováno při obou typech binárního kódování mCode (BC i GC), průběh 1000 generací GA-HC,<br />

měřeno v systému Matlab pomocí funkcí TIC a TOC.<br />

GATE:<br />

n 1 2 3 4 5 6 7 8 9 10 průměr<br />

t [s]<br />

BC 51,29 52,07 52,50 51,95 52,02 51,25 51,60 51,82 51,14 51,46 51,710<br />

GC 71,45 71,87 70,86 72,18 71,23 71,80 71,52 71,72 71,18 71,85 71,566<br />

GATE-DLL<br />

n 1 2 3 4 5 6 7 8 9 10 průměr<br />

t [s]<br />

BC 5,30 5,45 5,32 5,27 5,28 5,31 5,30 5,34 5,28 5,28 5,313<br />

GC 8,03 8,23 8,20 7,94 8,08 8,03 8,05 8,12 8,13 8,26 8,107<br />

55<br />

80<br />

t [s]<br />

70<br />

60<br />

50<br />

BC<br />

GC<br />

40<br />

30<br />

20<br />

10<br />

0<br />

GATE<br />

GATE-DLL<br />

Obr. 28 Srovnání rychlostí GATE a GATE-DLL při algoritmu GA-HC<br />

I u algoritmu GA-GC je nárůst rychlosti velmi dobrý. Urychlení se zde pohybuje kolem<br />

hodnoty 9 až 10násobného zrychlení.<br />

Test 3: Rychlost HC algoritmů:<br />

Vzhledem k tomu, že koncepce HC algoritmů je v původním GATE jiná než v GATE-<br />

DLL, nebylo možno je porovnat z hlediska rychlosti. V původním GATE pracují totiž HCA<br />

opakovaně tak dlouho, dokud se nezacyklí, kdežto v GATE-DLL jsou implementovány jako<br />

jeden krok. Volají se v hlavním programu cyklicky a uživatel volí ukončovací podmínku<br />

manuálně.


56<br />

5.3 Test využití paměti RAM<br />

Jelikož jsou hlavní binární struktury v původním GATE řešeny jako pole s datovými<br />

položkami typu double, bylo zajímavé srovnat, jak tomu bude u GATE-DLL, kde jsou hlavní<br />

binární pole řešena jako datový typ unisgned char. Pro provedení takového testu bylo zvoleno<br />

nastavení s mnoha parametry optimalizační úlohy a velkou populací jedinců, aby byl patrný<br />

rozdíl mezi GATE a GATE-DLL. Bylo provedeno pět měření a vždy změřena špička<br />

(<strong>algoritmy</strong> v průběhu činnosti alokují dynamicky paměť) paměťového využití celého systému<br />

Matlab. Měření bylo zastaveno po 30 sekundách. Po této době bylo změřeno využití paměti<br />

samotného systému Matlab a tato hodnota odečtena, aby se získalo čisté využití paměti.<br />

Testovací PC sestava při prováděných testech byla následující:<br />

AMD Athlon X2 2.5GHz, 2GB RAM.<br />

Test 4: Využití paměti při GA:<br />

nParam = 50, nBitParam = 64, nIndi = 5000, funName = 'F6', funOpt = 'min', iParam = [−5.1 5],<br />

iType = [-], mInit = 'random'<br />

select(GA,'tournament',10), cross(GA,'pcross',[0.3 5]), mutation(GA,'bitmut',0.01)<br />

Paměťová špička byla měřena programem Process Explorer v10.2<br />

GATE:<br />

n 1 2 3 4 5 průměr delta<br />

RAM celkově 624,5 624,0 624,2 620,6 623,3 623,32<br />

495,8<br />

[MB] Matlab 127,4 129,1 126,4 128,1 126,6 127,52<br />

GATE-DLL:<br />

n 1 2 3 4 5 průměr delta<br />

RAM celkově 275,5 280,0 279,1 279,3 279,1 278,60<br />

[MB] Matlab 122,8 123,8 124,0 123,9 123,9 123,68<br />

154,92<br />

RAM<br />

[MB]<br />

500<br />

450<br />

400<br />

350<br />

300<br />

250<br />

200<br />

150<br />

100<br />

50<br />

0<br />

GATE<br />

GATE-DLL<br />

Obr. 29 Srovnání využití paměťového prostoru GATE a GATE-DLL<br />

U algoritmů GA-HC bylo využití paměťového prostoru RAM téměř identické jako u<br />

GA, tudíž nebylo třeba provádět stejné měření i tam. Jak je vidět z výsledků měření, nový<br />

GATE-DLL potřebuje ke své činnosti asi 3krát méně operační paměti než původní GATE při<br />

stejném nastavení.


5.4 Schopnost nalezení řešení<br />

Heuristické optimalizační metody by měly umožňovat nalezení řešení v přijatelné době<br />

a s dostatečně velkou přesností. Bylo by proto ještě dobré statisticky otestovat, jestli tomu tak<br />

skutečně je i u GATE-DLL. Test byl proveden pomocí algoritmu GA s nastavením uvedeným<br />

níže. Celkem bylo provedeno pět testů, a to schopnost nalézt řešení po 80, 90, 100, 120 a 150<br />

generacích GA. Byla prováděna optimalizace funkce F 6 , jako hranice přijatelné přesnosti byla<br />

stanovena hodnota řešení větší než 10 -8 . Řešení, která přesností přesáhla hranici 10 -15 , byla<br />

zařazena do kategorie „přesná řešení“. Každý z pěti testů byl zopakován 1000krát, aby byl k<br />

dispozici dostatečně velký statistický soubor dat.<br />

Nastavení GA:<br />

nParam = 4, nBitParam = 64, nIndi = 500, funName = 'F6', funOpt = 'min', iParam = [−5 5],<br />

mInit = 'random', mCode = 'GC'<br />

select(GA,'tournament',10)<br />

cross(GA,'pcross',[0.3 5])<br />

mutation(GA,'bitmut',0.01)<br />

Měření bylo opakováno pro každý generační limit 1000krát. Limit nalezených řešení je 10 -8 . Za přesné<br />

řešení je považováno to, které je s přesností větší než 10 -15 . Za uvázlé řešení se považuje to, u kterého<br />

jeden nebo více parametrů uvázlo v lokálním extrému.<br />

Generační limit: 80 generací GA<br />

x ~ x s Nalezených Přesných Uvázlých<br />

řešení [%] řešení [%] řešení [%]<br />

−2<br />

−12<br />

8,49600⋅<br />

10 9,42180⋅ 10 0 , 27844 81,4 2,4 7,8<br />

Generační limit: 90 generací GA<br />

x ~ x s Nalezených Přesných Uvázlých<br />

řešení [%] řešení [%] řešení [%]<br />

−2<br />

−13<br />

6,96682⋅<br />

10 2,70006⋅ 10 0 , 29577 87,9 14,7 5,5<br />

Generační limit: 100 generací GA<br />

x ~ x s Nalezených Přesných Uvázlých<br />

řešení [%] řešení [%] řešení [%]<br />

−2<br />

−14<br />

2,48694 ⋅ 10 1,42109⋅ 10 0 , 15099 93,7 40,3 2,0<br />

Generační limit: 120 generací GA<br />

x ~ x s Nalezených Přesných Uvázlých<br />

řešení [%] řešení [%] řešení [%]<br />

−2<br />

1,55514⋅ 10 0 , 00000 0 , 12039 96,4 80,4 1,4<br />

Generační limit: 150 generací GA<br />

x ~ x s Nalezených Přesných Uvázlých<br />

řešení [%] řešení [%] řešení [%]<br />

−3<br />

3,98261⋅ 10 0 , 00000 0 , 06283 99,2 97,4 0,4<br />

57<br />

Soubor statistických dat jasně prokázal, že GATE-DLL je schopen nalézt řešení<br />

testovacího optimalizačního problému v uspokojivé době (150 generací GA trvalo na<br />

testovacím stroji průměrně 0,5 sekundy) a s dostatečnou přesností. Počet uvázlých řešení v<br />

optimalizačním problému se přitom s větším počtem generací GA příznivě snižuje.


58<br />

5.5 Srovnání algoritmů GA a GA-HC<br />

Tento test byl zaměřen na to, jaký rozdíl bude při řešení optimalizačního problému<br />

pomocí GA a GA-HC algoritmu. GA-HC by měl poskytovat stabilnější metodu k hledání<br />

složitějších optimalizačních problémů. Jako testovací optimalizační problém byla opět použita<br />

funkce F 6 a testování probíhalo následovně: byla provedena opakovaná optimalizace<br />

s nastavením uvedeným níže, a to nejdříve algoritmem GA a poté pomocí GA-HC. Nalezená<br />

řešení po 100 generacích byla zaznamenána. Tento pokus se 1000krát zopakoval, aby byl<br />

k dispozici dostatečně velký soubor statistických dat. Jako hranice přijatelné přesnosti byla<br />

stanovena hodnota řešení s přesností větší než 10 -8 . Řešení, která přesností přesáhla<br />

-15<br />

hranici10 , byla zařazena do kategorie „přesná řešení“.<br />

Nastavení GA a GA-HC:<br />

nParam = 6, nBitParam = 64, nIndi = 500, funName = 'F6', funOpt = 'min', iParam = [−5 5],<br />

mInit = 'random', mCode = 'GC'<br />

select(GA,'tournament',10)<br />

cross(GA,'pcross',[0.3 5])<br />

mutation(GA,'bitmut',0.01)<br />

mutationHC(GA,'HC12',15,'rand',15)<br />

Měření bylo opakováno pro každý generační limit 1000krát. Limit nalezených řešení je 10 -8 . Za přesné<br />

řešení je považováno to, které je s přesností větší než 10 -15 . Za uvázlé řešení se považuje to, u kterého<br />

jeden nebo více parametrů uvázlo v lokálním extrému.<br />

Algoritmus GA:<br />

x ~ x s Nalezených Přesných Uvázlých<br />

řešení [%] řešení [%] řešení [%]<br />

−1<br />

−8<br />

1,66793⋅<br />

10 1,90257 ⋅ 10 0 , 45769 44,4 0,0 13,5<br />

Algoritmus GA-HC:<br />

2,67448<br />

x x ~ s<br />

−14<br />

⋅ 10 0 , 000000<br />

−13<br />

5,334 10<br />

Nalezených<br />

řešení [%]<br />

Přesných<br />

řešení [%]<br />

Uvázlých<br />

řešení [%]<br />

⋅ 100,0 85,1 0,0<br />

Z uvedených statistik je zřejmé, že algoritmus GA-HC je podstatně lepší, co se týká<br />

nalezení řešení v minimálním počtu generací. Je také vidět, že GA-HC nemá takové problémy<br />

s uváznutím řešení jako GA. To však nemění nic na faktu, že GA-HC je o něco pomalejší.


5.6 Statistické zobrazení vývoje výpočtů GA<br />

Tento test zobrazuje průběh hledání optima pomocí GA algoritmu. Bylo testováno na<br />

funkci F 6 a vytvořeny řezy po 10 generacích GA a zaznamenán výsledek. Každé měření bylo<br />

zopakováno 100krát, aby byl k dispozici dostatečně velký soubor statistických dat. Výsledkem<br />

měření je statistický graf, kde jsou na ose x vynášeny generace a na ose y průměr z nalezených<br />

řešení, medián a směrodatná odchylka.<br />

Nastavení GA:<br />

nParam = 4, nBitParam = 64, nIndi = 500, funName = 'F6', funOpt = 'min', iParam = [−5 5],<br />

mInit = 'random', mCode = 'GC'<br />

select(GA,'tournament',10)<br />

cross(GA,'pcross',[0.3 8])<br />

mutation(GA,'bitmut',0.01)<br />

Měření bylo opakováno pro každý generační limit 100krát.<br />

GA algoritmus, generační řezy (n = číslo generace):<br />

n 10 20 30 40 50 60 70 80<br />

x 1,52∙10 0 7,49∙10 -1 5,34∙10 -1 4,17∙10 -1 2,87∙10 -1 2,93∙10 -1 6,98∙10 -2 1,24∙10 -1<br />

~<br />

x 1,19∙10 0 9,95∙10 -1 5,22∙10 -3 8,74∙10 -5 4,68∙10 -7 1,37∙10 -8 4,12∙10 -10 1,65∙10 -11<br />

s 0,9155 0,7383 0,7554 0,6209 0,5984 0,5058 0,2551 0,3416<br />

n 90 100 110 120 130 140 150 160<br />

x<br />

~<br />

x<br />

2,98∙10 -2 5,28∙10 -2 2,98∙10 -2 9,95∙10 -3 1,99∙10 -2 1,64∙10 -2 1,27∙10 -15 0,00<br />

2,34∙10 -13 1,42∙10 -14 0,00 0,00 0,00 0,00 0,00 0,00<br />

s 0,1706 0,2194 0,1706 0,0995 0,1400 0,1181 9,55∙10 -15 0,00<br />

59<br />

2,5<br />

fitness<br />

2<br />

1,5<br />

1<br />

0,5<br />

průměr<br />

medián<br />

0<br />

0 20 40 60 80 100 120 140 160<br />

generace GA<br />

Obr. 30 Generační řezy průběhu optimalizace F 6 10 – 160 generací


60<br />

5.7 Testování distribuovaných výpočtů<br />

V této kapitole bude otestován systém distribuovaných výpočtů, který má prokázat, že<br />

rychlost řešení složitého optimalizačního problému je vyšší u systému distribuovaných výpočtů,<br />

než u jednoho GATE-DLL. K testování byla opět využita funkce F 6 , která simulovala složitý<br />

optimalizační problém s mnoha parametry. Test byl prováděny následovně: bylo spuštěno n<br />

klientů a po jednominutových intervalech hledání optima se zaznamenával nejlepší výsledek,<br />

který zobrazovala serverová aplikace. Po 5 minutách byl celý test ukončen. Měření bylo<br />

opakováno 5krát pro každých n klientů. Byly provedeny dva testy, jeden při 4 hardwarových<br />

strojích spojených pomocí sítě LAN a druhý byl prováděn na jednom HW stroji, kde běželi 4<br />

klienti virtuálně.<br />

Nastavení GA, GA-HC:<br />

nParam = 100, nBitParam = 64, nIndi = 5000, funName = 'F6', funOpt = 'min', iParam = [−5.1 5],<br />

mInit = 'random', mCode = 'GC'<br />

Nastavení jednotlivých klientů bylo individuální, ponechala se tak výhoda variabilních výsledků a tím lepší<br />

kooperace klientů. Klienti byli po celou dobu měření nastaveni stejně. Algoritmem pro jednoho klienta byl<br />

zvolen účinnější GA-HC. Při testování více klientů bylo nastaveno 30% rozdílová hodnota pro automatický<br />

restart horších klientů.<br />

Test 1: Hardwarové distribuční stroje<br />

HW stroje (průměrné výsledky z pěti měření):<br />

n<br />

1 2 4<br />

čas<br />

1 min 3,088∙10 2 1,881∙10 2 8,751∙10 1<br />

2 min 1,841∙10 2 6,852∙10 1 3,453∙10 1<br />

3 min 1,148∙10 2 2,775∙10 1 1,849∙10 1<br />

4 min 7,203∙10 1 1,496∙10 1 8,990∙10 0<br />

5 min 4,602∙10 1 1,373∙10 1 4,428∙10 0<br />

Test 2: Virtuální distribuční stroje<br />

Virtuální stroje (průměrné výsledky z pěti měření):<br />

n<br />

1 4<br />

čas<br />

1 min 3,088∙10 2 3,232∙10 2<br />

2 min 1,841∙10 2 2,493∙10 2<br />

3 min 1,148∙10 2 1,702∙10 2<br />

4 min 7,203∙10 1 1,252∙10 2<br />

5 min 4,602∙10 1 1,041∙10 2<br />

Měření výsledků bylo časově náročné, proto jsem měřil vždy pouze pět hodnot u<br />

každého testu. Hodnoty fitness jsou tak vysoké, protože vyřešení optimalizačního problému se<br />

100 parametry by zřejmě vyžadovalo hodně času i pro distribuované výpočty. Jen pro<br />

zajímavost uvedu mé pozorování práce čtyř HW klientů. Na dvou strojích běžely GA-HC, jeden<br />

s nastavením rand a druhý randp. Na zbylých dvou strojích běžely GA s různým nastavením.<br />

GA-HC poskytovaly celou dobu konstantní postup a většinu času byli „tahouni“. Naopak GA<br />

<strong>algoritmy</strong> předváděly větší skokové pokroky, obzvláště pokud jim bylo posláno lepší řešení od<br />

serveru. Tím se klienti navzájem velmi dobře doplňovali.<br />

Jak je z tabulek patrné, čtyři kooperující klienti nalezli za stejný čas řešení průměrně<br />

zhruba o jeden řád přesnější, než jeden samostatně pracující GATE-DLL. Čím složitější<br />

optimalizační problém, tím více by se zřejmě projevil přínos distribuovaných výpočtů.


61<br />

350<br />

fitness<br />

300<br />

250<br />

200<br />

150<br />

100<br />

1 klient<br />

2 klienti<br />

4 klienti<br />

50<br />

0<br />

0 1 2 3 4 5 6<br />

t [min]<br />

Obr. 31 Časové řezy 1, 2 a 4 klientů pracujících na HW strojích<br />

350<br />

fitness<br />

300<br />

250<br />

200<br />

150<br />

1 klient<br />

4 klienti<br />

100<br />

50<br />

0<br />

0 1 2 3 4 5 6<br />

t [min]<br />

Obr. 32 Časové řezy 1 a 4 klientů pracujících na virtuálním stroji (1 CPU)


62<br />

Z grafů je patrné, že spuštění 2 a 4 klientů na HW strojích propojených v síti LAN<br />

výrazně urychlilo výpočet optimalizačního problému. Ovšem spuštění 4 klientů na jednom<br />

virtuálním stroji (1 fyzický CPU) mělo nežádoucí vliv na rychlost výpočtu. Klienti se spíše<br />

navzájem brzdili a nepomohla ani výměna lepšího řešení mezi klienty.


63<br />

6 ZÁVĚR<br />

Řešení pomocí externí dynamicky linkované knihovny DLL se ukázalo jako velmi<br />

efektivní. Jak prokázaly výsledky testování, GATE-DLL <strong>toolbox</strong> je po většině stránek<br />

výkonnější než původní GATE <strong>toolbox</strong>. Zvýšení rychlosti se pohybuje v rozmezí 9 až<br />

20násobného urychlení. GATE-DLL má také menší požadavky na využití operační paměti<br />

RAM počítače. Spotřebuje až 3krát méně operační paměti než původní GATE <strong>toolbox</strong>.<br />

Testy schopnosti nalezení řešení prokázaly, že <strong>algoritmy</strong> GA i GA-HC dokáží najít<br />

požadovaná řešení s dostatečnou přesností a v přijatelném čase ve většině testovaných případů.<br />

Algoritmus GA-HC je podstatně efektivnější, co se týče hledání optimálního řešení, v méně<br />

generačních cyklech.<br />

Distribuované výpočty byly implementovány sice velmi jednouše, ale i tak se jedná o<br />

výkonný nástroj k optimalizaci velmi složitých optimalizačních problémů. Umožňují<br />

vyhledávat řešení pro optimalizační problémy s více než 900 parametry, kde by jeden<br />

GATE−DLL klient hledal řešení velmi dlouho. Čtyři klienti dokáží zvýšit rychlost hledání<br />

optima asi na dvojnásobek, ovšem za předpokladu, že každý klient pracuje na samostatném<br />

hardwarovém stroji.


65<br />

SEZNAM LITERÁRNÍCH ZDROJŮ<br />

[1] MATOUŠEK, Radomil. GATE 2.0 - Toolbox pro heuristickou optimalizaci. In<br />

Technical Computing Prague 2005, [online]. 2005 [cit. 10.5.2007]. Dostupné z WWW:<br />

http://dsp.vscht.cz/konference_<strong>matlab</strong>/MATLAB05/prispevky/matousek/matousek.pdf<br />

[2] TIŠNOVSKÝ, Pavel. Fixed Point Arithmetic. Root.cz [online]. 2006. [cit. 9.5.2007]<br />

Dostupný na WWW: http://www.root.cz/clanky/fixed-point-arithmetic/<br />

[3] SEKAJ, Ivan. Evolučné výpočty a ich využitie v praxi. Iris. Bratislava, 2005. 159 s.<br />

ISBN 80-89018-87-4<br />

[4] MATOUŠEK, Radomil. Vybrané metody umělé inteligence – implementace a aplikace.<br />

Brno, 2004. Disertační práce FSI VUT Brno 2004.<br />

[5] MSDN Library 2005. [online]. Dostupné z WWW:<br />

http://msdn2.microsoft.com/en-us/default.aspx<br />

[6] Builder.cz. [online]. Dostupné z WWW:<br />

http://www.builder.cz/<br />

[7] cplusplus.com [online]. Dostupné z WWW:<br />

http://www.cplusplus.com/<br />

[8] CodeGuru [online]. Dostupné z WWW:<br />

http://www.codeguru.com/<br />

[9] Matlab help. [online]. Dostupné z WWW:<br />

http://www.mathworks.com/access/helpdesk/help/techdoc/<strong>matlab</strong>.shtml

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!