Univerzita Karlova v Praze Matematicko-fyzikální fakulta. Vedoucí práce: RNDr. Martin Pergel, Ph.D.



Podobné dokumenty
zejména Dijkstrův algoritmus pro hledání minimální cesty a hladový algoritmus pro hledání minimální kostry.

Kapitola 11. Vzdálenost v grafech Matice sousednosti a počty sledů

GRAFY A GRAFOVÉ ALGORITMY

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

12. Aproximační algoritmy

5 Rekurze a zásobník. Rekurzivní volání metody

Často potřebujeme hledat mezi dvěma vrcholy grafu cestu, která je v nějakém

Dijkstrův algoritmus

1. Minimální kostry Od mìsteèka ke kostøe

VYSOKÁ ŠKOLA EKONOMICKÁ V PRAZE. Optimalizace trasy při revizích elektrospotřebičů

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

Součin matice A a čísla α definujeme jako matici αa = (d ij ) typu m n, kde d ij = αa ij pro libovolné indexy i, j.

Umělá inteligence. UI (AI) - součást informatiky s průniky mimo obor Stručná historie UI. Letošní cena nadace Vize Joseph Weizenbaum

TGH05 - aplikace DFS, průchod do šířky

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

Tento text je stručným shrnutím těch tvrzení Ramseyovy teorie, která zazněla

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

TGH05 - aplikace DFS, průchod do šířky

BAKALÁŘSKÁ PRÁCE. Numerické metody jednorozměrné minimalizace

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

Vrcholová barevnost grafu

Jarníkův algoritmus. Obsah. Popis

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Skalární součin je nástroj, jak měřit velikost vektorů a úhly mezi vektory v reálných a komplexních vektorových prostorech.

Jazyk matematiky Matematická logika Množinové operace Zobrazení Rozšířená číslená osa

Algoritmizace prostorových úloh

H {{u, v} : u,v U u v }

Implementace numerických metod v jazyce C a Python

PŘEDNÁŠKA 2 POSLOUPNOSTI

Stromy, haldy, prioritní fronty

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

Lineární programování

3. Matice a determinanty

10 Přednáška ze

13. Třídící algoritmy a násobení matic

