ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE FAKULTA ELEKTROTECHNICKÁ
DIPLOMOVÁ PRÁCE
OPTIMALIZACE PÁŘENÍM VČELÍ KRÁLOVNY Tomáš Čeleda
Vedoucí diplomové práce: Doc. Ing. Jiří Lažanský CSc. Praha 2011
ii
Abstrakt Práce se zabývá popisem relativně nového metaheuristického optimalizačního algoritmu inspirovaného rozmnožováním včel (Honey Bees Mating Optimization – HBMO). Obsahuje detailní popis algoritmu a shrnutí jeho dosavadních úspěšných aplikací. HBMO algoritmus byl v rámci práce implementován a byly provedeny experimenty na problému splnitelnosti Booleovských formulí (3-SAT), různých spojitých problémech a problému obchodního cestujícího. Experimenty byly prováděny s různými kombinacemi vstupních parametrů a výsledky byly vzájemně porovnávány. Dosažené výsledky byly porovnány s tradičnějšími metodami optimalizace a výsledky v literatuře. Vzájemné porovnávání různých algoritmů bylo prováděno na základě nejlepšího dosaženého řešení za daný počet vyhodnocení účelové funkce. Díky tomu je možné použít dosažené výsledky pro další práce.
Abstract This work deals with a relatively new metaheuristic algorithm called Honey Bees Mating Optimization (HBMO). It contains a detailed description of the algorithm and it’s summarized successful applications. The algorithm has been implemented and many experiments have been performed on various types of problems including propositional satisfiability problems (3-SAT), problems with real variables (like Rosenbrock function) and the traveling salesman problem. Various combinations of input parameters have been tested to obtain optimal performance. Results have been compared with other more conventional optimization methods. Comparison is based on best solution found in given number of utility function evaluations, so it is possible to use results for further comparison in later work.
iii
Poděkování Děkuji svému vedoucímu práce Doc. Ing. Jiřímu Lažanskému CSc. za podporu, cenné rady a připomínky při vypracování této diplomové práce. Chtěl bych také poděkovat svým rodičům za jejich celoživotní podporu.
iv
v
Obsah 1. Úvod .................................................................................................................................................... 1 2. Popis algoritmu.................................................................................................................................... 2 2.1 Úvod .............................................................................................................................................. 2 2.2 Inspirace přírodou ......................................................................................................................... 2 2.2.1
Struktura včelstva ............................................................................................................ 2
2.2.2
Rozmnožování včel .......................................................................................................... 2
2.2.3
Svatební let ...................................................................................................................... 2
2.3 Optimalizační algoritmus inspirovaný pářením včel ..................................................................... 3 2.3.1
Inicializace ....................................................................................................................... 4
2.3.2
Svatební let ...................................................................................................................... 5
2.3.3
Křížení a nová populace................................................................................................... 6
2.3.4
Vylepšení populace pomocí dělnic .................................................................................. 7
2.3.5
Nahrazení královny .......................................................................................................... 8
2.3.6
Implementace algoritmu pro řešení konkrétního problému .......................................... 8
3. Metodika testování ............................................................................................................................. 9 4. Aplikace na problém splnitelnosti booleovských klauzulí ................................................................. 10 4.2 Implementace HBMO pro 3-SAT ................................................................................................. 10 4.2.1
Reprezentace a výpočet zdatnosti ................................................................................ 10
4.2.2
Svatební let .................................................................................................................... 11
4.2.3
Operátor křížení............................................................................................................. 11
4.2.4
Dělnice ........................................................................................................................... 11
4.3 Algoritmus WalkSAT .................................................................................................................... 12 4.4 Výsledky ....................................................................................................................................... 13 5. Optimalizace spojitých funkcí ............................................................................................................ 19 5.1 Implementace HBMO pro reálné funkce..................................................................................... 19 5.1.1
Reprezentace a výpočet zdatnosti ................................................................................ 19
5.1.2
Svatební let .................................................................................................................... 19
5.1.3
Operátor křížení............................................................................................................. 20
5.1.4
Dělnice ........................................................................................................................... 20
5.2 Rosenbrockův algoritmus ............................................................................................................ 22 5.3 Diferenciální evoluce ................................................................................................................... 23 5.4 Experimenty a výsledky ............................................................................................................... 23
vi
5.4.1
Konfigurace algoritmů pro srovnávací testy.................................................................. 24
5.4.2
Rozšířená Rosenbrockova funkce .................................................................................. 24
5.4.3
Rastriginova funkce ....................................................................................................... 28
5.4.4
Ackleyho funkce ............................................................................................................ 29
5.4.5
Fletcher-Powellova funkce ............................................................................................ 31
6. Řešení problému obchodního cestujícího ......................................................................................... 34 6.1 Stochastický problém obchodního cestujícího ............................................................................ 34 6.2 Implementace HBMO pro TSP ..................................................................................................... 36 6.2.1
Reprezentace a výpočet zdatnosti ................................................................................ 36
6.2.2
Operátor mutace přepojením ....................................................................................... 37
6.2.3
Operátor mutace RuinAndRecreate .............................................................................. 37
6.2.4
Svatební let .................................................................................................................... 38
6.2.5
Operátor křížení............................................................................................................. 39
6.2.6
Dělnice ........................................................................................................................... 40
6.2.7
Algoritmus HBMO-TSP v pseudokódu ........................................................................... 41
6.3 Implementace umělé mravenčí kolonie pro TSP......................................................................... 42 6.4 Výsledky TSP ................................................................................................................................ 43 7. Testovací platforma ........................................................................................................................... 45 8. Náměty pro další práci ...................................................................................................................... 46 9. Závěr .................................................................................................................................................. 47 10. Použitá literatura ............................................................................................................................. 48 A.
Obsah CD ....................................................................................................................................... 51
B.
Použití programu ........................................................................................................................... 52
C.
Implementace nového optimalizačního problému do frameworku ............................................. 55
vii
1. Úvod Řešením optimalizačního problému je najít mezi přípustnými řešeními to nejlepší řešení. Formálněji, najít řešení v oblasti přípustných řešení, které je minimem (nebo maximem) účelové funkce nebo se tomuto řešení alespoň nejvíce přiblížit [1]. Nalezení takového řešení je pro některé problémy velmi obtížné. Prostor přípustných řešení může být velmi rozsáhlý. Problém vysvětlíme na problému obchodního cestujícího [2]. Úkolem obchodního cestujícího je navštívit zákazníky v mnoha různých městech. Mezi městy jsou silnice. Problém cestujícího je nalézt takové pořadí měst, aby celková ujetá vzdálenost byla co nejmenší. Pokud bude cestující mít za úkol navštívit měst, existuje jejich různých permutací. Je zcela vyloučené postupně spočítat délku všech možných cesty a vybrat z nich tu nejkratší. Pro řešení takto náročných problémů se používají heuristické algoritmy, které sice nezaručují nalezení nejlepšího řešení, ale dokážou najít řešení, které je jen o málo horší než hledané optimum, a najdou je za přijatelně krátkou dobu. Během posledních dvou dekád se přírodou inspirované přístupy stávají stále oblíbenějšími při návrhu pokročilých informačních systémů. Mezi nejúspěšnější přírodou inspirované algoritmy pro optimalizaci při řešení komplexních problémů patří ty, které jsou inspirované úspěšným organizovaným chováním živočichů nebo mikroorganismů. Jde například o Particle swarm optimization inspirované chováním hejn ptáků [3] nebo ryb [4] nebo Ant Colony Optimization inspirované chováním mravenců při vyhledávání a sběru potravy [5]. Před několika lety byl objeven nový algoritmus inspirovaný chováním společenského hmyzu nazvaný Optimalizace pářením včelí královny (Honey Bees Mating Optimization – zkráceně HBMO) [6]. Od té doby byl algoritmus úspěšně aplikován na různé optimalizační problémy [6] [7] [8]. Tato práce si klade za cíl shrnout již dosažené poznatky a experimentálně ověřit jejich účinnost na vybrané skupině dalších optimalizačních problémů.
1 / 59
2. Popis algoritmu 2.1 Úvod HBMO je metaheuristický algoritmus, který se částečně podobá genetickému algoritmu. Při implementaci pro konkrétní typ problému je zvolena vhodná reprezentace jeho řešení a do HBMO algoritmu jsou zapojeny konkrétní metody křížení a mutace vhodné pro daný problém a zvolenou reprezentaci. HBMO může být použit na celou řadu optimalizačních problémů. Optimalizační problém může obsahovat spojité nebo diskrétní vstupní proměnné, může být kombinatorickým problémem nebo třeba kombinací spojitého a kombinatorického problému. Pro funkci algoritmu je podstatné to, že existuje tzv. účelová funkce, jejímž vstupem je jedno řešení problému a výstupem je číselné vyjádření kvality řešení (tzv. zdatnost řešení). Jedná se tedy o „black-box“ optimalizaci, neboť algoritmus nevidí do vnitřní struktury problému. Jedinou informací, kterou má algoritmus k dispozici, jsou hodnoty účelové funkce pro řešení, která sám vygeneroval. HBMO algoritmus tedy funguje tak, že postupně generuje různá řešení, ty ohodnocuje prostřednictvím účelové funkce a pamatuje si vždy nejlepší doposud nalezené řešení. Toto řešení je pak výsledkem celého optimalizačního procesu.
2.2 Inspirace přírodou 2.2.1 Struktura včelstva Kolonie včel medonosných se typicky skládá z královny, dělnic, trubců a larev. V rozmnožování (alespoň u některých druhů, například u evropského Apis mellifera) hrají hlavní úlohu královny specializující se na kladení vajíček. Dělnice mají ve včelím roji mnoho úloh. Mimo jiné se starají o larvy. Larvy se rodí z oplodněných nebo neoplodněných vajíček. Z oplodněných se rodí budoucí dělnice nebo královny, z neoplodněných budoucí trubci [6]. Trubci jsou haploidní samci, kteří nesou stejný genom jako jejich matka, pokud nedojde k jeho změně vlivem náhodné mutace. Dělnice je vlastně potenciální matka, které však nebylo dáno vyrůstat v buňce takové velikosti a s takovou stravou, aby se jí dovyvinuly pohlavní orgány, a tak je má zakrnělé [9].
2.2.2 Rozmnožování včel Nová včelí kolonie může být založena dvěma způsoby. První způsob se nazývá založení migrací. Probíhá tak, že samička schopná rozmnožování postaví hnízdo, naklade vajíčka a krmí larvy. Po dospění prvního vrhu nastává dělba práce, královny se specializují na kladení vajíček a dělnice na péči o larvy [10]. Včelí královna po svém vylíhnutí odletí na svůj svatební let, při kterém se páří s trubci. Druhým způsobem je takzvané rojení. Při rojení je kolonie založena jednou nebo více královnami v doprovodu skupiny dělnic pocházejících z původní kolonie. Dělba práce začíná okamžitě po založení kolonie.
2.2.3 Svatební let Rojení včelstva začíná tanečkem královny, která poté odletí daleko od hnízda pářit se s trubci. Během jednoho typického svatebního letu se královna spáří se sedmi až dvaceti trubci [11]. Při každém páření je semenný váček (spermatheca) královny obohacen o vzorek spermatu trubce. Takto se vytváří soubor dědičných informací pro nově vznikající kolonii. Pro oplodnění každého vajíčka, které královna
2 / 59
naklade, je náhodně vybrána směs spermatu z královnina semenného váčku [11]. Z vajíček se líhnou larvy, o které pak pečují dělnice. Všechny trubci během zimy umírají, ať už se předtím s královnou spářili, či nikoli.
2.3 Optimalizační algoritmus inspirovaný pářením včel Optimalizační algoritmus inspirovaný pářením včel (Honey bees mating optimization, dále jen HBMO) navrhl H. A. Abbass v roce 2001 a aplikoval jej na problém splnitelnosti booleovských formulí [6]. Nejprve si jeho princip vysvětlíme stručně, detailům se budeme věnovat dále v této kapitole. V algoritmu vystupují královny (queens), jako hlavní nositelky dědičné informace. Dědičná informace neboli genotyp představuje jedno z řešení optimalizačního problému. Způsob, jakým je řešení do genotypu zakódováno, nazýváme reprezentace a závisí na typu optimalizačního problému. Kvalitu nalezeného řešení nazýváme zdatnost (fitness). Čím je lepší řešení, tím vyšší je zdatnost. Způsob výpočtu zdatnosti je rovněž specifický pro každý optimalizační problém. Algoritmus modeluje svatební let královny jako sled diskrétních událostí, při kterých se královna setkává s trubci (drones). Zda se královna s trubcem spáří, záleží na zdatnosti jeho genotypu. Genotyp trubce je v každém kroku královny určitým způsobem vygenerován (konkrétní mechanizmus jeho generování se liší v závislosti na řešeném problému). Pokud má genotyp trubce dostatečně vysokou zdatnost, královna se s trubcem spáří. Při spáření se genotyp trubce přidá do semenného váčku (dále jen spermatéky) královny. Po dokončení svatebního letu královna klade vajíčka, z nichž se líhnou larvy (broods). Oplodněné vajíčko vznikne zkřížením genotypu královny a náhodně vybraného genotypu trubce obsaženého v královnině spermatéce. O plod se starají dělnice (workers). Úloha dělnic je na rozdíl od reálného včelího roje pro účely algoritmu omezena pouze na péči o plod. Dělnice zde nenese žádnou dědičnou informaci. Každá dělnice představuje jeden algoritmus, který se pomocí lokálního prohledávání snaží vylepšit nové řešení. Pravděpodobnost, že bude dělnice vybrána pro vylepšování, je dána její zdatností. Vyšší šanci má zdatnější dělnice. Zdatnost dělnice je dána jejími minulými úspěchy při vylepšování řešení. Při každém vylepšení potomka se zdatnost dělnice zvýší a tím se i zvýší pravděpodobnost, že bude příště vybrána pro další vylepšování. Pokud je některé nové řešení lepší než královna, stává se z něj nová královna a stará královna je odstraněna. Celý cyklus se opakuje dalším svatebním letem královen. Zjednodušené schéma algoritmu je na obrázku 2.1. Nyní probereme jednotlivé části algoritmu podrobněji. Celý algoritmus v pseudokódu je uveden na straně 6.
3 / 59
algoritmus
přírodní proces
start
náhodně vygeneruj určitý počet počátečních řešení
každé řešení je vylepšeno náhodně vybranou dělnicí (lokálním prohledáváním)
počáteční utvoření hnízda řešení jsou porovnána a nejlepší z nich jsou vybrány jako královny
Každá královna se pohybuje prostorem řešení. V každém kroku královna potkává trubce. Pokud je trubec dostatečně zdatný, jeho genotyp je přidán do spermatéky královny
královna vyletí z hnízda na svatební let a páří se s trubci
Genotypy trubců v královnině spermatéce se zkříží s genotypem královny. Tím jsou vygenerováni noví potomci
královna klade vajíčka
Dělnice se snaží vylepšit nové potomky pomocí lokálního prohledávání
dělnice pečují o plod a krmí plod mateří kašičkou
Královny, které jsou méně zdatné než nejlepší noví jedinci, jsou novými jedinci nahrazeny
méně zdatná královna je vytlačena z úlu zdatnější královnou
NE
byla dosažena koncová podmínka
ANO
konec
Obr. 2.1 Diagram algoritmu optimalizace pářením včelí královny
2.3.1 Inicializace Na počátku jsou inicializovány dělnice. Zdatnost každé z nich je inicializována na hodnotu 1. Poté je náhodně vygenerována populace nových jedinců. Každý jedinec představuje jedno náhodně inicializované řešení. Počet jedinců je dán parametrem algoritmu „počet nových jedinců“. Genotyp každého z nich je posléze vylepšen náhodně zvolenou dělnicí. Nejlepší jedinci se poté stanou 4 / 59
královnami. Počet královen je dalším parametrem algoritmu. Větší počet královen by měl zajistit větší diverzitu populace, může však zpomalit rychlost konvergence k nejlepšímu řešení.
2.3.2 Svatební let Na počátku každé iterace HBMO algoritmu provedou všechny královny nezávisle na sobě svůj svatební let (mating flight). Svatební let je reprezentován jako sled pohybů královny stavovým prostorem. Po každém kroku svatebního se královna setká s trubcem. Pokud je zdatnost trubce dostatečná, královna se s ním spáří. Tím se genetická informace trubce přidá do královnina semenného váčku (spermatéky). Průběh svatebního letu se podobá činnosti algoritmu simulované žíhání (simulated annealing) [12]. Na počátku letu jsou inicializovány proměnné: rychlost a energie královny. Jejich počáteční hodnoty závisí na řešené úloze. V Abbassově článku [6] je navrženo na počátku každého letu vygenerovat počáteční hodnoty obou proměnných náhodně z rovnoměrného rozdělení v intervalu . Proměnná je obdoba teploty v simulovaném žíhání. Ovlivňuje velikost skoku ve stavovém prostoru a pravděpodobnost přijmutí trubce k páření. Maximální počet kroků svatebního letu je omezen energií královny, která se po každém kroku o trochu sníží. Let je ukončen poté, co energie klesne pod prahovou hodnotu nebo pokud je spermatéka již plná. Velikost spermatéky je nastavena vstupním parametrem . Genotyp trubce je vygenerován na základě aktuální polohy královny ve stavovém prostoru. Královna se spáří s trubcem s pravděpodobností , která je vypočtena podle akceptační podmínky (6.9). (2.1) Pokud je zdatnost trubce vyšší než zdatnost královny, trubec se s královnou spáří vždy. Pokud je zdatnost trubce nižší, pak je pravděpodobnost páření královny s trubcem dána funkcí pravděpodobnosti závisející na aktuální rychlosti královny a na rozdílu zdatností královny a trubce. Pravděpodobnost páření je vysoká při vysoké rychlosti královny. S klesající rychlostí pak pravděpodobnost klesá. Během pohybu stavovým prostorem klesá rychlost
královny podle vztahu (2.2)
kde koeficient je vstupním parametrem algoritmu. Vztah (2.2) odpovídá tzv. plánu ochlazování (cooling schedule) z algoritmu simulovaného žíhání. Energie královny se v každém kroku snižuje o podle
,
(2.3) (2.4)
Pářením se rozumí to, že se královnina aktuální pozice ve stavovém prostoru zakóduje do chromozomu a chromozom se přidá do její spermatéky. Velikost spermatéky je omezená vstupním parametrem algoritmu. Svatební let končí ve chvíli, kdy energie královny klesne pod určitou prahovou hodnotu nebo je její spermatéka plná.
5 / 59
,
algoritmus HBMO (
,
, )
inicializuj dělnice W, každou s unikátní heuristikou a počáteční zdatností inicializuj seznam královen Q for q = 1 .. BroodSize do náhodně vygeneruj genotyp nové královny q pomocí náhodně vybrané dělnice w vylepši genotyp q přidej jedince q do Q end for prvních nejlepších královen z zdatnost všech dělnic se zvýší o tolik o kolik dělnice zvýšila zdatnost potomků while not UkončovacíPodmínka do for each pro každou královnu z Q do Random //Random je rovnoměrné náhodné rozdělení Random
while
and spermatéka není plná do
vygeneruj trubce ohodnoť zdatnost trubce if Random then //viz (2.1) přidej jeho genotyp do královniny spermatéky end if end while end for each for b = 1 .. BroodSize do vyber královnu q z Q pomocí ruletového kola (velikost slotu ~ zdatnost) náhodně vyber genotyp d ze spermatéky královny q vygeneruj potomka b pomocí zkřížení genotypu d a královny q vyber dělnici w ze seznamu dělnic W pomocí ruletového kola //(velikost slotu rulety ~ zdatnost)
dělnice w se pokusí vylepšit potomka b pomocí lokálního prohledávání end for zdatnost všech dělnic se zvýší o tolik o kolik dělnice zvýšila zdatnost potomků while nejlepší potomek je lepší než nejhorší královna do nahraď nejméně zdatnou královnu nejlepším potomkem odstraň nejlepšího potomka ze seznamu potomků end while end while
2.3.3 Křížení a nová populace Po dokončení svatebních letů všech královen nakladou královny vajíčka, ze kterých se líhnou larvy. Z larev vznikne nová populace včel. Počet larev je určen vstupním parametrem . Každý nový jedinec je vytvořen tak, že je nejprve vybrána jedna z královen pomocí ruletového kola (roulette wheel selection), kde velikost slotu je úměrná zdatnosti královny. Výběr pomocí ruletového kola udává pravděpodobnost výběru jedince podle jeho zdatnosti podle (6.9). Takto je zaručeno, že i nejhorší jedinec má šanci být vybrán. 6 / 59
(2.5)
Z její spermatéky je pak náhodně vybrán genotyp některého trubce, který se předtím s královnou spářil. Nové řešení je vytvořeno zkřížením genotypu královny a trubce pomocí operátoru křížení, který je specifický pro řešený problém. Příklad jednoduchého operátoru křížení pro problém s binární reprezentací je uveden na obrázku (odkaz). Křížení probíhá tak, že každý bit potomka je s padesátiprocentní pravděpodobností převzat buď z genotypu královny, nebo z genotypu trubce. genotyp královny
1
0
0
1
0
1
0
1
1
0
X genotyp trubce
1
0
1
1
1
1
1
0
1
1
genotyp potomka
1
0
0
1
0
1
1
0
1
1
Obr. 2.2 Princip jednoduchého operátoru křížení pro binární reprezentaci
2.3.4 Vylepšení populace pomocí dělnic Pro účely optimalizačního algoritmu je funkce dělnic, na rozdíl od skutečné včelí kolonie, omezena pouze na péči o larvy. Dělnice je algoritmem reprezentována jako heuristika, která vylepšuje nově nalezená řešení (larvy) opakovaným spouštěním algoritmu lokálního prohledávání. Každá dělnice provádí jinou operaci. Pokud se dělnici podaří jedince vylepšit, je její zdatnost zvýšena. Zdatnost dělnic se kumuluje po celou dobu běhu algoritmu. Pro vylepšení každého jedince je vždy náhodně vybrána jedna dělnice, přičemž pravděpodobnost výběru konkrétní dělnice je přímo úměrná její zdatnosti. Výběr je prováděn pomocí ruletového kola, kde šířka slotu přímo odpovídá zdatnosti dělnice. Dělnice, která je více úspěšná při vylepšování potomků, má tak vyšší šanci být vybrána i příště. Algoritmus se tak částečně adaptuje na vlastnost řešeného optimalizačního problému. Podle [6] je zdatnost dělnice zvýšena jednoduše o rozdíl zdatnosti vylepšovaného jedince před a po vylepšení podle (2.6) kde
je zdatnost dělnice a
je rozdíl mezi zdatností řešení před a po vylepšení.
Tento přístup vedl u některých problémů k velkému nárůstu zdatnosti v počátečních fázích optimalizace. Pokud by například při prvním točení ruletového kola byla náhodně vybrána dělnice, které se podařilo dosáhnout velkého zlepšení, získala by velmi vysokou zdatnost. Při příštím točení rulety by již šance ostatních dělnic byly velmi malé. Poprvé vylosovaná dělnice však zdaleka nemusela být tou skutečně nejlepší. Například u problému obchodního cestujícího lze dosáhnout zlepšení z počátku velmi snadno, avšak pro řešení blízké optimu je to již velmi obtížné. Dělnice, která by mohla dosahovat výrazného pokroku v pozdější fázi, kdy je hledání optima obtížné, by tak vůbec nemusela dostat šanci. Zvyšování zdatnosti jsme vzhledem k výše popsanému problému upravili na (2.7)
7 / 59
kde je celkový počet participujících dělnic. Maximální zvýšení zdatnosti dělnice je takto shora omezen zdatností nejméně zdatné dělnice. Oproti původní implementaci je zdatnost dělnic zvyšována nikoli okamžitě po vylepšení řešení, ale až poté, co je vylepšen genotyp posledního jedince v celé populaci. Tím je dosaženo dalšího snížení pravděpodobnosti prudkého růstu zdatnosti jedné z dělnic na počátku optimalizace.
2.3.5 Nahrazení královny Na konci cyklu je nejméně zdatná královna nahrazena nejlepším nalezeným řešením, které je pak odstraněno ze seznamu řešení. Nahrazování se opakuje tak dlouho, dokud v seznamu nových jedinců není nikdo zdatnější než některá z královen. Celá populace kromě královen je poté odstraněna a algoritmus pokračuje dalšími svatebními lety přeživších královen.
2.3.6 Implementace algoritmu pro řešení konkrétního problému Pro konkrétní optimalizační problém je potřeba zvolit vhodnou reprezentaci (způsob zakódování řešení do genotypu) a metodu výpočtu zdatnosti konkrétního řešení. Dále je třeba zvolit operátor křížení, heuristiky lokálního prohledávání (dělnice) a nastavit vstupní parametry. Tyto již dříve uvedené parametry jsou: počet královen (QueensCount), velikost spermatéky (SpermathecaSize), počet nových jedinců (BroodSize) a koeficient snižování rychlosti královny .
8 / 59
3. Metodika testování Optimalizační algoritmus obvykle během své činnosti konverguje směrem k lokálnímu optimu. Konvergence se může zastavit předčasně v lokálním optimu. Pro porovnávání úspěšnosti různých algoritmů při řešení jednoho problému budeme porovnávat jejich nejlepší dosažená řešení v závislosti na počtu vyhodnocení účelové funkce. V mnoha článcích o heuristických algoritmech se uvádí nejlepší řešení nalezené za určitou dobu běhu algoritmu. Čas běhu algoritmu však silně ovlivňuje mnoho faktorů jako hardware, na kterém experiment běží, jazyk, ve kterém byl algoritmus implementován, a detaily vlastní implementace. Z tohoto důvodu je téměř nemožné, aby někdo jiný experiment zopakoval a získal obdobné výsledky. Abychom tomuto problému předešli, soustředili jsme se na měření počtu vyhodnocení účelové funkce, což je atribut invariantní vůči implementačním detailům. Vlastností všech heuristických algoritmů je, že jejich konkrétní běh je silně ovlivněn náhodou. Abychom potlačili vliv náhody na výsledky, opakovali jsme každý experiment padesátkrát za sebou se stejnými parametry. Při posuzování výsledků se budeme primárně soustředit na nejlepší a nejhorší běh a na medián z těchto padesáti běhů.
9 / 59
4. Aplikace na problém splnitelnosti booleovských klauzulí První aplikace algoritmu HBMO byla provedena Husseinem Abbassem na problému 3-SAT roku 2001 [6]. Pokusili jsme se algoritmus implementovat znovu, provést experimenty a výsledky porovnat s původní implementací. Problém splnitelnosti booleovských klausulí (boolean satisfiability problem, zkráceně SAT) spočívá v rozhodnutí, zda mohou být do výrokové formule dosazeny takové hodnoty, aby tato formule byla vyhodnocena jako pravdivá. Podmnožinou SAT problémů je problém 3-SAT, u kterého jsou všechny klausule zapsány v konjunktivní normální formě (conjunctive normal form – CNF) a všechny klausule obsahují právě 3 literály. Pro 3-SAT problém bylo dokázáno Stephenem Cookem, že je NP-úplný (NPcomplete) [13]. Problém nejlépe vysvětlíme na jednoduchém příkladu. Nechť máme 3-SAT problém o 4 proměnných a 6 klausulích. Nalezení řešení takového problému je snadné. Existuje několik řešení. Jedním takovým řešením je například . Obtížnost řešení 3-SAT problému závisí na fenoménu zvaném fázový přechod (phase transition) [13]. Fázový přechod je definován poměrem mezi počtem klausulí (omezujících podmínek) a počtu proměnných . Nalezení řešení pro problémy před fázovým přechodem je snadné, problémy za fázovým přechodem jsou většinou nesplnitelné. Těžké SAT problémy se nacházejí kolem oblasti fázového přechodu. Poměr byl pro problém s literály v jedné klausuli stanoven na [14]: (4.1) Pro 3-SAT problém bylo experimentálně zjištěno, že jeho fázový přechod nastává při poměru klausulí na jeden literál [15]. Existují dva přístupy k řešení problému splnitelnosti: úplné a neúplné. První typ používá úplné prohledávání a garantuje nalezení řešení, pokud takové řešení existuje. Takové postupy však mohou být použity pouze na malé problémy, neboť čas potřebný pro úplné prohledání roste s velikostí problému exponenciálně. Druhý typ naopak negarantuje nalezení řešení, ale je rychlý a vhodný pro rozsáhlé problémy.
4.2 Implementace HBMO pro 3-SAT Při implementaci HBMO algoritmu řešící 3-SAT problém jsme se snažili co nejvíce přiblížit k původní implementaci popsané v článku [6]. V této kapitole postupně probereme, jakým způsobem je v algoritmu reprezentováno řešení, jak se počítá jeho zdatnost a jak pracují operátory křížení a lokálního prohledávání.
4.2.1 Reprezentace a výpočet zdatnosti Genotyp jedince je reprezentován polem binárních hodnot o délce rovné počtu proměnných obsažených v problému. Zdatnost genotypu je počítána jako poměr počtu splněných klausulí k celkovému počtu klausulí. 10 / 59
č ý
ě ý č
í í
é
(4.2)
4.2.2 Svatební let V každém hlavním cyklu algoritmu provede nejprve každá královna svůj svatební let. Rychlost a energie královny je inicializována před začátkem svatebního letu náhodně v intervalu . Na počátku letu je také náhodně vygenerován genotyp trubce. Pohyb královny prostorem řešení je uskutečňován po krocích a je dán rychlostí, která udává pravděpodobnost prohození každého bitu v genotypu trubce v každém kroku. Po uskutečnění kroku je vyhodnocena zdatnost trubce a královna se s trubcem s pravděpodobností spočtenou podle (6.9) spáří. Spářením se genotyp trubce přidá do semenného váčku královny. Let končí, jakmile je královnin semenný váček plný (jeho maximální velikost je dána vstupním parametrem ), nebo pokud energie královny klesne pod prahovou hodnotu, kterou jsme stanovili na . Po skončení svatebních letů všech královen je vygenerován určitý počet potomků (počet je definován vstupním parametrem ). Pro vygenerování potomka je nejprve vybrána jedna z královen na základě její zdatnosti. Výběr probíhá pomocí ruletového kola (roulette wheel selection), jehož každý slot proporcionálně odpovídá zdatnosti královny. Ze spermatéky vybrané královny je náhodně vybrán jeden genotyp, který je následně zkřížen s genotypem královny a utvoří tak nového jedince.
4.2.3 Operátor křížení Přesný způsob křížení není v původní Abbassově práci popsán zcela jednoznačně. Jisté je, že je taktéž inspirovaný přírodou, kde reální trubci jsou vždy haploidní a potomek vždy obsahuje rovný podíl genomu trubce a královny. Operátor křížení jsme implementovali tak, že každý bit genotypu potomka je převzat vždy s padesátiprocentní pravděpodobností z genotypu královny nebo trubce. Poloha bitu je vždy zachována. Jedná se tedy o nejjednodušší možný binární operátor křížení, jehož činnost je znázorněna na obrázku 2.2.
4.2.4 Dělnice Dělnice se pokoušejí vylepšovat nově narozené jedince lokálním prohledáváním. Každá dělnice představuje jeden algoritmus lokálního prohledávání. V naší implementaci bylo těchto algoritmů použito celkem pět. Jsou to WalkSAT, náhodná procházka (RandomWalk), náhodné prohození (RandomFlip), náhodný nový (RandomNew) a jednobodové křížení (1PointCrossover). Heuristika náhodné prohození při každém pokusu neguje hodnotu náhodně vybrané proměnné. Heuristika náhodný nový vymění genotyp potomka za nový náhodně vygenerovaný genotyp. Jednobodové křížení zkříží v náhodně vybraném bodě genotyp potomka s náhodně vygenerovaným genotypem. Křížení probíhá stejným způsobem, jako křížení genotypu královny a trubce popsané výše. Náhodná procházka náhodně vybere v každém kroku jednu nesplněnou klauzuli a zneguje jednu (náhodně vybranou) proměnnou, kterou vybraná klausule obsahuje. Algoritmus WalkSAT je popsán v následujícím odstavci.
11 / 59
algoritmus HBMO-SAT( , , , ) inicializuj dělnice W, každou s unikátní heuristikou a počáteční zdatností inicializuj seznam královen Q for q = 1 .. BroodSize do náhodně vygeneruj genotyp nové královny q pomocí náhodně vybrané dělnice w vylepši genotyp q přidej jedince q do Q end for prvních nejlepších královen z zdatnost všech dělnic se zvýší o tolik o kolik dělnice zvýšila zdatnost potomků while not UkončovacíPodmínka do for each pro každou královnu z Q do Random //Random je rovnoměrné náhodné rozdělení Random / vygeneruj náhodný genotyp trubce D while
and spermatéka není plná do změň každý bit genotypu trubce d s pravděpodobností p ohodnoť zdatnost trubce d if Random then //viz (2.1) přidej jeho genotyp do královniny spermatéky end if
rychlost
end while end for each for i = 1 .. počet nových potomků do vyber královnu q z Q pomocí ruletového kola (velikost slotu ~ zdatnost) náhodně vyber genotyp d ze spermatéky královny q vygeneruj potomka b pomocí zkřížení genotypu d a královny q vyber dělnici w ze seznamu dělnic W pomocí ruletového kola // (velikost slotu rulety ~ zdatnost)
dělnice w se pokusí vylepšit potomka b pomocí lokálního prohledávání zdatnost dělnice w se zvýší o hodnotu o kterou dělnice zvýšila zdatnost b end for zdatnost všech dělnic se zvýší o tolik o kolik dělnice zvýšila zdatnost potomků while nejlepší potomek je lepší než nejhorší královna do nahraď nejméně zdatnou královnu nejlepším potomkem odstraň nejlepšího potomka ze seznamu potomků end while end while
4.3 Algoritmus WalkSAT Algoritmus WalkSAT řeší SAT problém metodou lokálního prohledávání. Algoritmus pracuje tak, že v každém cyklu vybere náhodně jednu nesplněnou klausuli a znegováním jedné její proměnné zajistí její splnění. Existuje mnoho variant tohoto algoritmu lišící se strategií výběru proměnné. Převzali jsme implementaci uvedenou v literatuře [16]. Algoritmus používá vstupní parametr „pravděpodobnost náhodné procházky“. Jeho hodnotu jsme nastavili na . 12 / 59
Algoritmus je v pseudokódu níže. Při použití algoritmu jako lokálního prohledávání prováděného dělnicí je algoritmus lehce upravuje tak, že počáteční řešení není generováno náhodně, ale je to nový jedinec, který má být dělnicí vylepšen. algoritmus WalkSAT(pravděpodobnostNáhodnéProcházky, početIterací)
ohodnocení
GenerujNáhodnéOhodnocení
for
č í do náhodně vyber jednu nesplněnou klausuli z ohodnocení if Random(0,1) < pravděpodobnostNáhodnéProcházky then neguj náhodně vybranou proměnnou vybrané klausule else neguj tu proměnnou vybrané klausule která vyústí v minimální počet nesplněných klausulí end if end for
4.4 Výsledky Pokusili jsme se zopakovat experimentální výsledky z článku [6]. Bylo rovnoměrně vygenerováno 50 různých 3-SAT problémů. Fázový přechod pro 3-SAT nastává okolo poměru 4,3 mezi počtem klausulí a počtem proměnných. Všechny generované problémy měly 50 proměnných a 215 klausulí. Nacházely se tak v oblasti fázového přechodu. Všechny problémy jsou tím pádem těžké a není u nich zaručeno, zda existuje jejich řešení. Experimentovali jsme s různými konfiguracemi parametrů podobně jako H. Abbass [6]. Díky tomu pak bylo možné naše výsledky porovnat s původními. Jako počet královen ( ) byly voleny hodnoty 1 a 5. Jako velikost spermatéky ( ) jsme volili hodnoty 7, 14, 21 a 40. Jako počet nových jedinců v každé generaci ( ) byly voleny hodnoty 30, 60 a 90. Po vytvoření potomka provedla vybraná dělnice vždy 100 pokusů o jeho vylepšení. Počet svatebních letů nebyl omezen. Omezen byl pouze maximální počet vyhodnocení klauzulí a to na hodnotu 120 000. Koeficient úbytku rychlosti královny během letu ( ) byl zvolen na hodnotu 0,9. Algoritmus byl spuštěn desetkrát na každý z padesáti vygenerovaných problémů. Úspěšnost algoritmu je měřena vždy jako průměrný počet problémů, pro které bylo nalezeno přípustné ohodnocení formulí, z celkového počtu padesáti vygenerovaných problémů. Vzájemné srovnávání bylo vždy prováděno na základě dosaženého výsledku po dosažení určitého počtu vyhodnocení.
13 / 59
30,0
3SAT problém - 1 královna BroodSize=30, SpermathecaSize=7,
Počet vyřešených problémů (z celkem 50ti)
25,0
BroodSize=60, SpermathecaSize=7, BroodSize=90, SpermathecaSize=7,
20,0
BroodSize=30, SpermathecaSize=14,
15,0
BroodSize=60, SpermathecaSize=14, BroodSize=90, SpermathecaSize=14,
10,0
BroodSize=30, SpermathecaSize=21, 5,0
BroodSize=60, SpermathecaSize=21, BroodSize=90, SpermathecaSize=21, 0 6000 12000 18000 24000 30000 36000 42000 48000 54000 60000 66000 72000 78000 84000 90000 96000 102000 108000 114000 120000
0,0
BroodSize=30, SpermathecaSize=40,
Počet vyhodnocení klausulí Obr. 4.1 Porovnání výkonů s různými parametry HBMO-SAT 1 královna 30,0
3SAT problém - 5 královen BroodSize=30, SpermathecaSize=7,
Počet vyřešených problémů (z celkem 50ti)
25,0
BroodSize=60, SpermathecaSize=7, BroodSize=90, SpermathecaSize=7,
20,0
BroodSize=30, SpermathecaSize=14,
15,0
BroodSize=60, SpermathecaSize=14, BroodSize=90, SpermathecaSize=14,
10,0
BroodSize=30, SpermathecaSize=21, 5,0
BroodSize=60, SpermathecaSize=21, BroodSize=90, SpermathecaSize=21, 0 6000 12000 18000 24000 30000 36000 42000 48000 54000 60000 66000 72000 78000 84000 90000 96000 102000 108000 114000 120000
0,0
Počet vyhodnocení klausulí Obr. 4.2 Porovnání výkonů s různými parametry HBMO-SAT 5 královen
14 / 59
BroodSize=30, SpermathecaSize=40,
Z grafů 4.1 a 4.2 je patrné, že nastavení parametrů , ani nemá na chování algoritmu velký vliv. Rychlost konvergence je přibližně stejná a velmi podobný je i počet vyřešených problémů po provedení 120 000 vyhodnocení klausulí (viz. tabulka 4.1). Počet vyřešených problémů se ve všech případech blížil hodnotě 24. Je tedy velmi pravděpodobné, že právě 24 vygenerovaných SAT problémů má řešení z celkových 50. Tabulka 4.1 Počet nalezených řešení pro různé kombinace parametrů
Velikost semenného váčku
7
Počet nových jedinců
20
7
7
14
14
14
21
21
21
40
40
40
60 100
20
60 100
20
60 100
20
60 100
Počet řešeních - 1 královna 24,0 23,9 23,8 23,9 23,7 24,0 23,8 23,9 23,9 23,9 23,8 23,8 Počet řešeních - 5 královen 24,0 24,0 24,0 24,0 24,0 24,0 24,0 24,0 24,0 24,0 24,0 24,0
Pro další experimenty a srovnávání byla vybrána konfigurace s těmito parametry: ,
,
,
Tato kombinace byla vybrána z toho důvodu, že s ní algoritmus dosáhl 24 vyřešených problémů za nejnižším počtem vyhodnocení klausulí. Zajímavým výsledkem je výsledná zdatnost dělnic po ukončení algoritmu. Ta určuje, nakolik se které heuristice lokálního prohledávání dařilo vylepšovat vygenerovaná řešení. Tabulka 4.2 Porovnání výkonů různých dělnic
Název heuristiky lokálního prohledávání Zdatnost po ukončení algoritmu RandomFlip RandomNew RandomWalk WalkSat 1PointCrossover Z tabulky 4.2 je patrné, že nejúspěšnějšími dělnicemi byly heuristiky WakSAT a RandomWalk. Zkusili jsme tedy porovnat výsledky těchto dvou algoritmů s HBMO. Oba algoritmy byly spuštěny na náhodně vygenerované řešení a provedly 100 mutací. Poté byl algoritmus restartován a proces se opakoval. Vždy bylo zaznamenáno nejlepší nalezené řešení. Porovnání algoritmů je patrné na grafu 4.3. Z grafu je patrné, že množinu 3-SAT problémů s 50 proměnnými a 215 klausulemi řeší všechny tři algoritmy stejně úspěšně.
15 / 59
Počet vyřešených problémů (z celkem 50ti)
30
Průměrný počet nalezených řešení pro 50 různých 3SAT problémůs 50 proměnnými a 215 klausulemi
25
20 HBMO
15
WalkSAT 10 Random Walk 5
0 8000 16000 24000 32000 40000 48000 56000 64000 72000 80000 88000 96000 104000 112000 120000 128000 136000 144000 152000 160000 168000 176000 184000 192000 200000 208000 216000 224000 232000 240000 248000
0
Počet vyhodnocení klausulí
Obr. 4.3 Porovnání HBMO-SAT s WalkSAT a RandomWalk pro 500 3-SAT problémů s 50 proměnnými a 215 klausulemi
Pokusili jsme se porovnat naše výsledky s výsledky dosaženými H. Abbassem [6]. Porovnávali jsme průměrný počet problémů, pro které bylo nalezeno přípustné řešení, po provedení 120 000 různých ohodnoceních. Průměrný počet nalezených řešení z celkem 50 problémů je v tabulce 4.3. Aby byly výsledky porovnatelné, byly hodnoty zprůměrovány pro všechny testované velikosti spermatéky stejně jako je tomu v původní práci. Z tabulky 4.3 je patrné, že námi dosažené výsledky jsou výrazně lepší. Porovnání výkonů HBMO algoritmu s WalkSATem v článku [6] dopadlo také výrazně odlišně. V článku se uvádí, že WalkSAT nenalezl ani jedno přípustné řešení pro ani jeden problém. To neodpovídá našim závěrům, kdy samotný algoritmus WalkSAT fungoval pro problém s 50 proměnnými stejně dobře, jako HBMO. Příčinou by mohla být odlišná implementace algoritmu WalkSAT. Pokud by implementace WalkSAT použitá v článku [6] obsahovala chybu, negativně by to ovlivnilo jak výsledky samotného restartovaného algoritmu WalkSAT, tak výsledky HBMO algoritmu, v němž WalkSAT je používán jako heuristika lokálního prohledávání. Tabulka 4.3 Průměrné počty nalezených řešení -porovnání s Abbass MBO SAT *6]
Počet potomků 20 60 100
Naše implementace Počet královen 1 5 23,8 23,9 23,8 24,0 23,8 24,0
Abbass [6] Počet královen 1 5 2,3 2,3 5,3 1,0 4,3 0,7
Zkusili jsme stejné tři algoritmy spustit na jinou množinu 50 náhodně vygenerovaných 3-SAT problémů o 100 proměnných a 430 klausulích. A jinou množinu 50 problémů o 200 proměnných 860 klausulích. Výsledky jsou vidět na grafech 4.4 (100 proměnných) a 4.5 (200) proměnných. Aby porovnání bylo férovější, restartovali jsme algoritmy WalkSAT a RandomWalk jednou po 100 cyklech a jednou po 500 cyklech. V grafech jsou výsledky označeny koncovkami „100 It“ a „500 It“. 16 / 59
Průměrný počet nalezených řešení pro 50 různých 3SAT problémůs 100 proměnnými a 430 klausulemi
Počet vyřešených problémů (z celkem 50ti)
25
20
15
HBMO WalkSAT 500 It WalkSAT 100 It
10
Random Walk 500 It Random Walk 100 It 5
0 8000 16000 24000 32000 40000 48000 56000 64000 72000 80000 88000 96000 104000 112000 120000 128000 136000 144000 152000 160000 168000 176000 184000 192000 200000 208000 216000 224000 232000 240000 248000
0
Počet vyhodnocení klausulí
Obr. 4.4 Průměrný počet nalezených řešení pro 50 různých 3-SAT problémů s 100 proměnnými a 430 klausulemi Průměrný počet nalezených řešení pro 50 různých 3SAT problémůs 200 proměnnými a 860 klausulemi 7
počet nalezených řešení
6 5 4
HBMO
3
WalkSAT 500 It
2
Random Walk 500 It 1
0 357500 715000 1072500 1430000 1787500 2145000 2502500 2860000 3217500 3575000 3932500 4290000 4647500 5005000 5362500 5720000 6077500 6435000 6792500 7150000 7507500 7865000 8222500 8580000 8937500 9295000 9652500
0
Počet vyhodnocení klausulí
Obr. 4.5 Průměrný počet nalezených řešení pro 50 různých 3-SAT problémů s 200 proměnnými a 860 klausulemi
Z grafů je patrné, že pro 3-SAT problémy s 50 proměnnými fungují všechny tři porovnávané algoritmy stejně dobře. U problémů se 100 proměnnými je již náhodná procházka, která restartuje po 100 iteracích v nevýhodě, neboť pravděpodobnost nalezení řešení během 100 negování proměnné je malá. Lokální prohledávání restartující až po 500 iteracích však funguje obstojně.
17 / 59
U problémů s 200 proměnnými již algoritmy WalkSAT a RandomWalk konvergovaly pomaleji než HBMO-SAT. Za povšimnutí stojí, že heuristika RandomWalk měla o trochu lepší výsledky než více informovaná heuristika WalkSAT.
18 / 59
5. Optimalizace spojitých funkcí V této kapitole se zabýváme hledáním globálního minima funkcí s reálnými parametry. Implementace algoritmu musí počítat s tím, že není znám gradient účelové funkce. Funkce musí mít omezený definiční obor, aby bylo možno vygenerovat počáteční hodnoty populace.
5.1 Implementace HBMO pro reálné funkce HBMO Algoritmus pro spojité problémy vychází z implementace HBMO pro 3-SAT problém. Na rozdíl od řešení SAT problému, kde se zdatnost jedince pohybuje v intervalu , se zdatnost jedince pro spojitou funkci pohybuje o dvacet a více řádů. Z tohoto důvodu bylo nutné implementovat určité části odlišně. Liší se samozřejmě také použité operátory lokálního prohledávání, operátor křížení a částečně se liší implementace svatebního letu.
5.1.1 Reprezentace a výpočet zdatnosti Řešení je reprezentováno jako pole čísel s plovoucí desetinnou čárkou, jehož délka se rovná počtu parametrů funkce. Každé číslo představuje jeden parametr účelové funkce. Zdatnost se počítá jako záporná hodnota z hodnoty účelové funkce. Při výběru královny podle zdatnosti se pak používá ruletové kolo vybírající nikoli přímo úměrně jeho zdatnosti, ale podle jeho pořadí. Každé řešení má na ruletě slot o velikosti
, kde
označuje pořadí daného řešení (číslováno od 0), pokud jsou všechna
řešení, ze kterých se provádí výběr, setříděna podle své zdatnosti od nejlepšího k nejhoršímu.
5.1.2 Svatební let Původní implementace, ve které se genotyp trubce generuje před počátkem letu zcela náhodně, nedávala uspokojivé výsledky, neboť byla velmi malá pravděpodobnost, že královna narazí na alespoň trochu zdatného trubce, se kterým by se mohla spářit. Na základě tohoto poznatku jsme algoritmus modifikovali tak, že před počátkem letu se genotyp trubce vygeneruje prostým zkopírováním genotypu náhodně vybrané královny. V každém kroku letu je genotyp trubce zmutován přičtením hodnoty k jeho jedné náhodně vybrané proměnné . Hodnota je spočtena podle vztahu (5.1) kde je nová proměnná královny. Ta je při vzniku královny inicializována parametrem . Během letu se mění v každém kroku v závislosti na tom, zda se královna v tomto kroku spářila či nikoli. Pokud se spářila, hodnota se zčtyřnásobí. Pokud ne, hodnota se vydělí dvěma. V kroku, ve kterém se královna nespáří, je genotyp trubce vygenerován znovu zkopírováním genotypu náhodně vybrané královny. Genotyp trubců je tak více podobný genotypu královen, čímž potenciálně hrozí ztráta diverzity populace. Při experimentech se však ukázalo, že tento problém na vybraných účelových funkcích nenastává. Podmínku páření bylo potřeba také upravit vzhledem k velkým rozsahům zdatností jedinců. Pokud by například královna měla zdatnost a trubec zdatnost , byl by absolutní rozdíl zdatností sice malý a podle (2.1) by nejspíše ke spáření došlo, přitom relativní rozdíl obou zdatností je devět řádů, což je velmi mnoho. Z tohoto důvodu jsme kritérium páření královny s trubcem upravili na
19 / 59
(5.2) Rozdíl zdatností je navíc vydělen zdatností královny, čímž se problém s velkým rozsahem zdatností vyřeší.
5.1.3 Operátor křížení Pro generování potomků se používá operátor křížení, který hodnotu každé proměnné potomka vypočte jako vážený aritmetický průměr proměnných se stejným indexem z obou jeho rodičů podle (5.3) kde je i-tá proměnná prvního rodiče, je i-tá proměnná druhého rodiče a vygenerovaná hodnota z rovnoměrného rozdělení.
U
je náhodně
5.1.4 Dělnice Dělnice jsou reprezentovány dvěma algoritmy lokálního prohledávání. První dělnicí je Rosenbrockův algoritmus [17] [18], který je podrobně popsán dále v textu. Druhou dělnicí je algoritmus, který se v každém svém kroku pokusí nahradit jednu hodnotu řešení novou hodnotou získanou z rovnoměrného náhodného rozdělení z celého definičního oboru účelové funkce pro daný parametr. Pokud je modifikované řešení lepší, je přijato a dále je pokračováno od tohoto řešení. Zvyšování zdatnosti dělnic na základě jejich úspěchů při vylepšování potomků bylo rovněž pozměněno. Pokud se dělnice snaží o zlepšení neúspěšně, je její zdatnost snížena o dvě procenta. (5.4) Poznamenejme, že zlepšení.
je celkový počet dělnic a
je rozdíl zdatnosti řešení před a po pokusu o jeho
20 / 59
algoritmus HBMO-Real ( , , , inicializuj dělnice W, každou s unikátní heuristikou a počáteční zdatností inicializuj seznam královen Q
)
for q = 1 .. do náhodně vygeneruj genotyp královny q pomocí náhodně vybrané dělnice w vylepši genotyp královny přidej královnu q do Q end for prvních nejlepších královen z zdatnost všech dělnic se zvýší o tolik o kolik dělnice zvýšila zdatnost potomků while not UkončovacíPodmínka do for each pro každou královnu z Q do Random //Random je rovnoměrné náhodné rozdělení Random / vytvoř trubce while
zkopírováním genotypu náhodně vybrané královny
and spermatéka není plná do Random Random //mutace i-té proměnné trubce ohodnoť zdatnost trubce if Random then //viz (5.2) přidej genotyp trubce do královniny spermatéky else resetuj genotyp trubce zkopírováním genotypu náhodně vybrané královny end if
end while end for each for do vyber královnu q z Q pomocí ruletového kola (velikost slotu ~ pořadí náhodně vyber genotyp d ze spermatéky královny q vygeneruj potomka pomocí zkřížení genotypu d a královny q podle (5.1) vyber dělnici w ze seznamu dělnic W pomocí ruletového kola (velikost slotu ~ zdatnost) dělnice w se pokusí vylepšit potomka b pomocí lokálního prohledávání end for zdatnost všech dělnic se zvýší o tolik o kolik dělnice zvýšila zdatnost potomků while nejlepší potomek je lepší než nejhorší královna do nahraď nejméně zdatnou královnu nejlepším potomkem odstraň nejlepšího potomka ze seznamu potomků end while end while
21 / 59
5.2 Rosenbrockův algoritmus Rosenbrockův algoritmus [17] je klasický algoritmus pro lokální prohledávání, který si zachovává nejlepší doposud nalezené řešení a prohledává jeho okolí. Jeho výhodou je, že se automaticky adaptuje na okolí bodu prohledávání – dynamicky mění velikost kroku a směr prohledávání. Pro prostor prohledávání s dimenzí se model okolí sestává z vektorů , které tvoří ortonormální bázi a multiplikátorů , které určují velikost kroku. V každé iteraci provede algoritmus sérii pokusů o nalezení lepšího řešení ve směrech vektorů ortonormální báze. Pokud je v jednom směru nalezeno, v příští iteraci se pro tento směr zvětší velikost kroku dle parametru . Pokud lepší řešení není nalezeno, bude v příštím kroku hledáno řešení na opačné straně a velikost kroku bude pro tento vektor zmenšena podle parametru . Jakmile je v jednom směru báze zaznamenán pokrok a v opačném směru nikoli, je provedeno otočení ortonormální báze tak, aby první vektor nové báze byl rovnoběžný s vektorem mířícím od bodu, kde bylo prováděno poslední otočení báze, do bodu současného řešení. Všechny multiplikátory jsou resetovány na hodnoty 1. Pro otáčení báze je použita Gram-Smidtova ortonormalizační procedura [19]. algoritmus Rosenbrock( , ) InicializujPočátečníŘešení Inicializuj ortonormální bázi Inicializuj multiplikátory na hodnotu while not UkončovacíPodmínka for do
úspěch neúspěch if
else
do
then
úspěch neúspěch
end if end for if úspěch and neúspěch then //pokud bylo alespoň v jednom směru postup a v jiném ne OtočOrtonormálníBázi ) Inicializuj multiplikátory na hodnotu end if end while end while Algoritmus má dva parametry. Pro nastavení zvětšení kroku v jedné dimenzi slouží parametr zmenšování kroku parametr . Nastavili jsme parametry na nejobvykleji používané hodnoty podle článku [18].
, pro a
Při použití Rosenbrockova algoritmu jakožto dělnice v rámci HBMO je algoritmus mírně upraven tak, že se na jeho prvním řádku řešení neinicializuje náhodně, ale vezme se z genotypu potomka, který má být vylepšen.
22 / 59
5.3 Diferenciální evoluce Pro porovnání výsledků na reálných funkcích jsme implementovali heuristický algoritmus zvaný diferenciální evoluce (differential evolution, zkráceně DE) [20]. Jde o multiagentní optimalizační algoritmus určený pro reálné funkce. Princip činnosti algoritmu je založen na uchovávání populace řešení (agentů). Tito agenti se pohybují ve stavovém prostoru na základě jednoduchého vzorce, který kombinuje pozice ostatních agentů v populaci. Pokud je nová pozice agenta lepší než stávající pozice, je agent přesunut na tuto novou pozici. Pokud není, je nové řešení jednoduše ignorováno. Tento proces je opakován, dokud není splněna ukončovací podmínka [21]. algoritmus DE( //každý agent
, ,
)
reprezentuje řešení
Inicializuj náhodně populaci agentů podle parametru velikost populace while not UkončovacíPodmínka do for each agent v populaci do vyber náhodně tři agenty , , tak, aby , , , nebyli stejní Random ) // je náhodně zvolený index je dimenze vygeneruj nového agenta for do Random( ) //rovnoměrné rozdělení na intervalu if or then else end if end for if
then
end if end for end while Algoritmus pracuje se třemi parametry. Je to parametr diferenciální váha , pravděpodobnost křížení a velikost populace . Použili jsme parametry doporučené v pracích [20; 22]: . Tyto parametry by podle literatury [21] měly být poměrně imunní vůči tzv. problému uvíznutí. Problém uvíznutí spočívá v tom, že v každém kroku algoritmu existuje pouze omezené množství možných kandidátů na nové řešení. Pokud není možné na základě současných řešení vygenerovat žádné lepší řešení, algoritmus uvázne.
5.4 Experimenty a výsledky Vybrali jsme několik testovacích účelových funkcí z testovací množiny navržené Eibenem a Bäckem [23]. Tato množina obsahuje množství dobře definovaných funkcí, na kterých náš algoritmus otestujeme. U každé funkce hledáme její globální minimum. Všechny použité testovací funkce jsou navrženy tak, aby jejich hodnota v globálním minimu byla 0. Vzhledem k nepřesnostem, které vznikají v počítačích při výpočtech s pohyblivou desetinnou čárkou, budeme hodnoty v intervalu považovat za hodnotu 0. Účelové funkce lze charakterizovat na základě jejich vlastností jako je modalita, separabilita a pravidelnost rozmístění jejich minim. Funkce byly vybrány tak, aby byly pokryty významné kombinace těchto vlastností.
23 / 59
Funkce je multimodální, pokud má dvě nebo více lokálních minim. Hledání minima u multimodální funkce je obtížnější, neboť se algoritmus musí vypořádat s lokálními minimy a nalézt minimum globální. Funkce o parametrech je separabilní, pokud může být upravena jako suma n funkcí, kde každá funkce má jediný parametr [24]. Separabilita funkce úzce souvisí s tzv. epistází neboli vzájemnou provázaností parametrů funkce. Epistáze určuje nakolik je příspěvek jednoho genu ke zdatnosti jedince ovlivněn hodnotami v ostatních genech [24]. Optimalizace na neseparabilních funkcích je obtížnější neboť je nutné měnit hodnotu na dvou a více genech najednou. Naopak u seaparabilních funkcí je možno postupně optimalizovat každou proměnnou zvlášť, čímž se úloha podstatně zjednoduší. U neseparabilních toto možné není. Dalším důležitým faktorem je dimenze problému. Abychom zajistili porovnatelnost výsledků, budeme ve všech testech používat počet proměnných . Všechny testovací funkce mají omezený definiční obor intervalem (box constrained). Meze intervalu byly použity stejné pro všechny parametry funkce. Implementace omezení byla provedena tak, že pokud algoritmus vystoupil z daného omezení, vracela účelová funkce velmi vysoké hodnoty.
5.4.1 Konfigurace algoritmů pro srovnávací testy Porovnávali jsme výkon HBMO algoritmu s restartovaným Rosenbrockovým algoritmem a diferenciální evolucí při optimalizaci spojitých funkcí. Nejprve jsme provedli testy HBMO algoritmu s různými parametry. Na základě dosažených výsledků jsme zvolili kombinaci parametrů a tu jsme poté použili u všech funkcí. Porovnání výsledů jednotlivých parametrů je uvedeno v podkapitolách pro jednotlivé účelové funkce. Pro algoritmus HBMO jsme na základě porovnávání jeho výkonů pro různé parametry zvolili toto nastavení: ,
,
,
Parametry algoritmu diferenciální evoluce byly nastaveny na tyto hodnoty: Restartovaný Rosenbrockův algoritmus používal parametry: Rosenbrockův algoritmus je restartován pokaždé, když hodnota všech multiplikátorů klesne pod hodnotu . V tuto chvíli je již velmi pravděpodobné, že se algoritmus dostal do lokálního extrému a pokračování v činnosti by nepřineslo žádný výsledek.
5.4.2 Rozšířená Rosenbrockova funkce Tato funkce rozšiřuje původní Rosenbrockovu funkci o dvou proměnných [17] na funkci o proměnných. Rozšířená Rosenbrockova funkce je nekonvexní neseparabilní unimodální funkce používaná pro testování optimalizačních algoritmů. Globální minimum je uvnitř dlouhého úzkého a hlubokého údolí ve tvaru paraboly. Nalezení údolí je triviální, avšak nalezení globálního minima je obtížné.
(5.5)
24 / 59
Obr. 5.1: Rosenbrockova funkce 2D
Nejprve jsme porovnali výsledky HBMO algoritmu na Rosebrockově funkci s různým nastavením parametrů. Výsledky jsou zobrazeny v grafech (odkazy). Pro lepší přehlednost jsme zobrazení výsledky rozdělili do dvou grafů na základě parametru počet královen. Z grafů je patrné, že stejně jako při řešení 3-SAT problému nemá nastavení parametrů HBMO algoritmu nějak zásadní vliv na jeho efektivitu. Na základě porovnání efektivity HBMO algoritmu s různými parametry na Rosenbrockově a Ackleyho funkci (ta je popsána v odstavci 5.4.4) jsme zvolili následující konfiguraci: ,
,
,
Provedli jsme porovnání HBMO s ostatními dvěma algoritmy. Graf 5.4 porovnává rychlost konvergence.
25 / 59
1,00E+01
Porovnání efektivity při různých parametrech - Rosenbrock 10D, QueensCount=1 SpeedDecay=0,9, BroodSize=20, SpermathecaSize=10,
Nejlepší nalezené řešení
1,00E+00
SpeedDecay=0,99, BroodSize=20, SpermathecaSize=10, SpeedDecay=0,9, BroodSize=40, SpermathecaSize=10,
1,00E-01
SpeedDecay=0,99, BroodSize=40, SpermathecaSize=10, SpeedDecay=0,9, BroodSize=20, SpermathecaSize=20,
1,00E-02
SpeedDecay=0,99, BroodSize=20, SpermathecaSize=20, SpeedDecay=0,9, BroodSize=40, SpermathecaSize=20,
1,00E-03
SpeedDecay=0,99, BroodSize=40, SpermathecaSize=20, SpeedDecay=0,9, BroodSize=20, SpermathecaSize=30,
0 40000 80000 120000 160000 200000 240000 280000 320000 360000 400000 440000 480000 520000 560000 600000 640000 680000 720000 760000 800000 840000 880000 920000 960000 1000000
1,00E-04
SpeedDecay=0,99, BroodSize=20, SpermathecaSize=30,
Počet vyhodnocení účelové funkce Obr. 5.2 Porovnání efektivity HBMO-Real s různými parametry na Rosenbrock 10D, parametr QueensCount = 1 1,00E+01
Porovnání efektivity při různých parametrech - Rosenbrock 10D, QueensCount=4 SpeedDecay=0,9, BroodSize=20, SpermathecaSize=10, SpeedDecay=0,99, BroodSize=20, SpermathecaSize=10,
1,00E+00
Nejlepší nalezené řešení
SpeedDecay=0,9, BroodSize=40, SpermathecaSize=10, SpeedDecay=0,99, BroodSize=40, SpermathecaSize=10,
1,00E-01
SpeedDecay=0,9, BroodSize=20, SpermathecaSize=20, SpeedDecay=0,99, BroodSize=20, SpermathecaSize=20,
1,00E-02
SpeedDecay=0,9, BroodSize=40, SpermathecaSize=20, SpeedDecay=0,99, BroodSize=40, SpermathecaSize=20, SpeedDecay=0,9, BroodSize=20, SpermathecaSize=30,
1,00E-03
SpeedDecay=0,99, BroodSize=20, SpermathecaSize=30, SpeedDecay=0,9, BroodSize=40, SpermathecaSize=30,
0 40000 80000 120000 160000 200000 240000 280000 320000 360000 400000 440000 480000 520000 560000 600000 640000 680000 720000 760000 800000 840000 880000 920000 960000 1000000
1,00E-04
SpeedDecay=0,99, BroodSize=40, SpermathecaSize=30,
Počet vyhodnocení účelové funkce Obr. 5.3 Porovnání efektivity HBMO-Real s různými parametry na Rosenbrock 10D, parametr QueensCount = 5
26 / 59
Rosenbrock 10D HBMO medián
HBMO nejlepší
HBMO nejhorší
Rosenbrock medián
Rosenbrock nejlepší
Rosenbrock nejhorší
DE medián
DE nejhorší
DE nejhorší
1,00E+01 1,00E+00 1,00E-01
Nejlnižší nalezená hodnota
1,00E-02 1,00E-03 1,00E-04 1,00E-05 1,00E-06 1,00E-07 1,00E-08 1,00E-09 1,00E-10 1,00E-11 1,00E-12 1,00E-13
0 28600 57200 85800 114400 143000 171600 200200 228800 257400 286000 314600 343200 371800 400400 429000 457600 486200 514800 543400 572000 600600 629200 657800 686400 715000 743600 772200 800800 829400 858000 886600 915200 943800 972400
1,00E-14
Počet vyhodnocení funkce
Obr. 5.4 Porovnání rychlosti konvergence algoritmů HBMO-Real, restartovaný Rosenbrock a DE na Rosenbrockově funkci
Z grafu 5.4 je patrné, že z počátku HBMO algoritmus zpočátku konverguje rychleji než Rosenbrockův algoritmus, neboť na počátku vygeneruje mnoho řešení a některé z nich je s velkou pravděpodobností blízko globálního optima. U diferenciální evoluce nastával při každém pokusu problém uvíznutí. Nejspíš proto, že funkce není symetrická a směr její konvergence není ve směru hlavních os. Algoritmus vždy úspěšně nalezl údolí funkce, ale selhával při nalezení globálního minima. Tabulka 5.1 Nejlepší dosažené řešení na Rosenbrockově funkci po 1000000 vyhodnoceních
Median HBMO 5,01E-05 Rosenbrock 9,54E-06 DE 8,77
Min Max 6,18E-08 6,25E-04 6,16E-07 0,48E-04 8,14 8,77
V tabulce 5.1 je porovnání mediánů výsledné zdatnosti dělnic HBMO algoritmu. Není velkým překvapením, že na Rosenbrockově funkci funguje Rosenbrockův algoritmus lépe. Tabulka 5.2 Porovnání mediánů zdatnosti dělnic HBMO algoritmu po optimalizaci funkce Rosenbrock
Algoritmus dělnice OneParamRandom RosenbrockLocalSearch 27 / 59
Zdatnost 20,0 290,6
5.4.3 Rastriginova funkce Rastriginova funkce [24] vznikla sečtením sférického členu a modulátoru cos . Její kontura je tvořena množstvím lokálních minim, jejichž hodnoty se směrem od globálního optima zvyšují. Funkce je separabilní a multimodální. cos
Obr. 5.5: Rastriginova funkce 2D
(5.6)
Obr. 5.6: Rastriginova funkce 2D - detail
Z grafu 5.7 je patrné, že HBMO algoritmus nalezne globální minimum nejrychleji. Diferenciální evoluce funguje také dobře, neboť využívá vnitřní symetrie funkce. Rosenbrockův algoritmus na Rastriginově funkci nefungoval dobře. Je to dáno tím, že funkce je silně multimodální a algoritmus pokaždé uvízl v lokálním minimu. Tabulka 5.3 Porovnání zdatnosti dělnic HBMO algoritmu po 1000000 vyhodnocení funkce Rastrigin
Algoritmus dělnice OneParamRandom RosenbrockLocalSearch
28 / 59
Zdatnost 3610,7 3330,9
Rastrigin 10D HBMO medián
HBMO nejlepší
HBMO nejhorší
Rosenbrock medián
Rosenbrock nejlepší
Rosenbrock nejhorší
DE medián
DE nejhorší
DE nejhorší
1,00E+01 1,00E+00 1,00E-01 Nejlnižší nalezená hodnota
1,00E-02 1,00E-03 1,00E-04 1,00E-05 1,00E-06 1,00E-07 1,00E-08 1,00E-09 1,00E-10 1,00E-11 1,00E-12 1,00E-13 0 29600 59200 88800 118400 148000 177600 207200 236800 266400 296000 325600 355200 384800 414400 444000 473600 503200 532800 562400 592000 621600 651200 680800 710400 740000 769600 799200 828800 858400 888000 917600 947200 976800
1,00E-14
Počet vyhodnocení funkce
Obr. 5.7 Porovnání rychlosti konvergence algoritmů HBMO-Real, restartovaný Rosenbrock a DE na Rastriginově funkci Tabulka 5.4 Nejlepší nalezená řešení na Rastrigin 10D po 1000000 vyhodnoceních
Median Min HBMO < 1E-14 < 1E-14 Rosenbrock 14,91 1,92 DE < 1E-14 < 1E-14
Max 5,68E-14 25,82 0
5.4.4 Ackleyho funkce Ackleyho funkce [25] obsahuje exponenciální člen, který pokrývá její povrch množstvím lokálních minim. Funkce je multimodální ale na rozdíl od Rastriginovy funkce není separovatelná [23].
(5.7)
29 / 59
Obr. 5.8 - Ackleyho funkce 2D
Obr. 5.9: Ackleyho funkce 2D - detail
Nejlepší nalezené řešení
Porovnali jsme výkon HBMO algoritmu s různými parametry (viz. 5.10). Rychlost konvergence se pro jednotlivé parametry opět moc neliší. 1,00E+01 1,00E+00 1,00E-01 1,00E-02 1,00E-03 1,00E-04 1,00E-05 1,00E-06 1,00E-07 1,00E-08 1,00E-09 1,00E-10 1,00E-11 1,00E-12 1,00E-13 1,00E-14
Porovnání efektivity při různých parametrech - Ackley 10D QueensCount=1, BroodSize=20, SpermathecaSize=10, QueensCount=4, BroodSize=20, SpermathecaSize=10, QueensCount=1, BroodSize=40, SpermathecaSize=10, QueensCount=4, BroodSize=40, SpermathecaSize=10, QueensCount=1, BroodSize=20, SpermathecaSize=30, QueensCount=4, BroodSize=20, SpermathecaSize=30, QueensCount=1, BroodSize=40, SpermathecaSize=30, QueensCount=4, BroodSize=40, SpermathecaSize=30,
Počet vyhodnocení účelové funkce Obr. 5.10 Porovnání výsledků pro různé kombinace parametrů na Rastriginově funkci
Porovnali jsme výsledky HBMO algoritmu s ostatními algoritmy. Výsledky jsou na grafu 5.11.
30 / 59
Ackley 10D HBMO medián
HBMO nejlepší
HBMO nejhorší
Rosenbrock medián
Rosenbrock nejlepší
Rosenbrock nejhorší
DE medián
DE nejhorší
DE nejhorší
1,00E+01 1,00E+00 1,00E-01 1,00E-02 Nejlnižší nalezená hodnota
1,00E-03 1,00E-04 1,00E-05 1,00E-06 1,00E-07 1,00E-08 1,00E-09 1,00E-10 1,00E-11 1,00E-12 1,00E-13 1,00E-14 0 28600 57200 85800 114400 143000 171600 200200 228800 257400 286000 314600 343200 371800 400400 429000 457600 486200 514800 543400 572000 600600 629200 657800 686400 715000 743600 772200 800800 829400 858000 886600 915200 943800 972400
1,00E-15
Počet vyhodnocení funkce
Obr. 5.11 Porovnání rychlosti konvergence algoritmů HBMO-Real, restartovaný Rosenbrock a DE na Ackleyho funkci Tabulka 5.5 Nejlepší nalezená řešení na Ackley 10D po 1000000 vyhodnoceních
Median Min Max HBMO < 1E-14 < 1E-14 < 1E-14 Rosenbrock 18,07 15,45 18,67 DE < 1E-14 < 1E-14 < 1E-14
5.4.5 Fletcher-Powellova funkce Fletcher-Powellova funkce [24] je multimodální a neseparovatelná. Na rozdíl od Rastriginovy a Ackleyho funkce má však tato funkce minima náhodně rozmístěna bez jakékoli symetrie. Lokální minima jsou navíc velmi hluboká, takže pravděpodobnost uvíznutí v některém z nich je vysoká.
31 / 59
(5.8)
Hodnoty koeficientů , a se generují náhodně. Pro námi testovanou deseti dimenzionální funkci byly vygenerovány tyto hodnoty:
(5.9)
Obr. 5.12 Graf Fletcher-Powellovy funkce ve 2D
Rosenbrockův algoritmus na této funkci vždy dokonvergoval do jednoho z poměrně kvalitních lokálních minim. Diferenciální evoluce fungovala špatně, neboť funkce není nijak symetrická ani nemá žádnou výraznou strukturu ve směru souřadnicových os, a také vždy uvíznul v lokálním minimu. HBMO 32 / 59
algoritmus fungoval ze všech tří porovnávaných algoritmů nejlépe a ve většině případů nalezl globální minimum. V některých případech však také uvíznul v lokálním extrému.
HBMO medián
HBMO nejlepší
HBMO nejhorší
Rosenbrock medián
Rosenbrock nejlepší
Rosenbrock nejhorší
DE medián
DE nejhorší
DE nejhorší
1,00E+06 1,00E+05 1,00E+04 1,00E+03 1,00E+02 1,00E+01 1,00E+00 1,00E-01 1,00E-02 1,00E-03 1,00E-04 1,00E-05 1,00E-06 1,00E-07 1,00E-08 1,00E-09 1,00E-10 1,00E-11 1,00E-12 1,00E-13 1,00E-14 0 85800 171600 257400 343200 429000 514800 600600 686400 772200 858000 943800 1029600 1115400 1201200 1287000 1372800 1458600 1544400 1630200 1716000 1801800 1887600 1973400 2059200 2145000 2230800 2316600 2402400 2488200 2574000 2659800 2745600 2831400 2917200
Nejlnižší nalezená hodnota
Fletcher-Powell 10D
Počet vyhodnocení funkce
Obr. 5.13 Porovnání rychlosti konvergence algoritmů HBMO-Real, restartovaný Rosenbrock a DE na Fletcher-Powellově funkci Tabulka 5.6 Nejlepší nalezená řešení na Fletcher-Powell 10D po 3000000 vyhodnoceních
Median Min Max HBMO < 1E-14 < 1E-14 6,82E+01 Rosenbrock 2,10E-03 1,43E-07 0,69 DE 1,03E+5 4,67E+4 1,57E+5
33 / 59
6. Řešení problému obchodního cestujícího Úkolem obchodního cestujícího je navštívit všechny zákazníky v různých městech. Mezi městy jsou silnice. Problém cestujícího je nalézt takové pořadí měst, aby celková ujetá vzdálenost byla co nejmenší. Města a silnice mohou být modelovány jako neorientovaný úplný vážený graf tak, že města tvoří jeho vrcholy a cesty tvoří jeho hrany. Úlohou je nalézt v grafu Hamiltonův cyklus s nejnižším celkovým ohodnocením hran. Při řešení předpokládáme, že váhy hran splňují trojúhelníkovou nerovnost, což platí u drtivé většiny reálných problémů.
6.1 Stochastický problém obchodního cestujícího Ve článku [8] je popsáno použití modifikovaného HBMO algoritmu pro řešení stochastického problému obchodního cestujícího (Probabilistic Traveling Salesman Problem – PTSP). PTSP je rozšířením klasického problému obchodního cestujícího (TSP). Je to patrně nejobecnější stochastický problém hledání nejkratší trasy (stochastic routing problem), který může být definován . V PTSP nastává poptávka v jednom městě během jedné cesty cestujícího s pravděpodobností , nebo nenastává poptávka (s pravděpodobností ). Na rozdíl od klasického problému obchodního cestujícího, kde je úkolem najít nejkratší cestu přes všechna města tak, abychom žádné z měst nenavštívili dvakrát, je v PTSP úkolem minimalizovat předpokládanou vzdálenost apriorní trasy, kde každý zákazník vyžaduje návštěvu jen s určitou pravděpodobností. Apriorní trasu si můžeme představit jako šablonu, ve které je zahrnuta posloupnost návštěv všech zákazníků. V konkrétním případě jsou zákazníci navštěvováni v pořadí daném touto posloupností a ti zákazníci, kteří zrovna nepotřebují být navštíveni, jsou jednoduše přeskočeni. PTSP patří k NP-těžkým problémům [8]. Formulace problému je následující [27]: Nechť je úplný graf s vrcholy . Každý vrchol je asociován s pravděpodobností , která udává, zda vrchol bude obsažen v daném řešení. Nechť je apriorní cesta, pak máme-li instanci problému , která nastane s pravděpodobností a pro navštívení zákazníků vyžaduje ujetí vzdálenosti , pak instance problému dostane váhu ve výpočtu požadované vzdálenosti. Délku cesty označíme jako . Naším úkolem je nalézt takovou apriorní cestu přes všech potenciálních zákazníků, která minimalizuje (6.1) což je součet přes všechny podmnožiny návštěvu je:
. Pravděpodobnost, že podmnožina zákazníků
vyžaduje
(6.2) Uvažujme apriorní cestu
. Její očekávaná délka je
34 / 59
(6.3)
kde
je vzdálenost mezi vrcholy a .
V implementaci algoritmu [28] je pro inicializaci místo náhodně vygenerované populace použita populace generovaná metodou Greedy Randomized Adaptive Search Procedure (GRASP) [29] spolu s Expanding Neighborhood Search - GRASP (ENS-GRASP) [30]. Tato metoda generuje přípustná řešení pomocí lokální optimalizace. Výchozí poloha královny je určena nejlepším řešením nalezeným pomocí ENS-GRASP. Tento algoritmus vytváří posloupnost měst tak, že začne z náhodně vybraného města a postupně přidává náhodně další města ležící v omezené vzdálenosti od naposledy přidaného města. Operátor křížení používá formu adaptivní paměti [31] pro uchovávání kvalitních řešení nalezených v minulosti. Pokaždé, když je nalezeno kvalitní řešení, je adaptivní paměť aktualizována. Na rozdíl od klasického HBMO algoritmu, se zde kříží genotyp královny spolu s genotypy všech trubců, kteří předali svoji informaci během páření královně, ještě spolu s genotypem uloženým v adaptivní paměti. Do paměti se přidávají jen úseky řešení, které se vyskytují u více jedinců. Jako heuristika lokálního prohledávání (dělnice) byl použit algoritmus Expanding Neighbourhood Search (ENS) [30]. Tento algoritmus je používán pro řešení kombinatorických problémů s uspokojivými výsledky [28]. Testovací data byla převzata z TSPLIB [32]. Algoritmus byl testován na deseti Euklidovských problémech s rozsahem mezi 51 a 1400 uzly. Byly prováděny experimenty s různou pravděpodobností, že obchodník navštíví daný uzel. Parametry všech algoritmů byly voleny tak, aby počet vyhodnocení účelové funkce byl pro všechny experimenty stejný. Při experimentech měl algoritmus HBMO pro PTSP problém (HBMOPTSP) lepší výsledky než dalších šest metaheuristických algoritmů pro všechny instance problému [8]. Mezi těmito metaheuristikami jsou původní algoritmy GRASP a ENS-GRASP, dále pak jednoduchý Particle Swarm Optimization (PSO) algoritmus, hybridní PSO používající ENS-GRAP (HybPSO) a hybridní Multi Swarm Particle Swarm Optimization používající ENS-GRAP (HybMSPSO). Dále bylo provedeno srovnání s metaheuristikou mravenčí kolonie (Ant Colony Optimization) [27; 33]. Pro čtyři instance, kde je pravděpodobnost 0,1, dává algoritmus mravenčí kolonie pACS [27] lepší řešení. Porovnání výsledků je v tabulce 6.1. Úspěšné použití HBMO algoritmu na PTSP problému dává naději dosažení dalších úspěchů při použití tohoto algoritmu na dalších kombinatorických optimalizačních problémech.
35 / 59
Tabulka 6.1 - Porovnání výsledků HBMO s jinými metaheuristickými přístupy. Převzato z [8] Method
kroA1002
HBMOPTSP HybMSPSO HybPSO PSO ENS-GRASP GRASP Tabu Search pACS [27] pACS-S [27] pACS+1-shift [27] pACS-S+1-shift-S [27] pACS+1-shift-T [27] pACS + 1-shift-P [27] TSP-ACO [33] Angle-ACO [33] Depth-ACO [33] HS/1-Shift [33]
16581.64 16581.64 16584.32 16584.32 16584.32 16717.81 16658.46 16605.4 16793.61 17723.7 16679.3 16839.5 16681.61 N/M1 N/M1 N/M1 N/M1
HBMOPTSP HybMSPSO HybPSO PSO ENS-GRASP GRASP Tabu Search pACS [27] pACS-S [27] pACS+ 1-shift [27] pACS-S+1-shift-S [27] pACS+1-shift-T [27] pACS+1-shift-P [27]
9071.72 9074.94 9074.94 9076.23 9079.86 9191.29 9116.64 9039.4 9098.05 11715.1 9161.6 9229.9 9084.80
eil1012 ch1502 Probability = 0.5 455.65 5016.82 455.65 5016.85 455.73 5016.85 457.23 5017.23 455.73 5016.85 465.05 5112.86 461.52 5071.51 470.7 5164.3 476.03 5318.64 500.6 5467.1 460.7 5051.3 491.7 5447.5 465.96 5099.03 467.441 N/M1 463.570 N/M1 460.563 N/M1 463.368 N/M1 Probability = 0.1 200.03 2509.98 200.03 2510.11 200.03 2514.31 201.01 2515.08 200.03 2520.10 203.06 2530.27 202.42 2554.59 199.7 2493.6 201.68 2533.73 283.6 3418.3 236.1 2814.2 209.8 2577.8 201.61 2540.74
d1982
rat7832 12492.62 12527.56 12534.92 12537.26 12538.45 12702.50 12606.23 12745.5 13109.46 13539.7 12613.3 13261.4 13502.58 N/M1 N/M1 N/M1 N/M1
7085.48 7094.87 7094.87 7097.33 7097.85 7299.24 7123.76 7334.1 7423.20 7785.5 7261.4 7427.4 7346.53 N/M1 N/M1 N/M1 N/M1
7490.09 7504.94 7504.94 7512.12 7525.03 7564.90 7525.03 7556.1 7584.43 9312.1 8028.3 7748.7 7650.94
3616.44 3616.44 3618.01 3621.21 3618.01 3737.69 3705.31 3368.9 3472.58 4619.2 3514.5 3488.3 3440.87 1 (nebylo zmíněno) 2 název testovacího problému z TSPLIB [32]
6.2 Implementace HBMO pro TSP Rozhodli jsme se implementovat algoritmus pro řešení klasického problému obchodního cestujícího (Traveling Salesman Problem - TSP). Reprezentace řešení a použité operátory mutace jsou inspirovány řešením popsaným v článku [8].
6.2.1 Reprezentace a výpočet zdatnosti Každé řešení představuje permutaci měst. Genotyp tvoří pole celých čísel, které udávají čísla měst. Města jsou v poli v tom pořadí, v jakém je má cestující navštívit. Vzdálenost mezi i-tým městem posloupnosti a následujícím městem posloupnosti budeme označovat jako . Pro každé řešení je možno spočíst jeho celkovou délku jako součet velikostí těch hran, které leží vždy mezi dvěma po sobě navštívenými městy (6.9). Je důležité nezapomenout na hranu, po které se cestující vrátí zpět do města, ze kterého cestu započal. (6.4) V článku o aplikaci HBMO algoritmu na PTSP [8] se zdatnost jedince počítá jako rozdíl délky aktuálního řešení a nejhoršího řešení v populaci. Toto řešení však vedlo k tomu, že zdatnost nejlepšího řešení nerostla v průběhu optimalizace monotónně. Výpočet jsme upravili tak, že zdatnost řešení je počítána 36 / 59
jako rozdíl délky trasy tohoto řešení
a délky trasy řešení
vynásobené koeficientem 1,2.
Řešení je první řešení, které je náhodně vygenerované po spuštění optimalizace. Řešení delší než 1,2 násobek délky řešení mají zdatnost 0 a nemají tak šanci být vybrány ruletovou selekcí. Pravděpodobnost, že by takto bylo zahozeno kvalitní řešení, je však malá. Experimentálně jsme zjistili, že při tomto způsobu výpočtu zdatnosti (6.9), dosahuje algoritmus o trochu lepší výsledky, než při výpočtu zdatnosti jako převrácené hodnoty vzdálenosti. ,
(6.5)
Generování nového počátečního řešení se provádí tak, že se do posloupnosti přidá náhodně vybrané město. Pak jsou postupně přidávána další města, která jsou vybírána na základě jejich vzdálenosti k naposledy přidanému městu. Výběr dalšího města probíhá vždy náhodně ze skupiny prvních měst, které jsou nejblíže naposledy přidanému městu a dosud nebyla přidána. Parametr byl při experimentech nastaven na hodnotu .
6.2.2 Operátor mutace přepojením Operátor mutace přepojením funguje tak, že obrátí pořadí měst na vybraném úseku posloupnosti. Princip je demonstrován na obrázku 6.1. 4
16
10
15
1
2
8
9
14
12
21
27
23
11
18
4
16
10
15
12
14
9
8
2
1
21
27
23
11
18
Obr. 6.1 Princip mutace přepojením posloupnosti
V naší implementaci jsou použity různé varianty tohoto operátoru lišící se ve způsobu, jak jsou vybírány koncové hrany úseku (v obrázku označeny červeně). Varianta SwapTwo reversuje pořadí pouze dvou následujících měst. Dvojice měst je vybrána náhodně. Varianta SwapFour reversuje pořadí na úseku maximální délky 4. Poloha úseku je opět vybrána náhodně. Varianta SwapRandom reversuje zcela náhodný úsek posloupnosti. Varianta SwapByDistance vybere první koncový bod reversovaného úseku pomocí ruletového kola, kde velikost slotu rulety je délka cesty trasy mezi městy v koncové hraně. Tato spojnice mezi městy, podle jejíž délky se vybírá, po prohození zanikne. Druhá koncová hrana je vybrána tak, aby celková trasa po přepojení byla co nejkratší. Jedná se o variantu algoritmu 2-opt [34]. Varianta SwapByDistanceRandomized se podobá SwapByDistance. První město je vybráno stejným způsobem. Druhé město je vybráno pomocí ruletového kola, kde velikost slotu pro každý koncový bod je úměrná zkrácení celkové trasy po přepojení.
6.2.3 Operátor mutace RuinAndRecreate Mutace RuinAndRecreate pracuje tak, že nejprve část řešení zcela zruší a poté ho znovu sestaví. Rušení řešení probíhá tak, že všechna města nacházející se v určité oblasti jsou odebrána z posloupnosti měst, 37 / 59
jako kdyby již neměla být cestujícím navštěvována. Následuje fáze znovusestavení, ve které je každé odebrané město postupně přidáno do posloupnosti na takovou pozici, aby se délka trasy co nejméně prodloužila. Pořadí, v jakém jsou odebraná města přidávána, je náhodné [35]. Oblast rušení je dána kružnicí. Všechna města nacházející se uvnitř této kružnice jsou z cesty odebrána. Středem kružnice je náhodně vybrané město. Poloměr kružnice je spočten podle (6.6) kde Random je generátor rovnoměrného náhodného rozdělení, je délka hrany mezi vybraným městem a městem následujícím v posloupnosti a je parametrem algoritmu, který určuje velikost mutace. funkce RuinRecreate(původní řešení radiusMod) é
ě
é
Random
2* é
odebraná města
č
* Random
ě é
ě
é
ě
ů
íř š
í
města která mají vzdálenost od vybrané město menší než radius
//nové řešení vznikne odeberáním měst z posloupnosti původního řešení
nové řešení původní řešení – odebraná města
for i = 1 .. Počet odebraných měst do město náhodně vybereme jedno město z odebraná města //odebereme město z množiny odebraných měst
odebraná města odebraná města – město vlož město do posloupnosti nové řešení na takovou pozici, aby se celková délka nového řešení zvýšila co nejméně end for return nové řešení
6.2.4 Svatební let Před počátkem svatebního letu je energie královny inicializována na hodnotu a rychlost královny na hodnotu (což je délka nejlepšího dosud nalezeného řešení). Koeficient úbytku rychlosti byl nastaven na hodnotu 0,9. V každém kroku svatebního letu je vygenerován genotyp trubce. Pokud by byl genotyp generován stejným způsobem, jako je tomu při generování genotypů královen na počátku algoritmu, trubci by nebyli příliš kvalitní a konvergence by se po několika svatebních letech velmi zpomalila. Trubci jsou tedy podobně, jako je tomu u HBMO pro spojité problémy, generovány z genotypů královen. Genotyp trubec vznikne tak, že v každém kroku letu je ze seznamu královen náhodně vybrána jedna královna a na její genotyp je aplikována mutace. Pokud je vybrána stejná královna, která právě provádí svatební let, je provedena mutace přepojením SwapFour. Pokud je vybrána jiná královna, provádí se mutace SwapTwo. Královna se s vygenerovaným trubcem páří na základě její aktuální rychlosti a zdatnosti trubce. Pravděpodobnost páření se spočte podle (2.1). Potomci se pak generují křížením genotypu královny, která je vybraná ruletou podle její zdatnosti, a genotypu náhodně vybraného z její spermatéky. V případě, že je křížením vzniklý jedinec obsahuje stejnou posloupnost měst jako královna (jeho matka), je genotyp potomka zmutován pomocí operátoru RuinAndRecreate s velkým poloměrem 38 / 59
destrukce. Tímto je zajištěna vysoká pravděpodobnost, že potomek nebude mít shodný genotyp jako královna. Tato podmínka byla přidána pro ošetření stavu, kdy všechny královny zkonvergovaly do lokálního minima a další vývoj optimalizace se zastavil.
6.2.5 Operátor křížení Operátor křížení vytváří genotyp nového jedince z genotypu královny a genotypu trubce pomocí hladové (greedy) strategie. Nejprve náhodně nastaví index v posloupnosti měst. Poté do posloupnosti měst potomka přidá město, které se nachází na nastaveném indexu v posloupnosti náhodně vybraného rodiče. Po této inicializaci je spuštěn cyklus, v němž je v každém jeho kroku index inkrementován a do posloupnosti měst potomka je přidáno jedno město. Snahou je vybrat to město, které je na aktuálním indexu v posloupnosti jednoho z rodičů a je blíže naposledy přidanému městu. Algoritmus musí zajistit, aby nebylo přidáno takové město, které již bylo přidáno. Pokud již byla přidána obě města na aktuálním indexu obou rodičů, je přidáno jakékoli město, které ještě nebylo přidáno a je nejblíže poslednímu přidanému městu. funkce TspGreedyCrossover(královna, trubec)
index
Random(1, počet měst)
//vybereme náhodně město z posloupnosti královny nebo trubce
přidané město
Random({královna, trubec})[index]
//potomek je nová posloupnost do které přidáme první město
potomek
{přidané město}
for i = 1 .. počet měst do
kandidát kandidát
královna [index] //přiřadí kandidátu město z posloupnosti královny na pozici dané indexem trubec [index] if Vzdálenost poslední město, kandidát Vzdálenost poslední město, kandidát ) and potomek kandidát then přidané město kandidát else if potomek kandidát then přidané město kandidát else
end if
přidané město
nejbližší město od posledního města v posloupnosti potomka
//přidáme město na konec posloupnosti měst z potomka
potomek
end for
potomek
přidané město
return potomek
39 / 59
6.2.6 Dělnice Dělnice jsou reprezentovány algoritmy lokálního prohledávání, které se vzájemně liší jen ve způsobu mutace. funkce Improve(řešení, for if(
)
do mutace ř š á ř š í á á
í
ř š
í then
end if end for return řešení Použité mutace jsou: SwapTwo, SwapFour, SwapRandom, SwapByDistance a třikrát RuinAndRecreate každá s jiným použitým parametrem . Zdatnost dělnic se aktualizuje stejným způsobem jako u implementace algoritmu pro spojité problémy (6.7). (6.7)
40 / 59
6.2.7 Algoritmus HBMO-TSP v pseudokódu ,
algoritmus HBMO-TSP (
,
, )
for q = 1 .. počet královen do náhodně vygeneruj genotyp královny q
//generování probíhá postupným přidáváním měst //první město je vybráno náhodně //další města jsou náhodně vybírána vždy z prvních dvou nejbližších měst
pomocí náhodně vybrané dělnice w vylepši genotyp královny přidej královnu q do Q end for prvních nejlepších královen z zdatnost všech dělnic se zvýší o tolik o kolik dělnice zvýšila zdatnost potomků for i = 0 .. maximální počet svatebních letů do for each q pro každou královnu z Q do //délka nejlepšího dosud nalezeného řešení
while
/
and spermatéka není plná do
//genotyp trubce vznikne zkopírováním genotypu jedné z královen
genotyp trubce d
náhodně vybraná královna z Q
//pokud je genotyp trubce stejný jako královna se kterou se má pářit
if
then Swap our
else
SwapTwo end if if Random then //splněna podmínka páření (2.1) přidej genotyp d do spermatéky královny q end if end while end for each for do vyber královnu q z Q pomocí ruletového kola (velikost slotu ~ pořadí náhodně vyber genotyp d ze spermatéky královny q vygeneruj potomka TspGreedy rossover if á then //pokud je genotyp stejný provedeme velkou mutaci end if vyber dělnici
ze seznamu dělnic W pomocí ruletového kola
//(velikost slotu rulety ~ zdatnost)
dělnice se pokusí vylepšit potomka b pomocí lokálního prohledávání přidáme nového potomka do seznamu potomků end for zdatnost všech dělnic se zvýší o tolik o kolik dělnice zvýšila zdatnost potomků while nejlepší potomek je lepší než nejhorší královna do nahraď nejméně zdatnou královnu nejlepším potomkem odstraň nejlepšího potomka ze seznamu potomků end while vymažeme seznam potomků end for 41 / 59
6.3 Implementace umělé mravenčí kolonie pro TSP Pro porovnání výkonu HBMO-TSP jsme implementovali algoritmus umělé mravenčí kolonie (ant colony optimization – ACO) na základě prací [36] [5]. Princip tohoto algoritmu je inspirován mravenci při hledání nejkratší cesty mezi potravou a mraveništěm. Svojí cestu označují feromony, které fungují jako paměť prostředí. Při spuštění algoritmu se každé hraně grafu přiřadí hodnota feromonu, která se pak v průběhu optimalizace mění. Algoritmus v každém kroku vygeneruje trasu každého mravence. Počet mravenců je určen vstupním parametrem . Generování trasy začne u náhodně zvoleného města a postupně přidává další města. Město pro přidání je vybráno na základě jeho vzdálenosti od posledního města a na základě síly feromonu na hraně grafu mezi přidávaným a posledním přidaným městem. Pravděpodobnost přidání města , které následuje po naposledy přidaném městě se spočet podle á
(6.8) á
kde
je vstupní parametr nastavující relativní sílu feromonu.
Po vygenerování tras všech mravenců je vybrána nejkratší z nich a na základě ní je navýšena hodnota feromonu pro každou hranu, kterou trasa prochází. Tím se zvýší pravděpodobnost, že v budoucnu bude použita část této cesty. Pro hrany, kudy nejkratší trasa neprochází, je hodnota feromonu snížena (tzv. vypařování). Aktualizace feromonových stop probíhá tak, že se na každé hraně mezi městy i a j změní hodnota feromonu
. Pokud je tato hrana zahrnuta v nejkratší trase, je hodnota
součástí nejlepší trasy, je
. Parametr
. Pokud není
určuje rychlost vypařování feromonu. (6.9)
algoritmus ACO-TSP ( , ) inicializace feromonu na všech hranách inicializace mravenců while not UkončovacíPodmínka do for each in do Random while
do vybereme z s pravděpodobností –
end while end for each end while Vstupní parametry jsme nastavili podle hodnot uvedených v článku [5]: , 42 / 59
,
6.4 Výsledky TSP Testování bylo prováděno na zadání měst převzatého z TSPLIB [32]. Pro testování jsme vybrali problémy „eil51“ obsahující 51 měst a „eil101“ obsahující 101 měst. Pro ilustraci jsme zobrazili optimální řešení obou problémů na obrázcích (Obr. 6.2 a Obr. 6.3). Pro problém eil51 má nejkratší známá trasa délku 426, pro problém eil101 délku 629 [32].
Obr. 6.2 Optimální řešení eil51
Obr. 6.3 Optimální řešení eil101
Porovnali jsme několik nastavení parametrů na problému „eil51“. Zjistili jsme, že nastavení parametrů má opět malý vliv na efektivitu algoritmu. Prezentované výsledky jsou pro tuto konfiguraci:
Provedli jsme 50 spuštění HBMO-TSP algoritmu na oba problémy. Algoritmus pokaždé dokonvergoval k nejlepšímu známému řešení během 500000 vyhodnocení délky trasy. Grafy (6.4 a 6.5) ukazují nejlepší, nejhorší a medián konvergence HBMO-TSP algoritmu a ACO-TSP algoritmu pro daný počet vyhodnocení. Grafy pro větší přehlednost neukazují v x-ové ose celý průběh 500000 vyhodnocení, ale jen nejzajímavější část na počátku. Z grafů je patrné, že HBMO-TSP algoritmus si vedl značně lépe než ACO-TSP, který velmi často skončil v lokálním optimu. Je to především díky velmi účinné heuristice RuinAndRecreate. ACO-TSP algoritmus by mohl být vylepšen také zahrnutím nějaké heuristiky lokálního prohledávání. Tabulka 6.2 Porovnání zdatnosti dělnic HBMO-TSP algoritmu po 500000 vyhodnocení problému eil51
Algoritmus dělnice TwoSwapByDistance TwoSwapByDistanceRandom TwoSwapFour TwoSwapRandom TspTwoSwapTwo RuinRecreate, step=2 RuinRecreate, step=4 RuinRecreate, step=8
Průměrná zdatnost 1300,9 ± 579,9 369,3 ± 155,4 104,8 ± 54,2 92,4 ± 45,7 63,2 ± 38,9 1844,1 ± 729,4 1815,0 ± 690,4 1660,4 ± 667,7
43 / 59
Konvergence na eil51
586
HBMO medián
HBMO nejlepší
HBMO nejhorší
ACO medián
ACO nejlepší
ACO nejhorší
566
Délka nejktratší nalezené trasy
546 526 506 486 466 446
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 16000 17000 18000 19000 20000 21000 22000 23000 24000 25000 26000 27000 28000 29000
426
Počet vyhodnocení délky trasy
Obr. 6.4 Nejlepší dosažené řešení v závislosti na počtu vyhodnocení délky trasy pro zadání eil51
Konvergence na eil101
977
HBMO medián
HBMO nejlepší
HBMO nejhorší
ACO medián
ACO nejlepší
ACO nejhorší
Délka nejktratší nalezené trasy
927 877 827 777 727 677
0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 11000 12000 13000 14000 15000 16000 17000 18000 19000 20000 21000 22000 23000 24000 25000 26000 27000 28000 29000
627
Počet vyhodnocení délky trasy Obr. 6.5 Nejlepší dosažené řešení v závislosti na počtu vyhodnocení délky trasy pro zadání eil101
44 / 59
7. Testovací platforma Pro testování jsme implementovali testovací platformu v jazyce C#. Platforma umožňuje dávkové zpracování optimalizačních úloh a jejich pozdější vyhodnocování. Je možné tak například zadat spojitou optimalizaci Ackleyho funkce s počty královen 1 a 5, velikostí spermatéky 20 a 40 s tím, že pro každou kombinaci parametrů bude provedeno 50 pokusů. Program pak automaticky provede všechny pokusy a uloží výsledky do relační databáze. Později je možné tyto výsledky analyzovat. Uživatelské rozhraní používá grafické rozhraní Windows Forms. Celá aplikace je napsána pro operační systém Windows, ke svému běhu vyžaduje nainstalovaný .NET Framework verze 4.0. Pro ukládání dat byla použita databáze MS SQL 2008. Práce s databází probíhá výhradně přes jednoduchým objektově-relačním mapováním LINQ to SQL. Tabulky databáze jsou díky ní reprezentovány jako silně typové kolekce objektů, na které je možné se dotazovat prostřednictvím technologie LINQ (Language Integrated Natural Query). Výhoda tohoto přístupu spočívá ve snadnosti jeho konfigurace a v tom, že dotazy do databáze jsou kompletně zpracovány překladačem jazyka C# a většina případných chyb je odhalena již během překladu. Aplikace vyžaduje připojení k SQL Serveru pro své spuštění. Podrobnější popis instalace a používání aplikace je uveden v příloze B. Aplikace je navržena objektově. Lze ji snadno rozšiřovat o nové typy optimalizačních problémů a algoritmů. Popis implementace dalších algoritmů je popsán v příloze C.
45 / 59
8. Náměty pro další práci Během práce jsme objevili mnoho způsobů, jak by HBMO algoritmus mohl být modifikován. Například by při výběru genotypu trubce ze spermatéky místo zcela náhodného výběru mohl být použit výběr pomocí ruletového kola nebo pořadová selekce. Obrovský prostor pro vylepšování algoritmu spočívá v implementaci dalších heuristik, které je možno do algoritmu integrovat jakožto dělnice. Utváření nových jedinců a jejich vylepšování dělnicemi spotřebuje podstatnou část z celkového výpočetního času. Značné množství práce je zahozeno tím, že do každého nového cyklu algoritmu přežívají pouze královny a všichni ostatní jedinci jsou odstraněni. Pokud by kromě královen byla v průběhu algoritmu udržována větší generace méně zdatných jedinců, mohla by být využita operátory křížení a mutace nebo pro generování trubců během svatebního letu. Varianta HBMO algoritmu pro spojité problémy by mohla použít heuristiku diferenciální evoluce jakožto jedné z dělnic. Jako populace diferenciální evoluce by se dala použít množina královen sjednocená s množinou jedinců vyřazených v předchozím cyklu algoritmu. Mohl by se tak zlepšit výkon na funkcích s pravidelným rozložením extrémů.
46 / 59
9. Závěr V této práci byly shrnuty výsledky dosažené algoritmem Optimalizace pářením včelí královny. Algoritmus byl implementován a byla otestována jeho efektivita při řešení jak spojitých, tak diskrétních optimalizačních problémů. Při testování algoritmu na problému splnitelnosti booleovských formulí bylo dosaženo lepších výsledků než uvedených v literatuře [6]. HBMO algoritmus byl upraven pro řešení problémů s reálnými proměnnými. Byly provedeny experimenty na účelových funkcích s různými vlastnostmi. Výsledky byly porovnány s diferenciální evolucí a restartovaným Rosenbrockovým algoritmem. HBMO algoritmus dokázal nalézt globální optima na všech testovaných funkcích. Ostatní algoritmy nacházely globální optimum vždy jen na některých funkcích. Restartovaný Rosenbrockův algoritmus nalezne globální optimum, pokud funkce neobsahuje příliš mnoho lokálních extrémů. Diferenciální evoluce funguje dobře na funkcích, které mají minima rovnoměrně rozmístěná a mají výraznou strukturu ve směru souřadnicových os. Dále byla implementována varianta HBMO algoritmu pro řešení problému obchodního cestujícího. Úspěšně byla otestována na několika problémech převzatých z TSPLIB [32]. Výsledky byly výrazně lepší než u algoritmu umělé mravenčí kolonie (ACO). Výrazný rozdíl byl způsoben převážně požitím informované heuristiky RuinAndRecreate v rámci HBMO. Zajímavým zjištěním také je, že efektivita algoritmu se ani u jednoho testovaného typu problému zásadně nemění s různým nastavením parametrů. Jedna z největších výhod HBMO algoritmu spočívá v možnosti použití několika různých heuristik pro lokální prohledávání s tím, že po několika iteracích dává HBMO algoritmus přednost té heuristice, která dosáhla lepších výsledků. Tímto způsobem se algoritmus adaptuje na vlastnosti řešeného problému. Pokud je známo několik různých heuristických přístupů řešení určitého typu problému, a není předem jasné, který přístup bude nejefektivnější, není problém jich implementovat několik a nechat HBMO algoritmus, ať vybere nejlepší heuristiku za nás. V poslední kapitola je věnována námětům na další rozšíření a případná vylepšení algoritmu.
47 / 59
10. Použitá literatura [1] BLACK, P. E. Algorithms and Theory of Computation Handbook. optimization problem, in Dictionary of Algorithms and Data Structures. [Online] U.S. National Institute of Standards and Technology, 27. 04 2009. [Citace: 20. 11 2010.] http://xw2k.nist.gov/dads/HTML/optimization.html. [2] WEISSTEIN, E. W. Traveling Salesman Problem. From MathWorld--A Wolfram Web Resource. [Online] [Citace: 28. 11 2010.] http://mathworld.wolfram.com/TravelingSalesmanProblem.html. [3] KENNEDY, J. a EBERHART, R. Particle swarm optimization. Neural Networks, 1995. Proceedings., IEEE International Conference on. 1995, Sv. 4, stránky 1942-1948. [4] Fathian, M., Amiri, B. a Maroosi, A. Application of Honey Bee Mating Optimization Algorithm on Clustering. 2007, Sv. 190, stránky 1502-1513. [5] DORINGO, M. a GAMBARDELLA, L. M. Ant colony system: a cooperative learning approach to the traveling salesman problem. Evolutionary Computaion. 1997, Sv. 1, 1, stránky 53-66. [6] ABBASS, H. A. Marriage in Honey Bees Optimization (MBO): A Haplometrosis Polygynous Swarming Approach. Proceedings of the 2001 Congress on Evolutionary Computation, 2001. 2001, Sv. 1, stránky 207-214. [7] Haddad, O., Afshar, A. a Marino, M. Honey-Bees Mating Optimization (HBMO) Algorithm: A New Heuristic Approach for Water Resources Optimization. Water Resources Management. 2006. [8] MARINAKIS, Y. a MARINAKI, M. A Hybrid Honey Bees Mating Optimization Algorithm for the Probabilistic Traveling Salesman Problem. IEEE Congress on Evolutionary Computation (CEC 2009). 18. 5 2009, stránky 1762-1769. [9] Jakuš, Miroslav. O včelách. [Online] [Citace: 19. 04 2010.] http://vcely.euweb.cz/Central.htm. [10] Dietz, A. Evolution. Bee genetics and breeding. 1986, stránky 3-22. [11] ADAMS, J., a další. Estimation of the number of sex alleles and queen matings from diploid male frequencies in a population of apis mellifera. Genetics. 1977, Sv. 86, stránky 583-596. [12] KIRKPATRICK, S., GELATT, C. D. a VECCHI, M. P. Optimization by Simulated Annealing. Science. 1983, Sv. 220, stránky 671-680. [13] COOK, S. The complexity of theorem proving procedures. Proceedings of the Third Annual ACM Symposium on Theory of Computing. 1971, stránky 151-158. [14] GENT, I. a WALSH, T. The satisfiability constraint gap. Artifical Intelligence. 1996, Sv. 81, 1-2, stránky 59-80. [15] COOK, S. a MITCHELL, D. Finding hard instances of satisfiability problem: A survey. Satisfiability problem: theory and applications : DIMACS workshop, March 11-13, 1996. 1996, Sv. 35, stránky 1-16.
48 / 59
[16] RUSELL, S. a NORVIG, P. Artificial Intelligence: A Modern Approach. 1st edition. New Jersey, USA : Prentice Hall, 1995. stránky 53-122. ISBN 0-13-604259-7. [17] ROSENBROCK, H. H. An automatic method for finding the greatest or least value of a function. The ComputerJournal. 1960, Sv. 3, stránky 175–184. [18] POŠÍK, P. BBOB-Benchmarking the Rosenbrock’s Local Search Algorithm. GECCO '09: Proceedings of the 11th annual conference companion on Genetic and evolutionary computation conference. 2009. [19] BAU, D. a TREFETHEN, L. N. Numerical linear algebra. SIAM, 1997. stránky 56-60. ISBN 0898713617. [20] STORN, R. a PRICE, K. Differential evolution - simple and efficient heuristic for global optimization over continuous spaces. Journal of Global Optimization. 1997, Sv. 11, stránky 341-359. [21] ZELINKA, I. Kapitola 6. Diferenciální Evoluce. Umělá inteligence (4), Praha : Academia, 2003. stránky 176-203. [22] PEDERSEN, M. Tuning & Simplifying Heuristical Optimization. Thesis for the degree of Doctor of Philosophy, University of Southampton, 2010. [23] EIBEN, A. E. a BÄCK, T. Empirical investigation of multi-parent recombination operators in evolution strategies. Evolutionary Computation. 1997, Sv. 5, stránky 347-365. [24] DOMINGO, O. B., CÉSAR, H. a NICOLÁS, G. Benchmark Problems. A Crossover Operator for Evolutionary Algorithms Based on Population Features. [Online] 2005. [Citace: 20. 11 2010.] http://www.cs.cmu.edu/afs/cs/project/jair/pub/volume24/ortizboyer05a-html/node6.html. [25] BÄCK, T. Evolutionary Algorithms in Theory and Practice. Oxford University Press, Inc., 1995. stránky 137-148. 978-0-19-509971-3. [26] POWELL, W. B., JAILLET, P. a ODONI, A. Stochastic and dynamic networks and routing. [editor] M. O. Ball, a další. Network Routing, Handbooks in Operations Research and Management Science. 1995, Sv. 8, stránky 141-295. [27] BIANCHI, L. Ant Colony Optimization and Local Search for the Probabilistic Traveling Salesman Problem: A Case Study in Stochastic Combinatorial Optimization. Belgium : Phd. Thesis, University Libre de Bruxelles, 2006. [28] Marinakis, Y. a Marinaki, M. A Hybrid Honey Bees Mating Optimization Algorithm for the Probabilistic Traveling Salesman Problem. IEEE Congress on Evolutionary Computation (CEC 2009). 2009. [29] Feo, T. A. a Resende, M. G. Greedy randomized adaptive search procedure. Journal of Global Optimization. 1995, Sv. 6, stránky 109-133. [30] Marinakis, Y., Migdalas, A. a Pardalos, P. M. Expanding neighborhood GRASP for traveling salesman problem. Optimization Letters. 2007, Sv. 2, stránky 351-361.
49 / 59
[31] Rochat, Y. a Taillard, E. D. Probabilistic diversification and intensification in local search for vehicle routing. Journal of Heuristics. 1995, Sv. 1, stránky 147-167. [32] REINELT, G. TSPLIB. Ruprecht-Karls-Universitat Heidelberg. [Online] [Citace: 28. 04 2010.] http://www.iwr.uni-heidelberg.de/groups/comopt/software/TSPLIB95/. [33] BRANKE, J. a GUNTSCH, M. Solving the probabilistic TSP with ant colony optimization. Journal of Mathematical Modelling and Algorithms. 2003, Sv. 3, stránky 403-425. [34] VERDEHOEVEN, M. G., AARTS, E. a SWINKELS, P. A parallel 2-opt algorithm for the Traveling Salesman Problem. Future Generation Computer Systems. 1995, Sv. 11, 2, stránky 175-182. [35] SCHRIMPF, G., a další. Record Breaking Optimization Results Using Ruin and Recreate Principle. Journal of Computer Physics. 2000, Sv. 159, stránky 139-171. [36] KUČÍK, A. Přepínání metaheuristik. Praha : Diplomová práce, České vysoké učení technické v Praze, Fakulta elektrotechnická. Vedoucí diplomové práce Jan Koutník, 2010. [37] FEO, T. A. a RESENDE, M. G. Greedy randomized adaptive search procedure. Journal of Global Optimization. 1995, Sv. 6, 2, stránky 109-133. [38] REINELT, G. The Travelling Salesman: Computational Solutions for TSP Applications. SpringerVerlag, 1994. ISBN:3-540-58334-3 . [39] MARINAKIS, Y., MIGDALAS, A. a PARDALOS, P. M. Expanding neighborhood GRASP for traveling salesman problem. Computational Optimization and Applications. 2005, Sv. 32, 3, stránky 231-257.
50 / 59
A. Obsah CD K této práci je přiloženo CD, které obsahuje tyto adresáře: bin – Release sestavení platformy pro testování db_empty – backup prázdné databáze db_tests – backup databáze obsahující veškeré testy a jejich výsledky source – zdrojové kódy platformy pro testování Dále pak obsahuje text této diplomové práce ve formátu pdf.
51 / 59
B. Použití programu Program vyžaduje pro svůj běh knihovnu .NET Framework verze 4.0, který je volně stažitelný z http://msdn.microsoft.com/en-us/netframework/aa569263 a databázový server MS SQL 2008 R2. Stačí verze Express volně stažitelná z http://www.microsoft.com/express/Database/. Po nainstalování databázového serveru je nutno přidat databázi. Nejjednodušší způsob získání databáze je použití zálohy prázdné databáze přiložené na CD (soubor \db_empty\empty.bak) a provedení příkazu RESTORE (návod zde: http://www.promotic.eu/cz/pmdoc/Subsystems/Db/MsSQL/Statmn/RestoreDatabase.htm nebo pomocí SQL Management Studia: http://msdn.microsoft.com/en-us/library/ms177429.aspx). Program lze nainstalovat jednoduchým zkopírováním z CD. Před jeho spuštěním je třeba nastavit připojení k databázi (connection string). To lze provést v souboru Optimization.Platform.exe.config. Přenastavit je potřeba parametr Data Source na jméno SQL serveru (nejčastěji bývá „{jméno počítače}\SQLEXPRESS“) a parametr Initial Catalog na jméno databáze. Po spuštění programu se zobrazí seznam již uložených optimalizačních úloh. Okno se seznamem je na obrázku B.1. Zde je možné vytvářet nové úlohy, spouštět již uložené nebo zobrazovat výsledky již dokončených úloh. Nová úloha
Obnoví seznam úloh
Nová úloha vytvořená ne stejnou konfigurací jako právě vybraná úloha
Otevře výsledky vybrané úlohy
Uložené úlohy
Spustí vybranou úlohu Smaže vybranou úlohu Přejmenuje vybranou úlohu
Obr. B.10.1 Obrazovka programu po jeho spuštění
Postup vytvoření a spuštění úlohy je jednoduchý. Po kliknutí na tlačítko „New“ se otevře dialog zobrazený na obrázku B.2. V něm se vybere postupně problém, optimalizační algoritmus a vstupní číselné parametry. Optimalizační problémy a algoritmy nabízené v rozbalovacích seznamech se vyhledají automaticky ze všech dynamických knihoven ležících v adresáři, ze kterého je aplikace spuštěna. Pro porovnávání různých nastavení parametrů je možno v rámci jedné úlohy provést spuštění algoritmu s více konfiguracemi najednou. Do textového pole parametru je možno zadat více hodnot 52 / 59
najednou. To lze provést tak, že se hodnoty zapíšou ve formátu #hodnota1|hodnota2. Text tedy začíná dvojkřížkem # a hodnoty se oddělují svislítkem |. Pokud se takto zadá několik různých parametrů, budou provedeny všechny jejich kombinace. Dále je třeba doplnit jméno úlohy a počet opakování spuštění. Úloha je uložena po stisknutí tlačítka Save. Po uložení je možné ji spustit tlačítkem Run v okně se seznamem úloh. Úlohu, která již doběhla, můžeme otevřít tlačítkem Open a prohlížet výsledky v rozhraní na obrázku B.2. Okno obsahuje několik záložek. Záložka Convergence zobrazuje běh s nejrychlejší konvergencí, nejpomalejší konvergencí a průměrem a mediánem všech běhů. Záložka NumResult ukazuje číselné výsledky - například maximální a minimální čas jednoho běhu v milisekundách. Záložky TwoParamTable a ParamComparison slouží pro porovnávání nastavení s různými parametry. TwoParamTable porovnává výsledky pro různé hodnoty dvou parametrů. Nejlepší dosažené řešení za určitý počet vyhodnocení vypíše do matice, kde její sloupce tvoří hodnoty jednoho parametru a řádky hodnoty druhého parametru. ParamComparison porovnává rychlost konvergence (medián ze všech běhů) pro různé konfigurace parametrů. Poslední záložka Trials zobrazuje jednotlivé běhy úlohy. V pravé části okna je přepínání režimu zobrazení. Kromě výchozího nastavení Convergence, které zobrazuje přímo hodnoty účelové funkce, je ještě nastavení SAT, které zobrazuje počet vyřešených SAT problémů – tedy počet běhů, které nalezly ohodnocení, pro které je počet nesplněných klausulí nulový. Dále jsou v levé části zobrazeny vstupní parametry algoritmu. Pokud je použita vícenásobná hodnota parametru, je možno zde filtrovat výsledky pro jednotlivé hodnoty.
Výběr optimalizačního problému
Uloží zadání
Výběr optimalizačního algoritmu
Vstupní parametry algoritmu. Pokud zadání začíná znakem #, použijí se postupně jednotlivé hodnoty oddělené znakem |. V tomto případě je použit parametr BroodSize s hodnotami 20 a 40.
Název úlohy
Počet opakování se stejnými parametry
Obr. B.10.2 Dialog pro vytvoření nové optimalizační úlohy
53 / 59
Počet okrajových hodnot, které budou vyloučeny
Způsob zobrazení výsledků
Hustota výsledné tabulky Omezí počet výsledků tak, že se zobrazí jen hodnoty pro počty ohodnocení menší než zadaná hodnota
Vstupní parametry. U vícenásobného vstupního parametru je možnost filtrování
Obr. B.10.3 Okno prohlížeče výsledků
54 / 59
C. Implementace nového optimalizačního problému do frameworku Pro implementaci nového typu optimalizačního problému do programu je třeba odvodit třídu od abstraktní třídy Problem. Reprezentace řešení problému je implementována ve třídě odvozené od abstraktní třídy Solution. Framework poskytuje instanci třídy TrialContext, která obsahuje vstupní parametry optimalizačního procesu a umožňuje například logování nejlepších dosažených řešení, získání vstupních parametrů a podobně. Instance této třídy se předává jako parametr většině metod, které budeme dále popisovat. Implementaci konkrétního optimalizačního problému si popíšeme na implementaci 3-SAT problému. 3-SAT problém je definován třídou odvozenou od abstraktní třídy Problem. V kódu níže jsou uvedeny metody, které byly „overridovány“. /// Třída implementující 3-SAT problém public class SatProblem : Problem { /// Pole klausulí problému public Clause3[] Clauses { get; set; } /// Počet proměnných public int SymbolsCount { get; set; } /// Jméno problému. Vrací "3-SAT" public override string ProblemName { get { return "3-SAT"; } } /// Deserializuje problém z řetězce public override void Load(string content, TrialContext trial){...}
/// Serializuje problém do řetězce public override string Save(){...} /// Vykreslení problému /// <param name="graphics">Objekt, na který se kreslí /// <param name="width">Max. šířka /// <param name="heigth">Max. výška public override void Plot(System.Drawing.Graphics graphics, int width, int heigth) {...} /// Vygeneruje nový problém na základě seedu /// <param name="trial">Kontext /// <param name="parameters">Parametry obsahující počet proměnných a počet klauzulí public override void InitNewProblem(TrialContext trial, ParametersSource parameters) {...} /// Vygeneruje počáteční řešení public override Solution GenerateInitSolution(TrialContext trial) {...} /// Vyhodnotí řešení jako počet nesplněných klausulí public override double EvaluateSolution(Solution solution) { SatSolution satSolution = (SatSolution)solution; int satisfied = GetNumberOfSatisfiedClauses(satSolution); return Clauses.Length - satisfied; } /// Vrací objekt definující parametry problému public override ParametersSource GetParametersSource(Dictionary<string, string> parametersDictionary) { return new SatProblemParameters(parametersDictionary); }
55 / 59
Do třídy odvozené z abstraktní třídy Solution je nutné implementovat reprezentaci řešení. Pro problém obchodního cestujícího je to pole integerů, kde každá hodnota je index jednoho města. Je možno Ne vždy může být hodnota vrácená z metody EvaluateSolution třídy Problem použita jako zdatnost řešení. U zdatnosti musí platit, že čím vyšší zdatnost, tím lepší řešení. Zdatnost řešení je možné spočítat z ohodnocení pomocí „overridování“ metody CalculateFitness u třídy odvozené z třídy Solution. /// Jedno řešení 3-SAT problému public class SatSolution : Solution { /// Ohodnocení proměnných public bool[] Assignment { get; set; } /// Konstruktor /// <param name="assignment">Ohodnocení proměnných public SatSolution(bool[] assignment) { Assignment = assignment; } /// Vykreslí řešení jako ohodnocení proměnných a jednotlivé klausule 3-SAT problému. Barvou se odlišuje, zda jsou splněné či nikoli protected override void Plot(System.Drawing.Graphics graphics, int width, int heigth, TrialContext trial) /// Spočte fitness na základě počtu nesplněných klausulí. Zdatnost je v rozsahu 0 (žádná klausule splněná) do 1 (všechny kalusule splněné) /// <param name="solutionEvaluation">Ohodnocení řešení (počet nesplněných klausulí) protected override double CalculateFitness(double solutionEvaluation, TrialContext trial) { SatProblem satProblem = (SatProblem)trial.Problem; return (satProblem.Clauses.Length - solutionEvaluation) / satProblem.Clauses.Length; } /// Serializuje řešení public override string Serialize() /// Deserializuje řešení public override void Deserialize(string data) /// Převede řešení na string obsahující fitness, celkový počet nesplněných klausulí a ohodnocení proměnných public override string ToString()
Vlastní optimalizační algoritmus musí implementovat interface IOptimizationAlgorithm. Implementace je ukázána na HBMO algoritmu. /// <summary> /// Obecná implementace HBMO algoritmu /// public class HbmoAlgorithm : IOptimizationAlgorithm { /// <summary> /// Factory HBMO pro konkrétní problém /// private IHbmoOptFactory _optFactory; /// <summary> /// Dělnice /// public WorkerBee[] Workers { get; set; } /// <summary> /// Aktuální populace královen /// public List
Queens { get; set; }
56 / 59
/// <summary> /// Inicializuje algoritmus /// /// <param name="trial"> public void Initialize(TrialContext trial) { _optFactory = (IHbmoOptFactory)trial.Factory; Workers = _optFactory.CreateWorkers(); Drones = new List<Solution>(); HbmoParameters parameters = ((HbmoParameters)trial.InputParameters); int broodSize = parameters.BroodSize; //... } /// <summary> /// Spustí HBMO optimalizaci /// /// <param name="trial"> public void Run(TrialContext trial) { int broodSize = ((HbmoParameters)trial.InputParameters).BroodSize; int maxFlights = trial.InputParameters.NumberOfMainIterations; for (int flightNumber = 0; flightNumber < maxFlights; flightNumber++) { //... } } /// <summary> /// Uloží zdatnost dělnic /// /// <param name="results"> /// <param name="trial"> public void SaveResults(Dictionary<string, double> results, TrialContext trial) { foreach (WorkerBee worker in Workers) { results.Add(worker.LocalSearch.ToString(), worker.Fitness); } }
Implementace je obecná pro všechny typy problémů. Operátory specifické pro konkrétní problém (způsob procházení stavového prostoru při svatebním letu, operátor mutace, jednotlivé dělnice…) jsou získávány z „factory“ třídy, která implementuje interface IHbmoOptFactory. Tato třída spojuje obecný optimalizační algoritmus s problémem. Třída musí obsahovat atribut ProblemType, aby framework rozpoznal, pro který typ problému ji může nabídnout. [ProblemType(typeof(SatProblem))] public class HbmoSatFactory : IHbmoOptFactory { //vytvoření dělnic private SatRandomFlip _randomFlip = new SatRandomFlip(); private SatRandomNew _randomNew = new SatRandomNew(); private SatRandomWalk _randomWalk = new SatRandomWalk(); private SatWalkSat _walkSat = new SatWalkSat(); private Sat1PointCrossover _1pointCrossover = new Sat1PointCrossover(); private SatCrossoverOperator _crossower = new SatCrossoverOperator(); #region IHbmoOptFactory Members
57 / 59
/// <summary> /// Vytvoří HBMO-SAT algoritmus /// /// <param name="trial">Kontext /// HBMO-SAT algoritmus public IOptimizationAlgorithm CreateOptAlgorithm(TrialContext trial) { return new HbmoAlgorithm(); } /// <summary> /// Vytvoří královnu pro SAT problém /// /// <param name="initialSolution">Genotyp královny /// <param name="problemTrial">Kontext /// Královna public Queen CreateQueen(Solution initialSolution, TrialContext problemTrial) { return new SatQueen(initialSolution, problemTrial); } /// <summary> /// Vytváří pole dělnic /// /// public WorkerBee[] CreateWorkers() { return new ILocalSearch[] { _randomFlip, _randomNew, _randomWalk, _walkSat, _1pointCrossover } .Select(s => new WorkerBee(s)).ToArray(); } /// <summary> /// Vrací operátor křížení /// public ICrossoverTwoOperator CrossoverTwoOperator { get { return _crossower; } } /// <summary> /// Vrací objekt s popisem vstupních parametrů algoritmu /// /// <param name="parametersSource">Slovník s hodnotami parametrů v textové podobě /// public AlgorithmParameters GetParametersSource(Dictionary<string, string> parametersSource) { return new HbmoSatParameters(parametersSource); }
V kódu výše je několikrát zmíněn objekt popisující vstupní parametry algoritmu. Optimalizační algoritmus bere své konfigurovatelné parametry (např. velikost populace) ze třídy odvozené z AlgorithmParameters. Takovou třídou je například třída HbmoSatParameters. Parametry se zapisují jako vlastnosti (property) třídy označené atributem InputParameter. Atribut obsahuje parametr výchozí hodnoty, která se použije v případě, že uživatel hodnotu nevyplní. /// <summary> /// Definuje parametry obecného optimalizačního algoritmu
58 / 59
/// public class AlgorithmParameters : ParametersSource { /// <summary> /// Počet cyklů lokálního prohledávání. /// V případě restartované heuristiky jde o počet vyhodnocení, které má lokální heuristika provést, než je restartována /// [InputParameter(100)] public int OptimizeLocalStepsSearchCount { get { return GetInt("OptimizeLocalStepsSearchCount"); } }
/// <summary> /// Omezení maximálního počtu hlavních iterací (například generací u GA, nebo svatebních letů královny u HBMO) /// [InputParameter(10000)] public int NumberOfMainIterations { get { return GetInt("NumberOfMainIterations"); } } /// <summary> /// Omezení mazimálního poču vyhodnocení účelové funkce. Pokud je null, počet vyhodnocení není omezen /// [InputParameter(1000000)] public int? LimitEvaluationsCount { get { return GetNullableInt("LimitEvaluationsCount"); } } /// <summary> /// Konstruktor /// /// <param name="sourceDictionary">Slovník parametrů. Prázdný slovník vytvoří objekt s výchozími parametry public AlgorithmParameters(Dictionary<string, string> sourceDictionary) : base(sourceDictionary) { } }
59 / 59