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
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