Dnešní program odvozování v Bayesovských sítích exaktní metody (enumerace, eliminace proměnných) aproximační metody y( (vzorkovací techniky)

Řešení problému batohu dynamickým programováním, metodou větví a hranic a aproximativním algoritmem

TGH06 - Hledání nejkratší cesty

Jan Březina. 7. března 2017

8. Geometrie vrací úder (sepsal Pavel Klavík)

Výroková a predikátová logika - IV

Rámcový manuál pro práci s programem TopoL pro Windows

Plánování úloh na jednom stroji

KMA/PDB. Karel Janečka. Tvorba materiálů byla podpořena z prostředků projektu FRVŠ č. F0584/2011/F1d

2 Spojité modely rozhodování

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

Jak pracovat s absolutními hodnotami

Aproximativní algoritmy UIN009 Efektivní algoritmy 1

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Grafové algoritmy. Programovací techniky

Na začátku rozdělíme práci a určíme, které podproblémy je potřeba vyřešit. Tyto

Několik poznámek na téma lineární algebry pro studenty fyzikální chemie

Umělá inteligence I. Roman Barták, KTIML.

Vícekriteriální hodnocení variant metody

Další NP-úplné problémy

opakování reprezentace grafů, dijkstra, bellman-ford, johnson

Algoritmy na ohodnoceném grafu

TGH06 - Hledání nejkratší cesty

Obsah prezentace. Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest

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

Lineární algebra : Báze a dimenze

METODY REPREZENTACE A ZPRACOVÁNÍ ZNALOSTÍ V UMĚLÉ INTELIGENCI

0. Lineární rekurence Martin Mareš,

Pokud nebude na příkazové řádce uveden právě jeden argument, vypište chybové hlášení a stručný

Uživatelská příručka Evidence příchozí a odchozí pošty a elektronický archiv. V prostředí společnosti. Pražská vodohospodářská společnost a.s.

Grafové algoritmy. Programovací techniky

Lineární programování

Ukážeme si lineární algoritmus, který pro pevné k rozhodne, zda vstupní. stromový rozklad. Poznamenejme, že je-li k součástí vstupu, pak rozhodnout

Matematika pro studenty ekonomie

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

NEXIS 32 rel Generátor fází výstavby TDA mikro

DYNAMICKÉ PROGRAMOVÁNÍ A PROBLÉM BATOHU

3. ročník, 2013/ 2014 Mezinárodní korespondenční seminář iks

Řešení problému vážené splnitelnosti booleovské formule pokročilou iterativní metodou

Hledáme efektivní řešení úloh na grafu

Mária Sadloňová. Fajn MATIKA. 150 řešených příkladů (vzorek)

Problém obchodního cestujícího(tsp) Vstup: Množina n měst a vzdálenosti mezi nimi. Výstup: Nejkratší okružní cesta procházející všemi městy.

A0M15EZS Elektrické zdroje a soustavy ZS 2011/2012 cvičení 1. Jednotková matice na hlavní diagonále jsou jedničky, všude jinde nuly

Teorie informace a kódování (KMI/TIK)


Lenka Zalabová. Ústav matematiky a biomatematiky, Přírodovědecká fakulta, Jihočeská univerzita. zima 2012

Implementace A* algoritmu na konkrétní problém orientace v prostoru budov

PRÉCIS STRUKTUROVANÁ DATABÁZE JAKO ODPOVĚĎ NA NESTRUKTUROVANÝ DOTAZ. Dominik Fišer, Jiří Schejbal

Operační systémy Linux, Mac OS X a jejich srovnání

Dijkstrův algoritmus (připomenutí)

Funkce zadané implicitně

TGH09 - Barvení grafů

Teorie grafů a diskrétní optimalizace 1

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Anotace. Dynamické programování, diskrétní simulace.

Manuál administrátora FMS...2

Algoritmizace I. Ak. rok 2015/2016 vbp 1. ze 132

UŽIV ATELSKÁ PŘÍRUČKA

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

Kapitola 1. Úvod. 1.1 Značení. 1.2 Výroky - opakování. N... přirozená čísla (1, 2, 3,...). Q... racionální čísla ( p, kde p Z a q N) R...

Práce s velkými sestavami

KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO LINEÁRNÍ ALGEBRA 1 OLGA KRUPKOVÁ VÝVOJ TOHOTO UČEBNÍHO TEXTU JE SPOLUFINANCOVÁN

Paměti a jejich organizace

= je prostý orientovaný graf., formálně c ( u, v) 0. dva speciální uzly: zdrojový uzel s a cílový uzel t. Dále budeme bez

Determinant. Definice determinantu. Permutace. Permutace, vlastnosti. Definice: Necht A = (a i,j ) R n,n je čtvercová matice.

Transkript:

Univerzita Karlova v Praze Matematicko-fyzikální fakulta SVOČ 2011 Jindřich Ivánek Heuristikou řízené hledání optima v NP-těžkých úlohách Vedoucí práce: RNDr. Martin Pergel, Ph.D.

Obsah 1 Úvod 3 2 Algoritmus A* 4 2.1 Úloha nejkratší cesty.............................. 4 2.2 Popis A*..................................... 6 2.3 Vlastnosti A*.................................. 8 2.4 Aproximace................................... 9 3 Vybrané optimalizační NP-úplné problémy a jejich řešení pomocí A* 13 3.1 Problém obchodního cestujícího (TSP).................... 14 3.1.1 Zadání.................................. 14 3.1.2 Heuristiky................................ 15 3.1.3 Aproximace............................... 16 3.1.4 Funkce pro A*............................. 16 3.2 Vrcholové pokrytí (VP)............................. 17 3.2.1 Zadání.................................. 17 3.2.2 Heuristika................................ 17 3.2.3 Aproximace............................... 18 3.2.4 Funkce pro A*............................. 18 3.3 Problém batohu (PB).............................. 19 3.3.1 Zadání.................................. 19 3.3.2 Heuristika................................ 19 3.3.3 Aproximace............................... 21 3.3.4 Funkce pro A*............................. 21 3.4 Rozvrhování úloh (RU)............................. 21 3.4.1 Zadání.................................. 21 3.4.2 Heuristika................................ 22 3.4.3 Aproximace............................... 24 3.4.4 Funkce pro A*............................. 24 4 Implementace - uživatelská dokumentace 25 4.1 Instalace a spuštění grafického rozhraní.................... 25 4.2 Výběr optimalizačního problému a zadání vstupních dat.......... 26 1

2 4.2.1 Problém obchodního cestujícího.................... 26 4.2.2 Vrcholové pokrytí............................ 26 4.2.3 Problém batohu............................. 27 4.2.4 Rozvrhování úloh............................ 28 4.3 Parametry.................................... 28 4.4 Průběžné informace o výpočtu a výsledné řešení............... 29 5 Implementace - programátorská dokumentace 31 5.1 Instalace a spuštění............................... 31 5.1.1 Ovládání programu z příkazové řádky................. 31 5.1.2 Formát vstupních souborů....................... 32 5.1.3 Kompilace................................ 33 5.2 Datové struktury................................ 33 5.2.1 Halda a hrábě.............................. 34 5.2.2 B-strom................................. 34 5.3 Popis řešených optimalizačních problémů................... 35 5.4 Zdrojové soubory................................ 36 6 Porovnání heuristik a aproximací na příkladech 38 6.1 Porovnání heuristik na souboru příkladů................... 38 6.1.1 Problém obchodního cestujícího.................... 38 6.1.2 Vrcholové pokrytí............................ 39 6.1.3 Problém batohu............................. 39 6.1.4 Rozvrhování úloh............................ 40 6.2 Porovnání aproximací na příkladech...................... 41 6.2.1 Problém obchodního cestujícího.................... 41 6.2.2 Vrcholové pokrytí............................ 42 6.2.3 Problém batohu............................. 42 6.2.4 Rozvrhování úloh............................ 42 7 Závěr 44 Literatura 45

Kapitola 1 Úvod Předmětem předkládané práce je studium možností aplikace heuristikou řízeného prohledávání algoritmem A* na hledání optimálních řešení některých NP-těžkých problémů. Vycházíme z monografie N. J. Nilssona Problem-Solving Methods in Artificial Intelligence z roku 1971 [9], která popisuje použití A* na řešení problémů. Práce navazuje a dále rozšiřuje postup popsaný v článku [6], kde se využívá A* na řešení problému obchodního cestujícího. V práci zobecňujeme tento postup tak, aby šel využít na řešení různých typů optimalizačních úloh. Dalším přínosem je jeho vylepšení (např. ořezávání prohledávaného prostoru pomocí aproximace). Pro vybrané NP-úplné optimalizační problémy byl navržen převod na problém hledání nejkratší cesty a heuristiky a aproximace, které A* využívá. Popsaná metoda společně s vybranými problémy byla naimplementována, přičemž byl kladen důraz na prostorovou a časovou efektivitu. Vytvořené programové prostředí včetně zdrojových kódů je ke stažení na adrese http://code.google.com/p/onp-star. 3

Kapitola 2 Algoritmus A* A* je algoritmus na hledání minimální cesty s použitím tzv. heuristiky. Heuristikou zde rozumíme dolní odhad délky zbývající cesty. Např. v grafu reprezentující vzdálenosti objektů na euklidovské rovině, může být taková heuristika vzdušná vzdálenost do cíle. Metody heuristikou řízeného prohledávání byly vyvinuty v 50. a 60. letech minulého století v rámci výzkumu umělé inteligence. Jejich obecnou teorii shrnuje monografie N. J. Nilssona Problem-Solving Methods in Artificial Intelligence z roku 1971 [9], z níž ve své práci také vycházíme. Popis heuristikou řízeného algoritmu A* a jeho vlastností je též součástí každého přehledu výzkumu umělé inteligence, viz například [11]. 2.1 Úloha nejkratší cesty V následující části formálně zadefinujeme pojmy, které jsou nezbytné pro popis algoritmu A*. Najprve zavedeme A*-graf, který bude reprezentovat stavový prostor v němž se hledá minimální cesta z počátečního do koncového stavu. Dále budeme definovat heuristickou funkci, kterou A* využívá jako dolní odhad pro řízené prohledávání. K heuristikám přidáme podmínku konzistence, jejíž splnění nám dá jisté záruky o chování algoritmu A*. Definice 2.1 (A*-graf). Bud G = V, E, c vážený orientovaný konečný graf s nezáporným ohodnocením hran c : E R + 0 (kde R + 0 označuje množinu nezáporných reálných čísel). Bud s V, T V, T takové, že v V existuje cesta z s do v a v V \ T existuje cesta z v do alespoň jednoho t T. Pětici V, E, c, s, T budeme nazývat A*-graf, V množina stavů, s startovní stav a T množina cílových stavů. Termín stav zde zavádíme pro odlišení od termínu vrchol, který budeme používat v zadání některých řešených optimalizačních problémů grafového charakteru v další kapitole (a také v souvislosti s tím, že algoritmus A* byl původně konstruován pro řízené prohledávání stavového prostoru v úlohách umělé inteligence). V dalším textu budeme symboly V, E, c, s, T značit příslušné součásti nějakého A*-grafu. 4

5 Definice 2.2 (Minimální cesta). Minimální cestou do stavu v V rozumíme cestu s minimální délkou ze všech cest z s do v. Délku takové cesty budeme označovat g(v). Minimální cestou v A*-grafu rozumíme cestu z s do nějakého cílového stavu t T délky min{g(t) t T }. Této délce budeme říkat optimum. Definice 2.3 (Heuristika). Heuristika je funkce h : V R + 0, která je vždy menší nebo rovna délce minimální cesty z v V jako startovního stavu do T. Perfektní heuristika je taková heuristika, která je rovna délce minimální cesty. Tuto heuristiku budeme označovat h. Pro každou heuristiku platí: v V : h(v) h (v). Definice 2.4 (Konzistentní heuristika). Konzistentní heuristika je heuristika h, pro kterou platí: v, w E : h(v) c ( v, w ) + h(w). (2.1) Tedy konzistentní heuristika je dolní odhad, který se postupným přibližováním k cíli nezhoršuje. Lemma 2.5 (Konzistence a dolní mez). Pokud funkce h : V R + 0, splňuje nerovnost (2.1) a platí t T : h(t) = 0, pak je h konzistentní heuristika, tj. splňuje též podmínku v V : h(v) h (v). Důkaz. Pro libovolný stav v V uvažujme minimální cestu do T. Tato cesta v, v 1,..., v k, t má délku h (v). Chceme dokázat, že h(v) h (v). Pro všechny hrany w, z minimální cesty podle (2.1) platí: h(w) h(z) c ( w, z ). Pokud všechny tyto nerovnosti sečteme, získáme: h(v) h(t) h (v). Definice 2.6 (Silnější heuristika). Řekneme, že heuristika h 1 je silnější než heuristika h 2, pokud v V : h 1 (v) h 2 (v). Lemma 2.7 (Maximum heuristik). Jsou-li h 1,..., h n konzistentní heuristiky, pak funkce h(v) = max(h 1 (v),..., h n (v)), v V dává konzistentní heuristiku, která je silnější než h 1,..., h n.

6 Důkaz. Stačí ukázat, že h je konzistentní. Necht v, w V jsou libovolné stavy takové, že v, w E. Protože i {1,..., n} : h(v) = h i (v) a h i je konzistentní heuristika, musí platit h(v) = h i (v) c (v, w) + h i (w) c (v, w) + h(w). Definice 2.8 (Odhad). Funkci f : V R + 0, v V : f(v) = g(v) + h(v), kde h je heuristika, budeme nazývat odhad (délky minimální cesty z s do T přes stav v). Perfektní odhad budeme označovat f, v V : f (v) = g(v) + h (v). Platí: t T : g(t) = h (s ), toto g(t) je optimum délka hledané minimální cesty. Pro všechny stavy v na této hledané cestě musí platit f (v) = h (s ). 2.2 Popis A* Nyní můžeme přistoupit k popisu samotného algoritmu A*. Vzhledem k navrženým aplikacím se omezíme na variantu algoritmu A* pro konzistentní heuristiky. Algoritmus A* v A*-grafu najde (s využitím libovolné konzistentní heuristiky h) minimální cestu ze startovního stavu s do množiny cílových stavů T. Pro použití algoritmu A* není třeba zadávat celý vstupní graf, nebot A* prohledává vstupní graf (generuje jeho potřebnou část) s použitím následujících funkcí: Definice 2.9 (A*-graf zadaný funkcemi). Pro A*-graf V, E, c, s, T definujme funkce: start() = s. cil(v) rozhodne, zda platí v T. naslednici(v) = množina následníků stavu v, tj. {w V v, w E }. ohodnoceni(v, w) = c ( v, w ). Z definice 2.9 A*-grafu zadaného funkcemi plyne, že lze vygenerovat množiny V, E pomocí funkce naslednici ze startovního stavu s = start() (protože všechny stavy jsou z s dosažitelné). Pokud T a v, w E : ohodnoceni(v, w) R + 0, vyhovuje tento graf definici 2.1. Vstupem pro algoritmus A* je A*-graf zadaný funkcemi a konzistentní heuristika (zadaná funkcí heuristika()). A* si pro každý (vygenerovaný) stav pamatuje délku aktuálně nejkratší cesty ze startovního stavu s.

7 Definice 2.10 (delka, odhad). Aktuální (z hlediska běhu A*) délku nejkratší cesty ze startovního stavu do v V budeme značit delka(v). Aktuální (z hlediska běhu A*) odhad délky nejkratší cesty ze startovního stavu do T přes v V je odhad(v) = delka(v) + h(v). Cílem algoritmu A* je tedy postupně generovat stavy a přibližovat hodnotu delka hodnotě g. Na závěr musí najít takový cílový stav t, jehož g(t) je minimální, a přitom má zajistit, že g(t) =delka(t). Popis práce algoritmu A*: A* používá ke své práci množinu otevřených stavů open a množinu uzavřených stavů closed. Na začátku je v open startovní stav s. V každém kroku A* vyjme z open stav s minimální hodnotou odhad a vloží ho do closed (tedy uzavře tento stav). Pak spočte hodnoty delka a odhad pro všechny jeho následníky (generované funkcí naslednici) a vloží je do open (tomu budeme říkat expanze). Výpočet hodnoty delka probíhá podobně jako v Dijkstrově algoritmu. Algoritmus 2.1 (A*). I. Inicializace s := start() delka(s ) := 0 odhad(s ) := heuristika(w) open := {s } closed := II. Hlavní cyklus while open do II.a) Selekce v := x open takové, že odhad(x) = min w open {odhad(w)} open := open \ {v} closed := closed {v} II.b) Terminalita if cil(v) then print Nalezeno optimum (delka(v))! KONEC end if II.c) Expanze for all w naslednici(v) do if w / closed & w / open then delka(w) := delka(v) + ohodnoceni(v, w) odhad(w) := delka(w) + heuristika(w) open := open {w} end if if w / closed & w open then

8 if delka(w) > delka(v) + ohodnoceni(v, w) then odhad(w) := odhad(w) delka(w) + delka(v) + ohodnoceni(v, w) delka(w) := delka(v) + ohodnoceni(v, w) end if end if end for end while Poznámka 2.11 (Složitost algoritmu 2.1). Počet průchodů hlavním cyklem (a tedy počet expanzí) může být v nejhorším případě stejný jako počet necílových stavů A*-grafu. Při každém průchodu cyklem musíme vyhledat minimální prvek v open, zařadit ho do closed a dále vygenerovat jeho následníky, u každého z nich zjistit, zda se nenachází v open nebo closed a pokud je nový, vypočítat heuristiku. Důležité je pozorování, že heuristiku počítáme pro každý stav pouze jednou, a to když ho vygenerujeme poprvé. Vyhledání přítomnosti prvku v open nebo closed musíme ale provádět opakovaně, v nejhorším případě pro každou hranu A*-grafu. Složitost A* je tedy O( V (selekce + heuristika) + E vyhledani). Pokud by A*-graf měl tu vlastnost, že by pro stupně všech stavů platilo v V : deg(v) log( V ), (2.2) pak by se v každé expanzi vygenerovalo maximálně log( V ) následníků. To znamená, že by se celková složitost zlepšila na O( V (selekce + heuristika + log( V ) vyhledani)). Poznamenejme, že všechny A*-grafy řešených problémů (uvedených v kapitole 3) tuto vlastnost mají. 2.3 Vlastnosti A* Uved me nyní několik důležitých pozorování o chování A*: Lemma 2.12 (O uzavírání stavů). Ve chvíli, kdy A* uzavírá stav v (vybere jej z open a zařadí do closed), je delka(v) = g(v). Důkaz. viz [9], str. 63, lemma 3-2. Pokud by byla heuristika nekonzistentní, lemma 2.12 neplatí! Důsledek 2.13. Pokud se poprvé uzavírá cílový stav t T, neexistuje cesta menší délky do jiného z cílových stavů.

9 Věta 2.14 (Korektnost A*). Výsledek A* je vždy optimum délka minimální cesty z s do T. Důkaz. Vyplývá z důsledku 2.13. Poznámka 2.15 (Dijkstrův algoritmus). Pokud v A* použijeme nulovou heuristiku ( v V : h 0 (v) = 0), chová se A* stejně jako Dijkstrův algoritmus. (Až na to, že nepočítá minimální cesty do všech stavů, ale pouze minimální cestu do množiny cílových stavů a do těch stavů, do nichž je cesta kratší než toto optimum.) Lemma 2.16 (O monotónnosti odhadů uzavíraných stavů). Hodnota min {odhad(w)}, během práce algoritmu A* neklesá a blíží se (zdola) k hodnotě w open optima. Důkaz. viz [9], str. 64, lemma 3-3 a pozorování, že díky konzistenci heuristiky nejsou odhady stavů zařazovaných do open menší, než byl odhad uzavíraného stavu. Lemma 2.17 (Síla heuristiky). Silnější heuristika umožňuje získat optimum prohledáním (vygenerováním) menší části grafu (za předpokladu, že stavy se stejným odhadem jsou uzavírány vždy ve stejném pořadí). Důkaz. viz [9], str. 64, theorem 3-2. 2.4 Aproximace Algoritmus A* při své práci probírá hodně stavů, které nemají šanci na úspěch (jejich ohodnocení je větší než optimum, tudíž nebudou součástí řešení). Pokud by se nám podařilo o nějakém stavu rozhodnout, že nemůže být součástí optimálního řešení, může algoritmus A* jeho expanzi přeskočit a tím svůj běh značně urychlit. V následující části definujeme aproximaci, což je vlastně horní odhad optima, a dokážeme, že přeskočení stavů, jejichž ohodnocení je větší než aproximace, neovlivní korektnost algoritmu A*. Tento postup v použité literatuře kupodivu není zmiňován. Definice 2.18 (Aproximace). Dílčí aproximace a : V R + 0 je duální funkce k heuristice. Pro daný stav v dá horní odhad délky nejkratší cesty do cílového stavu. Pro dílčí aproximaci a tedy platí v V : a(v) h (v). Hodnotu g(v) + a(v) budeme nazývat aproximací (minimální cesty z s do T přes stav v). Poznámka 2.19 (Heuristikou generovaná aproximace). Heuristikou generovanou dílčí aproximaci lze definovat na obecném grafu pro A* s danou heuristikou, a to hladovým procházením do hloubky podle minimálního odhadu následníků.

10 Poznamenejme, že tato aproximace nemusí být polynomiální, i když daná heuristika polynomiální je. Heuristika se při výpočtu této aproximace může totiž v nejhorším případě volat i E -krát. Následující dvě standartní definice umožnují ohodnotit kvalitu aproximací a navzájem je porovnávat: Definice 2.20 (Poměrová chyba). Řekneme, že algoritmus řeší problém s poměrovou chybou ρ(n), pokud pro každé zadání velikosti n platí: { opt max apr, apr } ρ(n) opt Definice 2.21 (Relativní chyba). Řekneme, že algoritmus řeší problém s relativní chybou ε(n), pokud pro každé zadání velikosti n platí: apr opt ε(n) opt Lemma 2.22 (Aproximace může být optimum). Pokud je v nějakém kroku algoritmu A* hodnota nejmenší známé aproximace stejná jako {odhad(w)}, pak je tato aproximace optimem. min w open Důkaz. Plyne z toho, že podle lemmatu 2.16 vždy platí min {odhad(w)} opt apr. w open Z důkazu lemmatu 2.22 též plyne, že v každém kroku algoritmu lze aktuální poměrovou chybu nejmenší známé aproximace shora omezit poměrem: apr opt apr min {odhad(w)}, w open a tak posoudit kvalitu dosaženého řešení například při přerušení výpočtu. Lemma 2.23 (Ořezávání stavů pomocí aproximace). Stavy, jejichž odhad je větší než (nejmenší známá) aproximace, nemusíme vůbec brát v úvahu (tj. A* je nemusí zařazovat do open ani closed). I pak zůstane A* korektní. Navíc, pokud si budeme pamatovat hodnotu (a příslušnou cestu) pro nejmenší známou aproximaci, nemusíme brát v úvahu ani stavy, které mají stejný odhad. Důkaz. Podle lemmatu 2.16 jsou uzavírány pouze ty stavy v V, jejichž odhad(v) opt apr. Tudíž by na stavy, jejichž odhad je větší než aproximace, stejně nedošla řada.

11 Pokud se odhad stavu rovná aproximaci, pak bud je to optimum, a tedy jedno z řešení my už ale jedno řešení známe (tím je ta aproximace), a to nám stačí 1. Pokud aproximace není optimum, znamená to, že odhad stavu je větší než optimum, a tudíž nás nemusí zajímat. Algoritmus 2.2 (A* s aproximací). I. Inicializace s := start() delka(s ) := 0 odhad(s ) := heuristika(s ) open := {s } closed := apr := aproximace(s ) II. Hlavní cyklus while open do II.a) Selekce v := x open takové, že odhad(x) = min w open {odhad(w)} open := open \ {v} closed := closed {v} II.b) Aproximace if delka(v) + aproximace(v) < apr then apr = delka(v) + aproximace(v) end if II.c) Terminalita if odhad(v) = apr then print Nalezeno optimum - aproximace (apr)! KONEC end if if cil(v) then print Nalezeno optimum (delka(v))! KONEC end if II.d) Expanze for all w naslednici(v) do if w / closed & w / open then delka(w) := delka(v) + ohodnoceni(v, w) odhad(w) := delka(w) + heuristika(w) if odhad(w) < apr then open := open {w} end if end if if w / closed & w open then if delka(w) > delka(v) + ohodnoceni(v, w) then 1 Kdybychom ovšem chtěli vypočítat všechna optimální řešení, tak tento přístup použít nemůžeme

12 odhad(w) := odhad(w) delka(w) + delka(v) + ohodnoceni(v, w) delka(w) := delka(v) + ohodnoceni(v, w) end if end if end for II.e) Terminalita if open = then print Nalezeno optimum - aproximace (apr)! KONEC end if end while V algoritmu 2.2 jsou oproti algoritmu 2.1 navíc části II.b) a II.e); část II.c) je rozšířena o kontrolu, zda aproximace není optimum, a část II.d) je rozšířena o kontrolu, zda odhad prvku není větší nebo roven aproximaci. Aproximaci není nutno volat v každé iteraci algoritmu, ale například jen za určitých podmínek (důsledek lemmatu 2.23). Poznámka 2.24 (Složitost algoritmu 2.2). Složitost A* se změní pouze tak, že pro každý stav spočítáme aproximaci. Složitost A* s aproximací je tedy O( V (selekce + heuristika + aproximace) + E vyhledani). Podobně jako pro algoritmus 2.1, pokud by A*-graf splňoval vlastnost (2.2), byla by složitost algoritmu A* s aproximací O( V (selekce + heuristika + aproximace + log( V ) vyhledani)).

Kapitola 3 Vybrané optimalizační NP-úplné problémy a jejich řešení pomocí A* Přehled NP-úplných problémů a algoritmů pro jejich řešení lze nalézt v řadě monografií, například [2, 3, 4, 5, 7]; kde jsou též podrobně definovány a studovány jejich vlastnosti. Výběr čtyř optimalizačních NP-těžkých problémů pro demonstraci řešení pomocí A* byl veden snahou zahrnout různorodé problémy, které by alespoň zčásti reprezentovaly spektrum lišících se typů. Vybrány byly: problém obchodního cestujícího, problém vrcholového pokrytí, problém batohu a problém rozvržení úloh. Pro každý zvolený problém je definováno jeho převedení na A*-graf a úlohu minimální cesty, jsou navrženy heuristiky s důkazy jejich konzistence a možné aproximace. Shrnutí pak obsahuje funkce pro zadání aplikace A* ve vyvinutém programovém prostředí. Je nutno podotknout, že heuristiky a aproximace mají pro využití v algoritmu A* smysl pouze tehdy, pokud mají polynomiální složitost. 13

14 3.1 Problém obchodního cestujícího (TSP) 3.1.1 Zadání Graf s nezáporným ohodnocením hran G = V, E, c, hledáme nejkratší hamiltonovskou kružnici. Důkaz NP-úplnosti problému viz [5] str. 35-36, 56-60 (Theorem 3.4). Problém obchodního cestujícího (TSP) je standardním příkladem NP-úplného problému, který zůstává NP-úplný i při omezení na ohodnocení splňující trojúhelníkovou nerovnost nebo na ohodnocení hran pouze hodnotami 1 a 2, viz např [5]. To je důsledek toho, že TSP je silně NP-úplný. Pro jeho řešení byla zkonstruována nepřeberná řada algoritmů viz například [7], kap. 21. Převod na A*-graf vychází z principů dynamického programování [3], [6]. Definice 3.1 (A*-graf pro problém TSP). Zvolme libovolně startovní vrchol s V a definujme: V = { M, v M V, s M, v V \ M} {, s, V, s }, E = { M, v, M {v}, w v, w E, M, v, M {v}, w V }, c ( M, v, M {v}, w ) = c( v, w ), s =, s, T = { V, s }. Každá dvojice M, v ; M V, s M, v (V \ M) představuje podúlohu nalezení nejkratší cesty, která začíná ve startovním vrcholu s, projde všechny ostatní vrcholy z M právě jednou a končí ve vrcholu v. Mimoto dvojice, s představuje startovní stav a dvojice V, s představuje celkovou úlohu nalezení nejkratší hamiltonovské kružnice. Lemma 3.2 (Převod TSP na A*-graf). Nalezení minimální cesty v A*-grafu V, E, c, s, T je ekvivalentní s nalezením nejkratší hamiltonovské kružnice v grafu G s ohodnocením c. Důkaz. Každá cesta v A*-grafu z s do T, s, {s}, v 1, {s, v 1 }, v 2,..., M k, v k,..., V \ {v n 1 }, v n 1, V, s odpovídá hamiltonovské kružnici s, v 1,..., v n 1 v grafu G, přičemž délka této cesty je délkou kružnice n 2 c( s, v 1 ) + c( v i, v i+1 ) + c( v n 1, s ). i=1 Naopak každé hamiltonovské kružnici v G odpovídá taková cesta v A*-grafu. Poznámka 3.3 (Velikost A*-grafu pro TSP). Pro graf G s n vrcholy má příslušný A*-graf problému obchodního cestujícího 2 + (n 1) 2 n 2 stavů (viz [6]).

15 3.1.2 Heuristiky Definice 3.4 (1. heuristika pro TSP). U každého vrcholu, ze kterého obchodní cestující ještě nevyšel, vybereme hranu s minimálním ohodnocením. Součet těchto ohodnocení je heuristika. Formálně h ( V, s ) = 0 a pro M V h ( M, x ) = v V \M Tvrzení 3.5. Funkce h je konzistentní heuristika. min{c( v, w ) w (V \ (M {x})) {s}}. Důkaz. Stačí pro všechny stavy M, v V dokázat h ( M, x ) h ( M {x}, y ) + c( x, y ) Z definice heuristiky h plyne: h ( M, x ) h ( M {x}, y ) = = min{c( v, w ) w (V \ (M {x})) {s}} protože v V \M v V \(M {x}) min{c( v, w ) w (V \ (M {x, y})) {s}} min{c( x, w ) w (V \ (M {x})) {s}} c( x, y ) (V \ M) \ (V \ (M {x})) = {x}. Společně s tím, že h ( V, s ) = 0, je podle lemmatu 2.5 funkce h konzistentní heuristika. Definice 3.6 (2. heuristika pro TSP). U každého vrcholu, kam obchodní cestující ještě nevstoupil, vybereme hranu s minimálním ohodnocením. Součet těchto ohodnocení je heuristika. Formálně h ( V, s ) = 0 a pro M V h ( M, x ) = min{c( v, w ) v V \ M}. w (V \(M {x})) {s} Tvrzení 3.7. Funkce h je konzistentní heuristika.

16 Důkaz. Důkaz konzistence je analogický předchozímu. Pozorování 3.8. Heuristika h není silnější než heuristika h a heuristika h není silnější než heuristika h. Důkaz. Jako protipříklad uvažujme toto zadání problému obchodního cestujícího: úplný graf V, E, c s ohodnocením s, v E : c( s, v ) = 1, kde s V je startovní vrchol, c( v, w ) = 2 jinde. Pak pro startovní stav, s je h (, s ) = 2 ( V 1) + 1, h (, s ) = V, takže h není silnější než h. Analogický protipříklad ukáže, že také h není silnější než h. Definice 3.9 (3. heuristika pro TSP). Kombinací obou heuristik získáme silnější heuristiku, která vede k větší redukci prohledané části A*-grafu (viz lemma 2.17): h(x) = max{ h (x), h (x)}. 3.1.3 Aproximace Hladově po minimálních hranách (horší aproximace než heuristikou generovaná): Doplňujeme cestu na hamiltonovskou kružnici tak, že u každého vrcholu vybereme hranu, která má nejmenší ohodnocení z hran, které vedou do vrcholů, kde obchodní cestující ještě nebyl. 3.1.4 Funkce pro A* start() = (, s). cil(x) uspěje pokud x = V, s. naslednici( M, v ) = { M {v}, w v, w E, w / M} pro M {v} V, = { V, s } jinak. oceneni( M, v, M {v}, w ) = c( v, w ). heuristika(x) viz 3.1.2 aproximace(x) viz 3.1.3

17 3.2 Vrcholové pokrytí (VP) 3.2.1 Zadání Pro neorientovaný graf G = V, E hledáme množinu vrcholů X V takovou, že každá hrana z E je pokrytá alespoň jedním vrcholem z X. Chceme, aby tato množina pokrývajících vrcholů byla co nejmenší. Důkaz NP-úplnosti problému viz [5] str. 54-56 (Theorem 3.3). Vrcholové pokrytí bylo vybráno jako klasická NP-úplná úloha z teorie grafů, která je minimalizační (je duální k úloze hledání maximální nezávislé množiny vrcholů). Na rozdíl od ostatních v této práci řešených problémů je u vrcholového pokrytí uniformní ohodnocení hran. V příslušném A*-grafu tak mají všechny cesty z počátečního do libovolného stavu stejnou délku. Třída cílových stavů (pokrývajících množin vrcholů) může být rozsáhlá je uzavřená na nadmnožiny, které ovšem nebudou algoritmem A* generovány. Pro VP existuje 2-aproximační algoritmus, tj. aproximace, která má poměrovou chybu ρ(n) = 2, viz aproximace (3.2.3.2). Definice 3.10 (A*-graf pro problém VP). Pro každou množinu vrcholů X V označme množinu nepokrytých hran: Definujme: N(X) = {{v, w} E X {v, w} = } V = {X X V } = P(V ), E = { X, X {v} v V \ X}, c ( X, X {v} ) = 1, s =, T = {X N(X) = }. Lemma 3.11 (Převod VP na A*). Nalezení minimální cesty v A*-grafu V, E, c, s, T je ekvivalentní s nalezením minimálního vrcholového pokrytí v grafu G. Důkaz. Každému vrcholovému pokrytí X V grafu G odpovídá cílový stav X T v A*-grafu. Libovolná cesta z s do X má přitom délku X. 3.2.2 Heuristika Definice 3.12 (1. heuristika pro VP). Bud G N (X) podgraf G, který obsahuje pouze hrany v N(X). Heuristikou h(x) je nejmenší k N takové, že k (deg GN(X) (v i )) N(X), i=1

18 kde v 1,..., v k jsou vrcholy z G N (X), seřazené sestupně podle deg GN(X). Pro cílový stav X G, N(X) = definujeme h(x) = 0. To znamená: z vrcholů, které jsou v G N (X), vybíráme vrcholy, dokud součet jejich stupňů nedosáhne N(X). Minimální počet takových vrcholů je heuristika, nebot přinejmenším takový počet vrcholů bude nutno zařadit do libovolného pokrytí zbývajících hran. Tvrzení 3.13. Funkce h je konzistentní heuristika. Důkaz. Je třeba ukázat, že X V, v V \ X platí h(x) 1 + h(x {v}). Necht X V, v V \ X. Označme N(X) = n 1, N(X {v}) = n 2, w X : d(w) = deg GN(X) (w), d (w) = deg GN(X {v}) (w). Zřejmě platí n 2 = n 1 d(v). Necht h(x {v}) = k a b 1,..., b k jsou vrcholy v G N(X {v}) takové, že platí d (b 1 ) +... + d (b k ) N(X {v}) = n 2. Uvažujme vrcholy b 1,..., b k v grafu G N(X). Definujme d + (b i ) = d (b i )+1, pokud {b i, v} E a d + (b i ) = d (b i ) jinak. Pak d + (b 1 ),..., d + (b k ) jsou stupně vrcholů b 1,..., b k v grafu G N(X). Platí d + (b 1 ) +... + d + (b k ) + d(v) d (b 1 ) +... + d (b k ) + d(v) n 2 + d(v) = n 1, tedy h(x) nemůže být větší než k + 1, takže h(x) 1 + h(x {v}). Společně s tím, že h(x) = 0 pro X T, je podle lemmatu 2.5 funkce h konzistentní heuristika. 3.2.3 Aproximace 1. Hladová: Ze zbylých vrcholů z G N(X) vybereme do pokrytí vrchol s největším stupněm a iterujeme, dokud zbývá nějaká nepokrytá hrana. 2. Hranová (2-aproximace): Z N(X) vybereme libovolnou hranu. Do pokrytí přidáme oba její vrcholy a iterujeme. 3.2.4 Funkce pro A* start() =. cil(x) uspěje, pokud N(X) =. naslednici(x) = {X {v} v (V \ X)}. oceneni(x, X {v}) = 1. heuristika(x) viz 3.3.2 aproximace(x) viz 3.3.3

19 3.3 Problém batohu (PB) 3.3.1 Zadání Máme n předmětů o objemu o i > 0 a ceně c i > 0 a batoh o objemu K > 0. Chceme vybrat takové předměty, které se do batohu vejdou ( o i K) a jejichž součet cen je co největší. Důkaz NP-úplnosti problému viz [5] str. 247 MP9. Pro problém batohu existuje úplně polynomiální aproximační schéma. Protože maximalizační problém nevyhovuje pro aplikaci A*, budeme řešit opačný problém: hledáme ty předměty, které do batohu nedáme, a chceme, aby jejich cena byla co nejmenší. Proto začneme s přeplněným batohem, kde budou všechny předměty, a budeme z něj předměty postupně odebírat, tak, aby se tam zbytek vešel. Stavem bude množina indexů předmětů v batohu. Startovní stav bude obsahovat všechny předměty, cílové stavy budou reprezentovat množiny předmětů, které se již vejdou do batohu. Třída cílových stavů je tak uzavřena na podmnožiny, které ovšem nebudou algoritmem A* dále generovány. Definice 3.14 (A*-graf pro problém PB). Označme I = {1,..., n} množinu indexů všech předmětů a definujme: V = {X X I} = P(I), E = { X, X \ {i} i X}, c ( X, X \ {i} ) = c i, s = I, T = {X V o i K}. i X Lemma 3.15 (Převod PB na A*). Nalezení minimální cesty v A*-grafu V, E, c, s, T je ekvivalentní s vyřešením problému batohu. Důkaz. Každý cílový stav X T představuje jedno přípustné řešení daného problému batohu. Délka každé cesty z s do X v A*-grafu je součtem cen předmětů, které do batohu nedáme (tj. předmětů s indexy I \ X). Minimální cesta v A*-grafu tak dává maximální cenu předmětů, které se do batohu vejdou. 3.3.2 Heuristika Definice 3.16 (1. heuristika pro PB). Počítáme, jako kdyby šlo předměty dělit. Bereme předměty z X sestupně podle o i c i a odebereme jich tolik (případně z posledního jen část), aby se objem zbylých předmětů rovnal objemu batohu. Cena takto vyhozených předmětů (z posledního jen patřičná část) je heuristika h(x). Formálně: Přečíslujme předměty z X tak, aby byly seřazeny sestupně podle o i c i, tedy o 1 c 1 o 2 c 2... on c n. Definujme přebytečný objem v batohu K (X) = i X o i K. Pak objem

20 odebíraných předmětů je o 1 +...+o k 1 +p o k = K (X) a jejich cena c 1 +...+c k 1 +p c k = h(x), kde p je poměr rozdělení posledního předmětu: 0 p = K (X) (o 1 +... + o k 1 ) o k 1. Pokud je K (X) 0, jde o cílový stav a h(x) = 0. Tvrzení 3.17. Funkce h je konzistentní heuristika. Důkaz. Je třeba ukázat, že X I, y X platí h(x) c y + h(x \ {y}). Necht X I, y X; x 1,..., x n jsou patřičně seřazené předměty. Platí: K (X \ {y}) = i X o i o y K = K (X) o y. 1. Pokud y {x 1,..., x k 1 }, pak h(x \ {y}) = c 1 +... + c k 1 + p c k c y = h(x) c y. 2. Jinak y = x k nebo y / {x 1,..., x k }. Pro oba případy označme l počet předmětů odebraných heuristikou h(x \ {y}) a p poměr pro rozdělení posledního odebíraného předmětu v téže heuristice. Tedy h(x \ {y}) = c 1 +... + c l 1 + p c l, K (X \ {y}) = o 1 +... + o l 1 + p o l. Víme, že rozdíl přebytečného objemu je Ale také K (X) K (X \ {y}) = o y. K (X) K (X \ {y}) = = (o 1 +... + o k 1 + p o k ) (o 1 +... + o l 1 + p o l ) = = (1 p ) o l + o l+1 +... + o k 1 + p o k. Označme c h rozdíl obou heuristik: c h = h(x) h(x \ {y}) = = (c 1 +... + c k 1 + p c k ) (c 1 +... + c l 1 + p c l ) = = (1 p ) c l + c l+1 +... + c k 1 + p c k. Díky seřazení předmětů platí: o y c y o k c k o k 1 c k 1... o l+1 c l+1 o l c l.

21 Protože pro kladná čísla platí x a b c d x a+c b+d, dostáváme: Tedy o y c y p o k + o k 1 +... + o l+1 + (1 p ) o l p c k + c k 1 +... + c l+1 + (1 p ) c l c y c h = h(x) h(x \ {y}). = o y c h. Společně s tím, že h(x) = 0 pro X T, je podle lemmatu 2.5 funkce h konzistentní heuristika. 3.3.3 Aproximace Stejně jako heuristika, ale poslední předmět nedělíme, odstraníme ho celý. 3.3.4 Funkce pro A* start() = I. cil(x) uspěje, pokud i X o i K. naslednici(x) = {X \ {i} i X}. oceneni(x, X \ {i}) = c i. heuristika(x) viz 3.3.2 aproximace(x) viz 3.3.3 3.4 Rozvrhování úloh (RU) 3.4.1 Zadání Máme n úloh daných hodnotami c i, t i, p i, r i R + 0, kde c i určuje čas potřebný na provedení úlohy, t i určuje čas požadovaného ukončení úlohy, penále p i určuje postih za nestihnutí úlohy v požadovaném čase a konečně r i je koeficient růstu penalizace. Definujme nákladovou funkci: f i : R + 0 R + 0, f i (t) = p i + r i (t t i ) pro t > t i, f i (t) = 0 jinak. Chceme seřadit úlohy tak, aby součet jejich nákladových funkcí v čase ukončení úlohy byl co nejmenší. Jinými slovy hledáme permutaci q(i) takovou, aby minimalizovala celkové náklady f i (s i + c i ), kde s i = c j je začátek provádění úlohy i. q(j)<q(i) Důkaz NP-úplnosti problému viz [5] str. 236-237, SS3.

22 Zvolená varianta problému rozvrhování úloh je jedna z jednodušších, avšak vystihuje kombinatorickou podstatu problémů rozvrhování [14] a je NP-úplná. Heuristické odhady jsou zde obtížné vzhledem k tomu, že nákladové funkce závisí na čase. Pro důkazy konzistence námi navržených odhadů stačí, že nákladové funkce jsou neklesající. Definice 3.18 (A*-graf pro problém RU). Označme I = {1,..., n} množinu všech indexů úloh, stav bude podmnožina X I, která představuje podproblém rozvržení úloh z X. Pro X I označme součet časů úloh z této podmnožiny c X = c i. Definujme: i X V = {X X I} = P(I), E = { X, X {i} i I \ X}, c ( X, X {i} ) = f i (c X + c i ), s =, T = {I}. Lemma 3.19 (Převod RU na A*). Nalezení minimální cesty v A*-grafu (V, E, c, s, T ) je ekvivalentní s vyřešením problému rozvrhování úloh. Důkaz. Každá cesta z s do T v A*-grafu představuje jednu permutaci (rozvržení úloh). Délka této cesty je součet nákladových funkcí pro toto rozvržení. 3.4.2 Heuristika Definice 3.20 (1. heuristika pro RU). Sečteme nákladové funkce zbývajících úloh, kdyby byly rozvrženy jako první: h 1 (X) = h 1 (I) = 0. i (I\X) f i (c X + c i ) pro X I, Tvrzení 3.21. Funkce h 1 je konzistentní heuristika. Důkaz. Je třeba ukázat že pro každé X I, y I \ X platí h 1 (X) f y (c X + c y ) + h 1 (X {y}). Díky tomu, že nákladové funkce jsou neklesající, pro i I \ (X {y}) platí: f i (c X + c i ) f i (c (X {y}) + c i ) = f i (c X + c y + c i ).

23 Odtud získáme i (I\X) f i (c X + c i ) f y (c X + c y ) + i (I\(X {y})) f i (c (X {y}) + c i ). Společně s tím, že h 1 (I) = 0, je h 1 podle lemmatu 2.5 konzistentní heuristika. Definice 3.22 (2. heuristika pro RU). Bud c seznam časů zbývajících úloh seřazených do neklesající posloupnosti podle jejich času. V každém bodě, kde by končila nějaká úloha podle tohoto rozvržení, určíme minimální nákladovou funkci přes všechny zbývající úlohy. Heuristika bude součet těchto minim. h 2 (X) = h 2 (I) = 0. I\X i=1 min f j(c X + j (I\X) i c k) pro X I, k=1 Tvrzení 3.23. Funkce h 2 je konzistentní heuristika. Důkaz. Je třeba ukázat, že pro každé X I, y I \ X platí h 2 (X) f y (c X + c y ) + h 2 (X {y}). Necht X I, y I \ X. Pro libovolné časy t 1, t 2 platí: t 1 t 2 min f j (t 1 ) min f j (t 2 ), j I\X j I\(X {y}) protože nákladové funkce f j jsou neklesající. Označme n = I \ X, dále m takový index, že c m = c y, a pro všechna i {1,..., n} : c i = i k=1 c k,. Označme T rozvržení časů podle heuristiky h 2(X) a T rozvržení, které začíná časem úlohy y a pak následuje rozvržení podle heuristiky h 2 (X {y}): T = c X + c 1, c X + c 2,..., c X + c m, c X + c m+1,..., c X + c n, T = c X + c m, c X + c m + c 1,..., c X + c m + c m 1, c X + c m+1,..., c X + c n. Pak stačí ukázat, že i {1,..., n} : T i T i. To je ale pravda, protože platí i {1,..., m} : c i c m + c i 1 a pro i > m : T i = T i. Odtud plyne n min f j(t i ) f y (T 1) + j (I\X) i=1 n min f j(t i ), j (I\(X {y})) i=2

24 tedy I\X i=1 min j (I\X) f j (c X + i c k ) f y (c X + c y ) + k=1 I\X {y} i=1 min j (I\(X {y})) f j (c (X {y}) + i c k ). Společně s tím, že h 2 (I) = 0, je h 2 podle lemmatu 2.5 konzistentní heuristika. Pozorování 3.24. Heuristika h 1 není silnější než heuristika h 2 a heuristika h 2 není silnější než heuristika h 1. Důkaz. Jako první protipříklad uvažujme zadání RU se dvěma úlohami s hodnotami c 1 = c 2 > 0, t 1 = t 2 = 0, p 1 > p 2 > 0, r 1 = r 2 = 0. Pak h 1 ( ) = p 1 + p 2, h 2 ( ) = 2 p 2, tedy h 2 není silnější než h 1. Druhý protipříklad bude mít stejné zadání až na to, že stanovíme t 1 = t 2 = c 1 = c 2 > 0. Pak h 1 ( ) = 0, h 2 ( ) = p 2, tedy h 1 není silnější než h 2. Definice 3.25 (3. heuristika pro RU). Kombinací obou heuristik získáme silnější heuristiku, která vede k větší redukci prohledané části A*-grafu (viz lemma 2.17): h 3 (X) = max{h 1 (X), h 2 (X)} pro X I. 3.4.3 Aproximace 1. Zbylé úlohy seřadíme sestupně podle nákladové funkce v čase, když by byla tato úloha rozvržena jako hned následující. Vybereme úlohu s nejdražším penále a iterujeme. Pro stav X tedy vybereme úlohu s max f i(c X + c i ). i I\X 2. Podobně jako předchozí, akorát vybíráme podle průměru nákladových funkcí při rozvržení na začátku a na konci. Pro stav X tedy vybereme úlohu s max i I\X f i (c X + c i ) + f i (c I ). 2 3.4.4 Funkce pro A* start() =. cil(x) uspěje, pokud X = I. naslednici(x) = {X {i} i I \ X}. oceneni(x, X {i}) = f i (c X + c i ). heuristika(x) viz 3.4.2. aproximace(x) viz 3.4.3. k=1

Kapitola 4 Implementace - uživatelská dokumentace Jako uživatelské rozhraní pro vytvořený programový systém bylo vyvinuto jednoduché grafické prostředí. Po výběru řešeného optimalizačního problému následuje jeho zadání, kde může uživatel zvolit načtení dat ze souboru, nebo náhodné generování dat. Možná je též úprava aktuálního zadání a jeho uložení do souboru pro opakované spuštění (například s jinými parametry). Balík s programovým prostředím je ke stažení na adrese http://code.google.com/p/onpstar. Obrázek 4.1: Výběr řešeného optimalizačního problému 4.1 Instalace a spuštění grafického rozhraní Grafické rozhraní bylo napsáno v programovacím jazyce Python s využitím grafické knihovny Tkinter. Protože programový systém požaduje platformu Linux, není zatím použití jiné platformy možné (viz sekce 5.1). Spuštění grafického rozhraní tak vyžaduje programovací jazyk Python, grafickou knihovnu Tk, a její podporu pro Python: python-tk (v distribuci Debian splní všechny tyto požadavky instalace balíku python-tk). 25

26 K instalaci stačí překopírovat obsah balíku do libovolného adresáře na pevném disku. Při výpočtu větších zadání může program vyžadovat poměrně velké místo na pevném disku, je proto vhodné na něm mít dost volného místa. Spuštění grafického rozhraní se provede spuštěním skriptu onp-star-gui. Adresářová struktura: bin spustitelné soubory programového systému (pro každý řešený optimalizační problém jeden, jsou to tsp, vp, pb, ru), gui grafické rozhraní, src zdrojové kódy, examples ukázková zadání, tyto lze pomocí uživatelského prostředí načíst. 4.2 Výběr optimalizačního problému a zadání vstupních dat Je možno zvolit jeden ze čtyř implementovaných optimalizačních NP-úplných problémů popsaných v kapitole 3 - viz obrázek 4.1. Pro jednotlivé optimalizační problémy se zadávají vstupní data v různé struktuře. Vždy lze zadání načíst z připraveného souboru, nebo je náhodně generovat. Takto připravená data lze libovolně upravovat a případně uložit. Při generování dat se použije zadaná velikost úlohy, a objeví se dialog, ve kterém je možné nastavit rozmezí generovaných čísel. Velikost úlohy lze kdykoliv změnit, přičemž tato změna není destruktivní, tedy při zmenšení velikosti zůstane zachována patřičná počáteční část dat. Některá předpřipravená zadání lze nalézt v adresáři examples. Pokud si zadání zapomenete uložit, nic se neděje, program automaticky ukládá poslední zadání do souboru examples/last. 4.2.1 Problém obchodního cestujícího Zadání ohodnoceného grafu pro problém obchodního cestujícího probíhá pomocí matice, viz obrázek 4.2. Políčko v řádku i a sloupci j určuje ohodnocení hrany z vrcholu i do vrcholu j. Zadáním jakékoli záporné hodnoty se příslušná hrana odstraní z grafu. Je ovšem třeba upozornit, že program nijak nekontroluje, zda v zadaném grafu existuje hamiltonovská kružnice. V případě, že neexistuje, chování programu není definované. 4.2.2 Vrcholové pokrytí Neorientovaný graf pro vrcholové pokrytí se zadává pomocí trojúhelníkové matice sousednosti, reprezentované zaškrtávacími políčky, viz obrázek 4.3. Zaškrtnutím políčka na i-tém řádku a j-tém sloupci označíme přítomnost hrany mezi vrcholy i a j v grafu.

27 Obrázek 4.2: Zadání TSP maticí ohodnocených hran Obrázek 4.3: Zadání grafu pro VP trojúhelníkovou maticí sousednosti 4.2.3 Problém batohu Předměty pro zadání problému batohu se zadávají do tabulky, kde každý řádek představuje jeden předmět, viz obrázek 4.4. Navíc se určuje objem batohu. Všechny tyto hodnoty musí být nezáporné.

28 4.2.4 Rozvrhování úloh Obrázek 4.4: Zadání objemů a cen předmětů pro PB Úlohy pro zadání rozvrhování úloh se zadávají do tabulky, kde každý řádek představuje jednu úlohu, viz obrázek 4.5. Všechny tyto hodnoty musí být nezáporné. 4.3 Parametry Parametry běhu A* jsou dvojího druhu (viz obrázek 4.6. Nejprve může uživatel volit heuristiku a aproximaci z nabídky uvedené v textu k vybranému optimalizačnímu problému (viz kapitola 3). Heuristika 0 znamená použití nulové heuristiky (viz poznámka 2.15). Aproximace 0 znamená použití heuristikou generované aproximace (viz poznámka 2.19). Dále jsou zadávány technické parametry týkající se rozsahu haldy a B-stromu (tyto parametry mimo jiné ovlivňují množství použité paměti při výpočtu). V zadání parametrů jsou nabízeny vhodné předdefinované hodnoty.

29 Obrázek 4.5: Zadání úloh pro RU 4.4 Průběžné informace o výpočtu a výsledné řešení Po spuštění probíhá vlastní výpočet (viz obrázek 4.7), jehož průběh je zobrazován ve formě údajů o dosaženém dolním odhadu optima (vycházející z použité heuristiky postupně roste), horním odhadu optima (vycházející z použité aproximace při nalezení lepší aproximace klesne) a jemu odpovídajícímu nejlepšímu známému řešení. Poměr mezi oběma odhady ukazuje, jak se běh algoritmu přibližuje k cíli. Další informace se týkají rozsahu provedeného prohledávání (počet expanzí) a aktuální velikosti haldy. U rozsáhlejších zadání dochází k překročení maximálního zadaného rozměru haldy, což vede k odkládání části položek do vnější paměti (viz údaje o odkládací mezi počtu odložených položek a obsazené paměti). Tyto údaje během výpočtu kolísají. Po úspěšném zakončení běhu se objeví výsledné optimum, nalezené optimální řešení a celkový počet expanzí (viz obrázek 4.8), který dokumentuje složitost provedeného výpočtu. Poznamenejme, že při řešení jednoho příkladu lze použít různé heuristiky a aproximace. Výsledkem však musí být stejné optimum. Lišit se může nalezené optimální řešení (může se to to stát v případě že existuje více optimálních řešení běžné třeba u VP). Výrazně se může lišit počet expanzí v závislosti na síle použité heuristiky ve vztahu k danému zadání úlohy.

30 Obrázek 4.6: Zadání parametrů běhu algoritmu A* Obrázek 4.7: Průběžné výsledky Obrázek 4.8: Výsledné řešení

Kapitola 5 Implementace - programátorská dokumentace Implementován je algoritmus A* s aproximací (algoritmus 2.2). Program je napsán obecně a využívá funkcí z definice 2.9, které reprezentují A*-graf pro optimalizační problém (ne nutně NP-úplný). Implementace je provedena v jazyce C, který byl vybrán pro svoji rychlost. Při psaní programu byl brán zřetel na šetření pamětí a rychlost. Také z tohoto důvodu nejsou použity žádné externí knihovny a všechny datové struktury jsou napsány s přihlédnutím ke specifickým požadavkům algoritmu A*. Algoritmus A* při své práci volá funkce, které definují jednotlivé optimalizační problémy. Přiřazením zdrojového kódu pro daný problém ke kódu pro A* vznikne samostatný spustitelný program. 5.1 Instalace a spuštění K instalaci stačí překopírovat obsah instalačního balíku do libovolného adresáře na pevném disku. Spustitelné soubory pro platformu Linux jsou v adresáři bin. 5.1.1 Ovládání programu z příkazové řádky Základní program nepoužívá žádné grafické prostředí, volby pro běh programu lze zadat použitím voleb na příkazové řádce. Grafický program popsaný v kapitole 4 je pouze jeho grafickou nadstavbou, která spustí program pro daný problém s příslušnými volbami a interpretuje jeho výstup. Na příkazové řádce lze využít následující volby: -v ovládá upovídanost programu. Očekává nezáporné celé číslo. Základní hodnota je 1, možnosti jsou 0-4. -f specifikuje soubor, který obsahuje zadání. 31

32 -s pokud není určen soubor se zadáním, specifikuje velikost náhodně vygenerovaného problému, který se použije. Pokud je určen soubor se zadáním pomocí parametru -f, hodnota -s se ignoruje. Musí být kladné celé číslo. Základní hodnota: 20. -h specifikuje číslo použité heuristiky. 0 označuje nulovou heuristiku. Základní hodnota je vždy nejvyšší přípustné číslo (podle počtu heuristik pro daný problém). -a stejné jako -h, ale pro aproximace. 0 označuje použití heuristikou generované aproximace. -u specifikuje hodnotu heapmax, tedy maximální velikost haldy. Podrobnosti v sekci 5.2. Základní hodnota: 50000. -d specifikuje hodnotu heapmin, tedy velikost haldy, na kterou se zmenší, pokud dojde k překročení heapmax. Podrobnosti v sekci 5.2. Základní hodnota: 100000. -m velikost paměti v MB pro cache B-stromu. Základní hodnota: 100. Přípustné volby jsou pro všechny čtyři spustitelné soubory stejné. 5.1.2 Formát vstupních souborů Formát zadání jednotlivých problémů (tedy souborů předaných parametrem -f) je následující. Pro zadání problému obchodního cestujícího a problému vrcholového pokrytí je formát jednotný: na prvním řádku je přirozené číslo označující počet vrcholů n = V grafu; na dalších řádcích je graf zadaný maticí ohodnocení hran. Matice musí být zadaná jako n n desetinných čísel oddělených mezerou nebo novým řádkem. Tyto hodnoty jsou použity pro vyplnění matice n n po řádcích. Každá hodnota může být celé nebo desetinné číslo. Jakákoliv záporná hodnota znamená, že se příslušná hrana nebude v grafu vyskytovat. Hodnoty na diagonále se ignorují, program se chová tak, jako kdyby tam byla záporná hodnota. U zadání problému batohu je na prvním řádku desetinné číslo určující objem batohu. Na druhém řádku je přirozené číslo n určující počet předmětů. Následuje n řádků se dvěma desetinnými čísly oddělenými mezerou, které určují objem a cenu předmětu. Všechna čísla v zadání musí být nezáporná. U zadání problému rozvrhování úloh je na prvním řádku přirozené číslo n určující počet úloh. Následuje n řádků se čtyřmi desetinnými čísly oddělenými mezerou, které určují postupně čas úlohy, čas požadovaného skončení úlohy, penále za nestihnutí a koeficient růstu penále. Všechna čísla v zadání musí být nezáporná. Místo jakéhokoliv desetinného čísla může být číslo celé (které bude programem převedeno na desetinné). Při nesplnění některého z požadavků program vypíše chybové hlášení a skončí.

33 5.1.3 Kompilace Program byl vyvíjen v operačním systému Linux s použitím kompilátoru gcc. Pro zkompilování programu stačí spustit příkaz make v adresáři src. Tím by se měly vytvořit spustitelné soubory tsp, vp, pb, ru v adresáři bin. 5.2 Datové struktury Algoritmus A* používá ke své práci dvě množiny prvků: open a closed. V každém kroku algoritmu se z open vybere minimální prvek a ten se z open odstraní (a přesune se do closed). Struktura starající se o open musí také umět zmenšit hodnotu nějakého prvku, aniž by se porušila jednoduchost výběru prvku minimálního. Dále je potřeba v open i closed rychle vyhledat přítomnost nějakého prvku. Pokud je nalezen, tak zjistit, jestli se nachází v open nebo closed. S vědomím těchto předpokladů byly zvoleny následující datové struktury: K implementaci open je použita minimální halda (tedy halda s minimem v kořeni, viz [10], str. 35). Tato halda navíc implementuje funkci HeapDecreaseKey, která umožňuje po zmenšení hodnoty prvku jeho správné přeřazení uvnitř haldy. Dále halda podporuje volání zadané funkce vždy, když se změní pozice prvku v haldě (volání HeapDecreaseKey vyžaduje pozici prvku v haldě). K uložení všech prvků (tj. uzavřené prvky množina closed a prvky v haldě množina open) a jejich vyhledávání jsou použity tzv. hrábě, tedy hashovací tabulka, kde každý záznam v tabulce představuje seznam prvků. Protože při řešení větších zadání velikost haldy neúměrně roste a s ní i pamět ové nároky, odkládá se část dat do souboru. Toto odkládání je řízeno dvěma parametry: heapmax (maximální velikost haldy, která se nemůže překročit) a heapmin (velikost, na kterou se zmenší velikost haldy při překročení heapmax). Pokud velikost haldy překročí heapmax, zmenší se velikost haldy na heapmin odložením prvků z haldy do souboru. Zároveň se nastaví parametr odkladlimit na hodnotu posledního prvku haldy. Při vkládání nového prvku do haldy se nejprve porovná s parametrem odkladlimit; pokud je hodnota prvku větší, prvek se do haldy nevloží, ale odloží se do souboru. Tím pádem dříve nebo později dojde k vyprázdnění haldy. Ve chvíli, kdy se to stane, naplníme haldu prvky ze souboru na velikost heapmin. Může se stát, že v odkládacím souboru bude nějaký prvek vícekrát (vygeneruje se stejný stav). Toto se řeší při načítání prvků ze souboru, kdy se kontrolují duplicity a do haldy se dá prvek s nejmenším odhadem. Také je možné, že se v odkládacím souboru vyskytují prvky s odhadem větším nebo rovným aproximaci. Tyto prvky prostě při načítání nezařadíme do haldy. K odkládání do souboru se používá B-strom (viz [10], sekce 5.1). Díky tomu můžeme odložené prvky řadit za běhu a není třeba při načítání prvků z odkládacího souboru všechny projít (což by bylo značně neefektivní).

34 5.2.1 Halda a hrábě Je použita binární halda. Halda zaručuje operace vložení prvku, vyjmutí minimálního prvku a zmenšení hodnoty nějakého prvku v čase O(log n). Implementace haldy je napsána obecně, umožňuje pracovat s jakoukoliv strukturou, k porovnávání jednotlivých prvků používá dodanou porovnávací funkci. Hrábě se skládají z hashovací tabulky, jejíž každý řádek obsahuje seznam prvků, které mají stejný hash. Podrobnější popis takových struktur lze nalézt například v [13], sekce 6.8. Hashovací funkce musí být definována v závislosti na řešeném problému, protože A* nic neví o datech, která jsou pro optimalizační problém používána k reprezentaci stavů. Čas potřebný k vyhledání daného prvku záleží na kvalitě hashovací funkce: pokud by hashovací funkce zaručovala rovnoměrné rozdělení, byl by to O(n/hashMax), kde hashmax je velikost hashovací tabulky. 5.2.2 B-strom Jako sekundární pamět algoritmu A* byla použita lehce modifikovaná varianta tzv. redundantního B + -stromu, kdy nelistové uzly mohou obsahovat více položek než listové uzly: Definice 5.1 (B-strom pro A*). Redundantní B + -strom řádu (n, m) je orientovaný strom, který splňuje následující požadavky: 1. Kořen má nejméně 2 potomky, pokud není listem. 2. Každý nekořenový nelistový uzel má nejméně n a nejvýše n potomků. 2 3. Každý list má nejméně m a nejvýše m datových záznamů. 2 4. Všechny cesty z kořene do listu jsou stejně dlouhé. 5. Data v nelistovém uzlu jsou organizována následovně: p 0, (k 1, p 1 ), (k 2, p 2 ),..., (k l, p l ) kde p i jsou ukazatele na potomky, k i jsou klíče, které jsou uspořádány vzestupně. 6. Data v listovém uzlu jsou organizována následovně: p r, (k 1, d 1 ), (k 2, d 2 ),..., (k l, d l ) kde p r je ukazatel na pravého souseda (listový uzel nejblíže vpravo), k i jsou klíče, které jsou uspořádány vzestupně, d i jsou ke klíči asociovaná data, (k i, d i ) představuje jeden datový záznam. 7. Odpovídá-li ukazateli p i podstrom U(p i ), potom pro všechny nelistové uzly a všechny i {1,... n} platí: