VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY FAKULTA STROJNÍHO INŽENÝRSTVÍ ÚSTAV MATEMATIKY FACULTY OF MECHANICAL ENGINEERING INSTITUTE OF MATHEMATICS MATEMATICKÉ MODELY DOPRAVNÍCH ÚLOH MATHEMATICAL MODELS FOR TRANSPORTATION PROBLEMS BAKALÁŘSKÁ PRÁCE BACHELOR S THESIS AUTOR PRÁCE AUTHOR VEDOUCÍ PRÁCE SUPERVISOR HELENA PASCHKEOVÁ RNDr. PAVEL POPELA, Ph.D. BRNO 2012
Vysoké učení technické v Brně, Fakulta strojního inženýrství Ústav matematiky Akademický rok: 2011/2012 ZADÁNÍ BAKALÁŘSKÉ PRÁCE student(ka): Helena Paschkeová který/která studuje v bakalářském studijním programu obor: Matematické inženýrství (3901R021) Ředitel ústavu Vám v souladu se zákonem č.111/1998 o vysokých školách a se Studijním a zkušebním řádem VUT v Brně určuje následující téma bakalářské práce: v anglickém jazyce: Matematické modely dopravních úloh Mathematical models for transportation problems Stručná charakteristika problematiky úkolu: Student se seznámí s problematikou matematických modelů dopravních úloh, včetně jejich významu pro logistické aplikace. Zaměří se zejména na úlohy matematického programování s důrazem na úlohy o toku v sítích a úlohy založené na modifikacích úlohy obchodního cestujícího. Budou studovány vlastnosti vybraných úloh, modifikovány algoritmy a realizovány testovací výpočty s využitím dat z realných aplikací. Cíle bakalářské práce: Předpokládá se vývoj původních i modifikace existujících modelů a algoritmů a jejich aplikace v návaznosti na problémy řešené v rámci spolupráce ústavu matematiky FSI VUT v Brně se specialisty v oblasti logistiky z norské Molde University College (prof. Kjetil Kare Haugen).
Seznam odborné literatury: Christofides. N..: Graph Theory - an Algorithmic Approach. Academic Press 1975. Wolsey L. A.: Integer programming. John Wiley and Sons, 1998. Ghiani, G., Laporte, G., Musmanno, R.: Introduction to Logistics Systems Planning and Control. John Wiley and Sons, New York, 2004. Vedoucí bakalářské práce: RNDr. Pavel Popela, Ph.D. Termín odevzdání bakalářské práce je stanoven časovým plánem akademického roku 2011/2012. V Brně, dne 29.10.2011 L.S. prof. RNDr. Josef Šlapal, CSc. prof. RNDr. Miroslav Doupovec, CSc., dr. h. c. Ředitel ústavu Děkan fakulty
Abstrakt Práce se zabývá modelováním a řešením vybraných dopravních úloh. Nejprve jsou uvedeny historické postřehy, praktické poznatky a formulovány vybrané problémy. Potom se práce věnuje modelování vybraných dopravních úloh pomocí matematického (lineárního a celočíselného) programování a teorie grafů. Pozornost je především věnována problému obchodního cestujícího a různým metodám jeho řešení a jejich modifikacím. V práci jsou rovněž uvedeny komentáře k originální programové implementaci modelů a algoritmů, a to jak modelů v systému GAMS, tak grafových algoritmů v jazyce Python. Algoritmy byly testovány na úloze zahrnující 73 bývalých okresních měst v ČR. Vysledky testování jsou v závěrečné části porovnány a vyhodnoceny. Summary The thesis deals with modelling and solution techniques for the selected transportation problems. Firstly, historical remarks and application-related comments are introduced. Then the selected transportation problems are defined and mathematical programming and graph theory concepts are utilised to model them. The travelling salesman problem and suitable algorithms are under focus. The original implementation in GAMS and Python is discussed. Algorithms have been tested for the instance based on the set of 73 towns in the Czech Republic. Finally, the test results are evaluated and compared. Klíčová slova dopravní úlohy, optimalizace, teorie grafů, problém obchodního cestujícího, heuristiky Keywords transportation problem, optimization, graph theory, travelling salesman problem, heuristics PASCHKEOVÁ, H. Matematické modely dopravních úloh. Brno: Vysoké učení technické v Brně, Fakulta strojního inženýrství, 2012. 60 s. Vedoucí RNDr. Pavel Popela, Ph.D.
Prohlašuji, že jsem bakalářskou práci Matematické modely dopravních úloh vypracovala samostatně s použitím materiálů uvedených v seznamu literatury. Helena Paschkeová
Ráda bych zde poděkovala vedoucímu bakalářské práce RNDr. Pavlu Popelovi, PhD. za jeho cenné rady a čas, který mi věnoval při řešení dané problematiky. V neposlední řadě také děkuji všem, kteří se podíleli na jazykové korektuře této bakalářské práce. Helena Paschkeová
Obsah 1 Dopravní úlohy 13 1.1 Historie..................................... 13 1.2 Praktické poznatky............................... 13 1.3 Typy úloh.................................... 14 1.4 Problém obchodního cestujícího........................ 15 1.5 Problém čínského listonoše........................... 16 2 Matematické programování 17 2.1 Lineární programování............................. 17 2.1.1 Model dopravní úlohy......................... 18 2.2 Úlohy celočíselného programování....................... 21 2.2.1 Model problému obchodního cestujícího................ 22 3 Teorie grafů 25 3.1 Základní pojmy................................. 25 3.2 Cykly v grafu.................................. 28 3.2.1 Hamiltonův cyklus........................... 28 3.2.2 Eulerův cyklus............................. 29 4 Heuristiky 31 4.1 Význam heuristik................................ 31 4.2 Heuristiky pro úlohu obchodního cestujícího................. 31 4.2.1 Metoda hledání nejbližšího souseda.................. 32 4.2.2 Metoda hladového algoritmu...................... 34 4.2.3 Metoda vkládání měst do trasy.................... 35 4.2.4 Metoda dvojité minimální kostry grafu................ 36 4.2.5 Christofidesova metoda......................... 37 4.3 Algoritmy pro zlepšení vlastností trasy obchodního cestujícího....... 39 4.3.1 2-optimální algoritmus......................... 39 4.3.2 3-optimální algoritmus......................... 43 4.3.3 k-optimální algoritmus......................... 46 5 Porovnání výsledků testování metod 47 6 Pokročilé algoritmy a modely 51 6.1 Pokročilé algoritmy............................... 51 6.2 Vehicle routing problem............................ 51 7 Závěr 55 8 Přílohy 59 8.1 Minimální kostra grafu............................. 59 8.2 Algoritmus pro minimální párování v grafu.................. 59 8.3 Seznam příloh na CD.............................. 60 11
1. Dopravní úlohy Za dopravní úlohy a logistiku označujeme organizaci, přepravu a uskladnění materiálu či výrobků na cestě k zákazníkovi a přepravu samotných osob z jednoho místa na jiné. [4] Přestože mělo slovo logistika dříve čistě vojenský význam, dnes se týká převážně distribuce výrobků každodenní potřeby. Cílem je vytvořit systém, ve kterém je ten správný produkt přepraven na dané místo v daný čas. Tento problém, ač se zdá jednoduchý, zahrnuje rozsáhlou problematiku od zásobování po konečný prodej a mohou na něm záviset dokonce i lidské životy. Málokterá firma totiž zajišt uje celý výrobní cyklus od vytěžení surovin až po distribuci výrobků a musí se proto spoléhat i na subdodavatele. Navíc mnoho zákazníků si dnes již zvyklo na trh s neustálým přísunem nových modelů, které nutí firmy k inovacím a tedy i neustálému vývoji a využívání nových materiálů. Tím se se sít přepravy materiálů a výrobků mění takřka kontinuálně. Při tomto procesu, který je pro každou firmu nepostradatelný, dochází k utrácení nemalého množství peněz, a proto se jej firmy snaží co nejvíce zefektivnit. K tomu jim pomáhají moderní modely dopravních sítí, které jsou schopny přizpůsobit se změně dodavatelů i odběratelů a ušetřit peníze, které mohou být reinvestovány do výzkumu. 1.1. Historie Historie řešení dopravních úloh začíná v polovině 19. století při rozvoji manufaktur ve větších městech a rozvoji sériové výroby. Z počátku bylo možné výrobky dodávat jen do nejbližšího okolí továren, protože doprava zboží byla drahá. Nejvíce využívanou dopravou zboží na větší vzdálenosti byly lodě (především z Indie a jiných kolonií). Snížení nákladů na dopravu probíhalo jednoduše tak, že se lodě naložily vždy plné a jednotliví prodejci se domlouvali na rozdělení nákladů na přepravu. V průběhu 19. století došlo k rozvoji železniční sítě a tím i dopravy vnitrozemské. Železniční doprava přispěla především k rozvoji na západní straně Spojených států amerických, kam se dopravovalo mnoho výrobků z východu země. Opravdová revoluce přišla ale až s vynálezem automobilu na přelomu 19. a 20. století. Auta byla relativně levná, způsobila rozvoj silniční sítě a umožnila dopravovat individuálně mnohem menší zásilky než vlakem nebo lodí a to přímo na místo určení. Díky rozvoji silniční sítě se mnohonásobně rozrostly možnosti dopravy a přepravy zboží k zákazníkovi. Proto se také ve 30. letech začíná hovořit o tzv. dopravní úloze, tedy minimalizování nákladů na distribuci zboží. Rozvíjející se teorie je pak využíváno i v průběhu druhé světové války k zásobování armád. Po válce dochází k prudkému rozvoji dopravní techniky (díky válečným technologiím) a zefektivnění dopravních sítí až do dnešních dní. Více o historii viz [5]. 1.2. Praktické poznatky V praxi je třeba zajistit přepravu výrobků od výrobce k odběrateli a minimalizovat možná zpoždění a prodražování zakázek. V angličtině se takový postup označuje jako Supply chain. Jedná se o komplexní logistický systém, který začíná u výběru a dovozu základních surovin, pokračuje zpracováním v příslušných závodech a skladováním v meziskladech a končí u konečného zákazníka. Typický příklad vidíme na obrázku 1.1. V průběhu zpra- 13
cování surovin na výrobky můžeme zvolit i strategii výroby polotovarů. Výroba tedy může být rozdělena na více závodů, či můžeme hotové polotovary přímo nakupovat. Obrázek 1.1: Schéma distribuce výrobků [4] Logistika se ale často výrobou a konkrétním zpracováním v rámci jednotlivých závodů nezabývá a považuje je za objekty, pro které stačí vědět potřebné vstupy, výstupy a dobu zpracování materiálu na výrobek. Pokud se soustředíme na konkrétní výrobek, který v průběhu svého vzniku projde celým tímto systémem, můžeme rozlišit dva základní modely distribuce: push supply chains jsou modely distribuce výrobků takové, kde jsou výrobky zpracovávány průběžně a jejich množství je regulováno pomocí předpovědi poptávky. K těmto výrobkům patří drtivá většina komerčně zpracovávaného zboží. pull supply chains jsou modely distribuce, kde je výrobek vyroben pouze v případě, že o něj zákazník požádá. Jedná se tedy především o kusovou výrobu. Pro distribuci výrobků v praxi lze pak využít kombinaci obou metod a to tak, že jednotlivé polotovary zpracováváme průběžně a konečné výrobky sestavujeme až po vyžádání zákazníka. Zkrátíme tím podstatně dobu výroby u pull systému, ale zároveň máme větší variabilitu výrobků oproti push systému. Důležité je uvědomit si nejen cestu výrobku k zákazníkovi, ale zároveň i cestu od zákazníka k výrobci. Pokud dojde v jakémkoli stupni výroby k závadě na výrobku, je třeba jej opravit. Pokud závadu objeví až zákazník, je třeba zajistit převoz zpět do závodu a opravu. Pokud je tedy přepravní sít zvolena nevhodně a přeprava samostatného vadného výrobku zpět je vedena neefektivně, může nastat i případ, kdy vadné výrobky jednoduše vyhazujeme a ztrácíme tak i případné náhradní díly na další výrobky. 1.3. Typy úloh V případě sestavování jakéhokoli modelu je třeba si uvědomit, které skutečnosti jsou natolik podstatné, že je nezbytně nutné je do modelu zahrnout. Většinou stačí pouze 14
vytvořit model míst důležitých pro výrobu a distribuci a vzájemných cest mezi nimi. Mohou zde být ovšem i požadavky na převoz výrobku, který může být křehký, chemicky nebezpečný nebo rychle se kazící. Může se jednat například i o živá zvířata. Zároveň mohou mít zákazníci požadavky na čas doručení a je tedy třeba navštívit zákazníky v určitém časovém pořadí. Při vykládání a nakládání zboží je třeba zvážit, zda je potřeba tuto časovou prodlevu zanedbat nebo je podstatná vzhledem k době přepravy. Obecně se však snažíme modely vytvářet co nejjednodušší a tím si výrazně uspořit práci a výpočetní čas. Dále se ve zbytku práce budeme zabývat pouze řešením problémů, které závisí na přepravě mezi danými místy a nebudeme uvažovat žádné speciální požadavky na výrobky nebo od zákazníků. Rozebereme si základní úlohu přepravy řešenou pomocí lineárního programování a dále úlohu obchodního cestujícího, která je důležitou základní úlohou pro řešení dalších složitějších úloh. 1.4. Problém obchodního cestujícího Problém obchodního cestujícího je jedním z nejznámějších problémů z oblasti diskrétní optimalizace. Zadání úlohy zní takto: Obchodní cestující má schůzku v n městech a chce je navštívit v takovém pořadí, aby mu cestování zabralo nejméně času. Každé město je navštíveno minimálně jednou a po navštívení všech měst se obchodní cestující vrací do původního města. [13] Jedná se tedy o úlohu nalezení nejkratší cesty mezi všemi městy, které chce daný obchodní cestující navštívit. Formulace minimálně jednou je často nahrazena formulací právě jednou. Formulace minimálně jednou vede na obecnější zadání úlohy. Obecně totiž graf měst s cestami může mít tvar tzv. stromu a nemusí být Hamiltonovský. Více k tomuto tématu najdete v kapitole 3.2.1. Úloha samozřejmě obecně nemusí být symetrická, tedy z města A do města B může být jiná vzdálenost než z města B do A. Pro lepší představu je vhodné představit si parník, který pluje po a proti proudu řeky. Zatímco po proudu bude parník překonávat vzdálenost s minimální námahou, proti proudu bude třeba motorů, které spotřebovávají palivo a prodražují cestu. Cena cesty tedy nemusí záviset pouze na vzdálenosti, ale i na převýšení, použitém prostředku dopravy a podobně. Ve své práci se budu podrobně zabývat hlavně tímto problémem, který budu pro názornost řešit na mapě České republiky. Jako testovací města jsem využila všech 73 bývalých okresních měst České republiky a vytvořila matici určující vzdálenosti, mezi těmito městy. Domnívám se, že právě tento model poskytne čtenáři dostatečnou orientaci a představu o tom, jak jednotlivé výpočty a postupy řešení probíhají. Počet měst se mi zdá dostatečný pro znázornění složitosti problému. Uspořádání měst ukazuje obrázek 1.2. Vzájemná poloha měst je převzata z kartografických map [1]. Jako vzdálenost mezi městy počítám vzdušnou spojnici mezi nimi. Vzdálenost mezi městy je Eulerovská a na všech algoritmech je tedy jasně vidět princip jejich postupu. Pro libovolné další modely lze samozřejmě vytvořit obecnou matici vzdáleností a aplikovat algoritmy s touto maticí. 15
Obrázek 1.2: Stylizovaná mapa okresních měst České republiky 1.5. Problém čínského listonoše Problém čínského listonoše je zadáním velmi podobný problému obchodního cestujícího, přesto se řešení velmi liší. Zadání úlohy zní takto: Čínský listonoš musí roznést poštovní psaní do všech ulic ve svém městě a vrátit se zpět na místo, ze kterého vycházel. V jakém pořadí a v jakém směru má ulice projít, aby jeho trasa byla nejkratší možná? Tuto úlohu formuloval čínský matematik M. K. Kwan roku 1962. Tato úloha lze opět zobrazit v grafu, kde jednotlivé ulice reprezentují hrany a křižovatky mezi ulicemi reprezentují vrcholy v grafu. Více o této problematice a Eulerových cyklech lze nalézt v kapitole 3.2.2. Platí, že pokud v grafu existuje Eulerovský tah, pak je tento Eulerovský tah optimální cestou listonoše. [13] 16
2. Matematické programování 2.1. Lineární programování Lineární programování řeší problémy související s hledáním vázaných extrémů u lineárních funkcí více proměnných. Omezující podmínky těchto funkcí jsou ve tvaru lineárních rovnic nebo nerovností. Řešením těchto problémů se jako jeden z prvních matematiků zabýval J. B. J. Fourier, který je využil ve své teorii pravděpodobnosti a v analytické mechanice. Od čtyřicátých let se využívalo lineárního programování v ekonomii a později i k řešení dopravních problémů. Rozvoj efektivních metod řešení těchto úloh představil G. B. Dantzig, který vytvořil tzv. simplexovou metodu. 1, která je dnes již všeobecně známou metodou. V současné době se stále pracuje na dalších metodách řešení těchto úloh. S rozvojem počítačů se otevírají možnosti pro řešení pomocí paralelních výpočtů. Matematickou formulací úlohy lineárního programování ve standardním tvaru rozumíme: min{ n c j x j a ij x j = b i, i = 1,..., m, x j 0, j = 1,..., n}, j=1 kde c j, b i, a ij R jsou konstantní koeficienty úlohy a x j R jsou neznámé proměnné úlohy. V literatuře je uvedeno, že každou úlohu lineárního programování lze převést na standardní tvar. [9] Tímto přístupem lze vyřešit i širokou paletu dalších problémů, dopravních úloh a organizace přepravy. Zadání některých z těchto problémů se pokusím naznačit na několika dalších řádcích. Přeprava zboží dodavatel odběratel Základní úlohou je úloha přepravy zboží od různých dodavatelů k odběratelům. Přičemž lze do modelu přidat mezisklady, či továrny, které případné polotovary od dodavatelů přemění v konečný výrobek a poté jej transportují k odběrateli. Úkolem je pak minimalizovat celkovou cenu přepravy, případně celkový přepravní čas. Lepší pochopení šíře problému pak uvádí obrázek 1.1. Proces výroby Jedná se o úlohu nalezení optimálního postupu výroby výrobku. At už z hlediska množství použitých materiálů, tak pořadím jednotlivých kroků výroby. Dobrým příkladem může být výroba určitého typu oceli a jejího dodatečného legování. [9] Jak můžeme vidět, jsou metody lineárního programování poměrně užitečné na praktické aplikace v dopravě a ekonomii výroby. Pomocí vhodných algoritmů tzv. řešičů stačí pak jen vhodně formulovat úlohu a zadat ji danému vhodnému řešiči na vyřešení. S rozvojem počítačové technologie a výpočetní kapacity pak mají i tyto metody reálné použití v praxi. 1 Srozumitelné vysvětlení lze nalézt na internetové adrese: http://www.algoritmy.net/article/1416/simplexova-metoda. 17
Řešiče jsou často vyvíjeny jednotlivými univerzitami nebo prestižními firmami. Jsou často specializované na daný typ úloh. Řešiče můžeme obecně dělit na řešiče určené pro lineární programování (LP), lineární programování s celočíselnými proměnnými (MIP) či nelineární programování (NLP). Program GAMS nabízí širokou paletu velmi efektivních řešiců, které můžeme použít pro náš výpočet. Pro problém v následující kapitole byl zvolen řešič CPLEX pro lineární programování vyvíjený společností IBM. Pro lepší orientaci v zadání úloh jsem se rozhodla uvést jedno vzorové sestavení modelu a jeho vyřešení. Především chci přiblížit postup a řešení konkrétně a pak také ukázat, že k vyřešení těchto modelů stačí i obyčejný tabulkový kalkulátor, který může být i zdarma dostupný ke stažení na internetu. 2.1.1. Model dopravní úlohy Ukázkový příklad Mějme firmu se třemi továrnami (v Českých Budějovicích, Kutné Hoře a Olomouci) vyrábějícími hračky, která má pobočky ve třech městech (v Praze, Brně a Ostravě). Do poboček ve městech chodí lidé nakupovat tyto hračky a tím vytvářejí poptávku. Firma se snaží mít co největší zisk a neutrácet proto mnoho na přepravě. Je tedy zapotřebí minimalizovat náklady. Obrázek 2.1: Jednoduchý model Sestavíme tedy následující model, kde indexem i označíme proměnné související s továrnami a indexem j proměnné související s pobočkami. Problém: 3 3 minimalizuj c ij x ij Kde proměnná x ij označuje, kolik hraček se poveze z továrny i do pobočky j. Cenu cesty určuje matice cen C, jejíž prvky jsou ceny přepravy c ij mezi továrnou i a pobočkou j. Podmínky: každá továrna může vyprodukovat maximálně a i výrobků xij a i, i {1, 2, 3} i=1 j=1 každá pobočka musí být zásobena minimálně tak, aby se uspokojili všichni zákazníci v ní nakupující. Musí mít dovezeno minimálně b j výrobků. xij b j, j {1, 2, 3} 18
cenová matice C Praha Brno Ostrava Kutná Hora 87 176 343 České Budějovice 155 213 380 Olomouc 283 77 95 Dále udáme výrobní kapacity jednotlivých továren a velikost poptávky v jednotlivých pobočkách matice kapacity výroby A Kutná Hora České Budějovice Olomouc kapacita výroby a i 600 4500 3000 matice poptávky B Praha Brno Ostrava poptávka b j 3000 2500 1500 Takto lze tedy definovat základní úlohu dopravy zboží. Tuto úlohu lze jednoduše řešit simplexovou metodou pomocí algoritmu a nalézt řešení. Literatura uvádí další efektivnější algoritmy [13]. Výhodou použití simplexové metody je její rozšíření a dostupnost. V dnešní době existuje řada programů, které mají standardní řešiče a lze je bez problému využít. Úlohu jsem tedy řešila ukázkově v programech GAMS a MS Excel. GAMS je specializovaný software pro řešení optimalizačních úloh a je tedy vhodné uvést alespoň jednoduchou ukázku z něj. Tabulkové kalkulátory Microsoft Excel či Open Office Calc jsou dnes již rozšířenými programy na téměř každém počítači a jedná se o obecně použitelný nástroj i pro pokročilé matematické výpočty, proto jsem si dovolila zařadit i řešení tohoto příkladu v těchto programech. Zdrojové kódy a programy jsou přiložené na CD v deskách práce. Řešením této úlohy tedy bude matice přepravy X: matice přepravy výrobků X Praha Brno Ostrava Kutná Hora 600 0 0 České Budějovice 2400 1000 0 Olomouc 0 1500 1500 Grafické řešení pak bude vypadat takto: Obrázek 2.2: Grafické řešení úvodního příkladu Červené šipky ukazují řešení této úlohy. Modré spojnice reprezentují cesty, které zůstávají nevyužity. 19
Výše popsaný model je samozřejmě velmi zjednodušený a vhodný spíše jako ilustrační příklad. V praxi programy pracují s mnohem větším množstvím dat. Úlohu lze především rozšířit a přiblížit realitě modelováním: skladů a meziskladů výrobků závislostí produkce výrobků na daném čase nebo dnu v týdnu závislostí prodeje výrobků na daném čase nebo dnu v týdnu postupné přepravy mezi továrnami (dle technologického postupu výroby) přeprava přímo k zákazníkovi přeprava do lokální pobočky Více podrobností ke všem těmto variantám lze nalézt v knize Introduction to logistics systems planning and control [4]. 20
2.2. Úlohy celočíselného programování Celočíselné programování se vyznačuje tím, že jedna nebo více proměnných je celočíselného charakteru, či speciálně binárního charakteru. Matematickou formulací úlohy celočíselného lineárního programování ve standardním tvaru rozumíme min{ n c j x j a ij x j = b i, i = 1,..., m, x j 0, j = 1,..., n, x j M, j J M } j=1 kde c j, b i, a ij R jsou konstantní koeficienty úlohy a x j R jsou neznámé proměnné úlohy. Konkrétně pak můžeme rozlišit úlohy: Integer Program (IP) jedná se o typ lineárního programování, kde všechny proměnné mají celočíselný charakter: M = Z, J M = {1,..., n} Mixed Integer Program (MIP) jedná se o typ lineárního programování, kde některé proměnné mají celočíselný charakter: M = Z, J M {1,..., n} Binary Integer Program (BIP) jedná se o speciální typ celočíselného programování, kde proměnné mají binární charakter, tedy jsou rovny bud 0 nebo 1: M = {0, 1}, J M = {1,..., n} Této skutečnosti se pak využívá při zadání mnoha úloh s dopravní tématikou. Reálně totiž platí, že můžeme vždy vypravit celočíselné násobky vlaků nebo letadel. Problematiku lze tedy využít při: Plánování jízdních řádů vlaků Pro daný plán trat ové sítě víme, že odjezdy a příjezdy vlaků do námi určených stanic se mají opakovat po určitém časovém odstupu. Například ze stanice A má vyjíždět aspoň jeden vlak každou hodinu. Vzdálenosti mezi jednotlivými stanicemi v síti známe, stejně tak čas potřebný k překonání této vzdálenosti. Platí zároveň podmínka, že dva vlaky jedoucí po sobě na dané trati musí mít nějaký námi daný časový rozestup. Pro pasažéry musí zase řešení umožnit přestup z jedné vlakové linky na druhou a poskytnout jim dostatek času pro tento přestup. Úkolem pak je najít takový plán přepravy, aby vyhovoval všem těmto podmínkám. [13] Plánování pohybu leteckých posádek Pro daný pravidelný plán letů pro daný typ letadla je třeba najít pravidelný plán letů pro posádku. Každý den musí být každá posádka přiřazena k letu na jedné, či více linkách, které zároveň musí splňovat letový plán dle zájmu zákazníků na dané trase letět. Zároveň je požadováno, aby jednotlivé linky na sebe navazovaly, aby byl nejkratší čas přeletu a aby se letadla zbytečně nezdržovala na letišti z důvodů tax. Hledáme tedy minimum vynaložených prostředků na posádky letadel, což je funkcí času letu letadla, délky pracovní doby a pauz mezi lety letadla. Zároveň ale musíme minimalizovat i letové časy a letištní taxy. [13] 21
Plánování letů na letišti Jedná se o podobný problém jako plánování pohybu leteckých posádek, ale tentokrát ze strany letištního personálu. Na základě příchozích letů je třeba rozhodnout, které letadlo kam přistavit, aby pasažéři mohli mezi letadly přestoupit a aby měli dostatečný čas na přestup. To vše s minimalizací nákladů a nehodovosti na letišti. [13] Z předchozího popisu celočíselného programování by se mohlo zdát, že se jedná o velmi podobnou úlohu, jako je lineární programování. Bohužel pouhým zaokrouhlením výsledků z lineárního programování se nedostaneme k optimálnímu řešení celočíselného programování. Je tedy třeba použít jiné řešiče, než v případě lineárního programování. Tuto problematiku podrobně rozebírá kniha [13], kde lze nalézt mnoho příkladů z celočíselného programování a technik řešení tohoto typu úloh. Dále se budeme zabývat pouze konkrétní úlohou v oblasti dopravy a vysvětlíme si základní formulaci úlohy celočíselného programování a význam jednotlivých podmínek. 2.2.1. Model problému obchodního cestujícího Problém obchodního cestujícího budeme řešit na grafu, který bude symetrický a formulujeme jej jako metodu celočíselného programování následovně: minimalizuj n n c ij x ij i=1 j=1 n x ij = 1, i=1 n x ij = 1, j=1 x ij 1 i S j / S x ij {0, 1} i = 0, 1,..., n j = 0, 1,..., n pro S N, S V tomto modelu jsou opět c ij koeficienty cenové matice C. Číslo c ij určuje cenu přepravy z města i do města j. Pokud je graf symetrický, pak je i matice C symetrická. Matice X je binární matice, která určuje pořadí měst, která budou navštívena. Platí pro ni: { 1 pokud cesta z města i do města j leží v trase obchodního cestujícího x ij = 0 jinak Ze zápisu jednoduše vyplývá podmínka, že součet v každém řádku a v každém sloupci je jedna, nebot z každého a do každého města vede právě jedna cesta. Jedná se vlastně o speciální případ dříve probrané dopravní úlohy 2.1.1, tzv. přiřazovací problém, kdy z každého z n měst přepravujeme co nejlevněji jednotková množství zboží do jednoho ze zbývajících n 1 měst. Zdá se tedy, že by k vyřešení mohlo stačit lineární programování. Tato specifikace ale k vyřešení úlohy ještě nestačí. Poslední podmínka zaručuje, že nebudou 22
Obrázek 2.3: Příklad jedné souvislé trasy vznik dvou subcyklů vznikat tzv. lokální smyčky, ale vytvoří se jeden velký cyklus obsahující všechna města, jak ukazuje obrázek 2.3. Hledaným řešením je pak to řešení s minimální ohodnocenou trasou. Zadání vypadá tedy poměrně jednoduše. Jaká je ovšem náročnost a rozsáhlost této úlohy? Můžeme začít v libovolném městě z n měst a z něj máme n 1 možností jak pokračovat dál. Pro další město už to bude n 2 možností a tak dále. V konečném důsledku tedy máme (n 1)! možných řešení. Pro malá n je tedy problém dobře řešitelný, ale pro rozsáhlejší úlohy náročnost neúměrně roste. Pro lepší představu na našem modelu máme 73 okresních měst. To je přibližně 4, 47 10 105 možností cest, které splňují všechny výše určené podmínky modelu. Odtud je již jasně vidět, že nalezením všech možností a jejich tříděním rozhodně nedosáhneme efektivního výpočtu. Navíc i při dnešním pokroku v oblasti počítačových technologií bychom měli velké problémy s pamětí počítače. S výhodou jsem využila již funkční řešení podobné úlohy, která je součástí knihovny ukázkových řešení programu GAMS. Programu tsp42, který původně počítal optimální trasu skrz 42 největších měst Spojených států, jsem jako vstup poskytla data všech okresních měst a vzdáleností mezi nimi. Program funguje na principu řešení, které navrhli v roce 1954 autoři Dantzig, Fulkerson a Johnson. V jednoduchosti se jedná o dva kroky. Prvním krokem je tzv. relaxace řešení, ve které se matice řešení X transponuje a sečte s původní maticí X. X + X T = Y Pro lepší představu uvedeme jednoduchý příklad. Matice X 1 a X 2 odpovídají podmínkám n x ij = 1 a n x ij = 1. X 2 ovšem reprezentuje dvě uzavřené trasy, X 1 tvoří jednu i=1 j=1 uzavřenou trasu. X 1 = 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0, X 2 = 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 Pokud dojde k součtu těchto matic s jejich traspozicemi, vzniknou nové matice Y 1 a Y 2. Které budou symetrické a na diagonále nulové. Zabýváme se tedy pouze prvky pod diagonálou. Y 1 =..... 1.... 0 0... 0 1 1.. 1 0 0 0., Y 2 = 23..... 2.... 0 0... 0 0 1.. 0 0 1 1.
Pak tedy reformulujeme prodmínky n x ij = 1 a n x ij = 1 na jedinou podmínku: i=1 j, j<i y ij + i, i>j j=1 y ij = 2 Tímto postupem získáme tzv. relaxované řešení, které program tsp42 spočte. Výsledek zobrazíme převodem matice X do syntaxe L A TEXu. Obrázek 2.4: Relaxované řešení úlohy pomocí programu GAMS Poté dochází k postupnému sdružování jednotlivých subcyklů tohoto řešení. Zároveň musíme kontrolovat, zda dochází ke splnění daných podmínek pro řešení původní úlohy. Podrobněji jsou metody popsány přímo v článku Solution of a Large-Scale Traveling- Salesman Problem [2]. Program tsp42 z relaxovaného řešení postupným spojováním a optimalizováním jednotlivých subcyklů úlohu vyřeší a nalezne optimum. Toto optimum má celkovou délku trasy (po korekci zaokrouhlování) 4095 km. Obrázek 2.5: Optimum úlohy Délka řešeni je 4 095 km. Další přístupy řešení úlohy TSP založené na celočíselném lineárním programování lze nalézt v knize [13] a jejich implementace v GAMSu najdeme v [3]. Dále se ale chci zabývat efektivnějšími algoritmy založenými na teorii grafů. 24
3. Teorie grafů K dalšímu výkladu je třeba definovat základní pojmy z teorie grafů pro lepší pozdější orientaci v textu. Grafy pak lze velmi dobře využít k vytvoření modelu měst a jejich vzájemných vzdáleností a k názorné ukázce postupu jednotlivých algoritmů pro hledání nejlepších tras obchodního cestujícího. 3.1. Základní pojmy Definice 3.1.1 Graf (obyčejný či jednoduchý neorientovaný graf) je uspořádaná dvojice množin G = (V, E), kde V je libovolná konečná neprázdná množina a E 2 V je libovolná množina dvouprvkových podmnožin množiny V. Množinu V nazýváme množinou vrcholů a množinu E množinou hran. [6] Je nutno také poznamenat, že jako neorientovaný graf lze interpretovat i symetrickou ireflexivní relaci, kde hrany tvoří právě dvojice prvků této relace. [6] Grafy specifikujeme bud výčtem vrcholů a hran nebo obrázkem. Obrázek 3.1: Příklad zobrazení grafu Pro naši úlohu budeme reprezentovat města vrcholy grafu a cesty mezi městy hranami grafu. Definice 3.1.2 Stupněm vrcholu v v grafu G rozumíme počet hran vycházejících 1 z v. Stupeň v v grafu G značíme d G (v). [6] Věta 3.1.3 Součet stupňů v grafu je vždy sudý a roven dvojnásobku počtu hran. [6] Důkaz této věty je triviální. Tuto větu však o pár kapitol dále vhodně využijeme u aplikace Christofidesovy metody. Definice 3.1.4 Podgrafem grafu G rozumíme libovolný graf H na podmnožině vrcholů V (H) V (G), který má za hrany libovolnou podmnožinu hran grafu G majících oba vrcholy ve V (H). Píšeme H G. [6] Definice 3.1.5 Isomorfismus grafů G a H je bijektivní (vzájemně jednoznačné) zobrazení f : V (G) V (H), pro které platí, že každá dvojice vrcholů u, v V (G) je spojená hranou v G právě tehdy, když je dvojice f(u), f(v) spojená hranou v H. Grafy G a H jsou izomorfní, pokud mezi nimi existuje isomorfismus. Píšeme G = H. [6] 25
Obrázek 3.2: Příklad dvou isomorfních grafů Isomorfismus nám v jednoduchosti říká, že dva různě nakreslené grafy o určitých vlastnostech jsou stejné a můžeme všechny grafy dle této bijekce roztřídit do tříd, kde každou třídu může reprezentovat graf s určitými danými vlastnostmi. Tedy například dle obrázku jsou tyto dva grafy isomorfní, tj. nezáleží, jak graf kreslíme, když zachováme vzájemné vlastnosti. Definice 3.1.6 Sledem délky n v grafu G rozumíme posloupnost vrcholů a hran v 0, e 1, v 1, e 2, v 2,... e 1, v 0 ve které vždy hrana e i má koncové vrcholy v i 1, v i. [6] Definice 3.1.7 Tah je sled v grafu bez opakování hran. Uzavřený tah je tahem, který končí ve vrcholu, ve kterém začal. Otevřený tah je tahem, který končí v jiném vrcholu, než sám začal. [6] Sledy a tahy nám pomohou lépe specifikovat trasu obchodního cestujícího. Řešením obchodního cestujícího bude vždy uzavřený tah v grafu měst a cest. Nyní už jen zbývá definovat vzdálenost. Definice 3.1.8 Vzdálenost d G (u, v) dvou vrcholů u, v v grafu G je dána délkou nejkratšího sledu mezi u a v v G. Pokud sled mezi u, v neexistuje, definujeme vzdálenost d G (u, v) =.[6] Věta 3.1.9 Vzdálenost v grafech splňuje trojúhelníkovou nerovnost [6]: u, v, w V (G) : d G (u, v) + d G (v, w) d G (u, w). Definice 3.1.10 Souvislý graf je takový neorientovaný graf, v němž platí, že pro každé dva vrcholy x a y existuje alespoň jedna cesta z x do y. Definice 3.1.11 Vážený graf je graf G spolu s ohodnocením w hran reálnými čísly w : E(G) R. Kladně vážený graf je dvojice (G, w) taková, že w(e) > 0 pro všechny hrany e.[6] Definice 3.1.12 Vážená vzdálenost. Mějme kladně vážený graf (G, w). Délkou váženého sledu S = (v 0, e 1, v 1, e 2, v 2,... e 1, v 0 ) v G myslíme součet: d w G(S) = w(e 1 ) + w(e 2 ) + + w(e n ). Váženou vzdáleností v (G, w) mezi dvěma vrcholy u, v pak myslíme d w G(u, v) = min{d w G(S) : S je sled s konci u, v} 1 Pozn. U hran v češtině říkáme, že vychází z obou vrcholů současně. 26
Definice 3.1.13 Celkovým ohodnocením podgrafu rozumíme součet ohodnocení všech jeho hran. Tím jsme tedy definovali váženou vzdálenost mezi vrcholy a délku váženého sledu. Při řešení úlohy obchodního cestujícího se dle grafové terminologie snažíme o uzavřený tah, který bude mít minimální váženou vzdálenost. Dále je třeba definovat strom a další důležité pojmy. Definice 3.1.14 Neorientovaný uzavřený tah v grafu G nazveme kružnicí v grafu G. [10] Definice 3.1.15 Strom je jednoduchý souvislý graf G bez kružnic. [6] Díky znalosti těchto pojmů pak můžeme lépe pochopit kostru grafu a minimální kostru grafu. Definice 3.1.16 Kostrou souvislého grafu G je podgraf v G, který je sám stromem a obsahuje všechny vrcholy grafu G. [6] Definice 3.1.17 Minimální kostrou souvislého váženého grafu G definujeme jako takovou kostru grafu G, která má nejmenší možné celkové ohodnocení. [6] Definice 3.1.18 Párování v grafu G je podmnožina hran M E(G) taková, že žádné dvě hrany z M nesdílejí koncový vrchol. [6] Definice 3.1.19 Minimální párování ve váženém grafu G je takové párování, které má minimální celkové ohodnocení. Definice 3.1.20 Perfektní párování ve váženém grafu G je takové párování, které pokryje všechny vrcholy grafu G. Pojem minimální kostry grafu využijeme v dalších kapitolách ke konstrukci řešení úlohy obchodního cestujícího. Zároveň také ke konstrukci využijeme tzv. párování v grafech. 27
3.2. Cykly v grafu Další důležitou kapitolou k pochopení algoritmů obchodního cestujícího jsou cykly (uzavřené tahy) v grafech. Cyklus v grafu může představovat jednoduchou posloupnost pohybu zboží mezi vrcholy případně skrz dané hrany grafu. Tato tématika se již v minulosti aplikovala na některé dopravní problémy a hry, proto si u této kapitoly dovolím několik historických poznámek. 3.2.1. Hamiltonův cyklus Historie vzniku problému Hamiltonova úloha byla formulována poprvé W. R. Hamiltonem v roce 1857 [12]. Hamilton ji jako nápad prodal londýnskému prodejci her, který z ní vyrobil dřevěnou deskovou hru a tím problém rozšířil do celého světa. Jednalo se o hru na dvanáctistěnu, jehož plášt se rozložil do roviny a vytvořil se graf vrcholů a hran dvanáctistěnu. Cílem je všech 20 vrcholů dvanáctistěnu propojit tak, aby vznikl cyklus, který každým vrcholem projde právě jednou. Proto se této hře říkalo The Icosian game, tedy Hra na dvanáctistěnu. Obrázek 3.3: Graf hran a vrcholů dvanáctistěnu a jedno z možných řešení úlohy Obecná definice Definice 3.2.1 Hamiltonův cyklus v grafu G definujeme jako uzavřený tah, který každý vrchol při průchodu grafem zahrne právě jednou. Graf, který obsahuje Hamiltonův cyklus se nazývá Hamiltonovský graf. Pokud se tedy budeme na úlohu obchodního cestujícího dívat jako na graf s městy jako vrcholy a cestami jako hranami, pak Hamiltonův cyklus je jedno z možných řešení problému a cyklus s nejmenším celkovým ohodnocením je optimálním řešením této úlohy. 28
3.2.2. Eulerův cyklus Historie vzniku problému Eulerův cyklus byl poprvé řešen Leonardem Eulerem, když se roku 1736 pokoušel vyřešit slavný problém sedmi mostů města Královce. Úkolem bylo v městě Královci (nyní Kaliningradu) přejít všech sedm mostů právě jednou. Právě Euler jako první dokázal, že tato úloha nemá řešení a proto není možné mosty žádným takovým způsobem přejít. Právě po něm jsou proto grafy s danou vlastností pojmenovány. Mezi známý případ Eulerova cyklu patří i kreslení obrázku domečku jedním tahem. Obrázek 3.4: Typický příklad Eulerova cyklu na kreslení domečku jedním tahem Obecná definice Definice 3.2.2 Eulerovský cyklus v grafu je takový tah, který každou hranu grafu projde právě jednou. Pokud tedy vytvoříme graf, který bude reprezentovat město, způsobem takovým, že vrcholy budou představovat křižovatky a hrany mezi nimi budou představovat ulice mezi nimi, pak stačí najít v tomto grafu libovolný Eulerův cyklus a tím vyřešíme úlohu čínského listonoše. Pro Eulerovy cykly platí také několik známých zákonitostí, které dále v textu využijeme. Věta 3.2.3 Neorientovaný graf je Eulerovský, je-li souvislý a každý jeho vrchol má sudý stupeň. Eulerův cyklus pak bude uzavřený tah. Věta 3.2.4 Neorientovaný graf je Eulerovský, je-li souvislý a má-li právě dva vrcholy lichého stupně. Eulerův cyklus pak bude otevřený tah. 29
30
4. Heuristiky 4.1. Význam heuristik Heuristiky jsou takové algoritmy, které poskytnou dostatečně přesné řešení v rozumném výpočetním čase. Toto řešení nemusí být optimální, přesto je při velkých modelech výhodné jej využít. Často heuristik využíváme i v případech, kdy neexistuje metoda nalezení přesného řešení. V praxi jsou tyto metody velmi často užívané a některé z nich nám dokonce zaručují danou procentuální vzdálenost od optimálního řešení. [7] 4.2. Heuristiky pro úlohu obchodního cestujícího Heuristiky pro TSP jsou algoritmy, které po nalezení řešení problému TSP již nijak toto řešení nezlepšují. Nejlepší z těchto algoritmů dokonce zaručují, že spočítají řešení, které se bude lišit maximálně o 10 15 % od optimálního řešení. Nemusí být ovšem pravidlem, že pro získání nejlepšího řešení musíme použít nejlepší konstrukční algoritmus. Mnoho takto získaných řešení lze zlepšovat pomocí tzv. zlepšovacích algoritmů, které mohou být velmi výkonné a mohou řešení posunout mnohem blíže k optimu. V našem modelu opět předpokládáme, že pro množinu měst můžeme určit graf cest, který bude úplný a bude pro něj platit trojúhelníková nerovnost. Jednoduchý model měst a cest si lze prohlédnout na obrázku 4.1. Jednotlivé metody budou prezentovány napřed pomocí několika prvních kroků právě na tomto modelu. Vlastní programování a výpočty pak byly provedeny v jazyce Python a za modelový příklad množiny měst byla opět vybrána bývalá okresní města České republiky. Obrázek 4.1: Modelový příklad měst a cest mezi nimi Typy těchto metod a jejich uplatnění jsem studovala v rámci spolupráce s norskou univerzitou Molde University College. Z vlastní zkušenosti a studia literatury [13], [7] vidím, že tyto metody jsou používány a mohou být často velmi efektivní při hledání řešení na velmi velkých modelech. Často se používají i v případech nestandardních doplňujících podmínek či v případě, že budeme potřebovat flexibilní model, při kterém se podmínky mohou široce měnit. Výhodou je také to, že řešení si pomocí bezplatného softwaru můžeme naprogramovat sami a nemusíme se spoléhat na řešiče, pokud budeme úlohu řešit pomocí metod matematického programování. 31
4.2.1. Metoda hledání nejbližšího souseda Jedná se o nejjednodušší metodu hledání řešení, která napadne téměř každého. Algoritmus startuje v zadaném počátečním vrcholu grafu (neboli v startovním městě). Z tohoto vrcholu tvoříme sled a přidáváme do sledu další hranu a vrchol tak, aby následující vrchol měl nejmenší váženou vzdálenost od vrcholu předešlého. Podmínkou je, že každý vrchol musí být použít ve sledu právě jednou. Jinak řečeno začneme ve startovním městě a vždy přidáme do posloupnosti jemu nejbližší město a postup opakujeme se zbývajícími městy, dokud nenavštívíme všechna města právě jednou v celém grafu. Tento algoritmus bohužel nijak nezaručuje efektivnost řešení. Většinou neposkytuje dostatečně dobrou aproximaci a je nutné jej zlepšovat dalšími algoritmy. Navíc není zcela jasné, které město by mělo být startovní. Naštěstí se jedná o poměrně jednoduchou techniku výpočtu a proto není problém vypočítat více variant tras a po té vybrat tu nejvhodnější ze všech. [8] Lepší představu postupu tohoto algoritmu doplňuje obrázek. Obrázek 4.2: Naznačení postupu řešení pomocí metody nejbližšího souseda Základní algoritmy bud uvádět dále v pseudokódu, který je obdobný tomu, který se při publikaci grafových algoritmů obvykle používá. Algoritmus hledání nejbližšího souseda Vstupem je seznam měst mesta a matice vzdáleností dist. Výstupem je trasa tour. begin tour = [ ]; vychozi mesto = mesta(1); mesta.odeber(vychozi mesto); while length(mesta) > 0 nasledujici mesto = najdi nejblizsi mesto(vychozi mesto, mesta); tour.pridej(nasledujici mesto); mesta.odeber(vychozi mesto); end end 32
Konkrétní řešení Tuto metodu jsem naprogramovala ve skriptovacím jazyce Python a analyzovala jsem její vlastnosti. Řešení všech modelů jsem pak zobrazila pomocí rozšiřujícího balíku funkcí pro jazyk Python s názvem NumPy. Za data jsem si opět zvolila všechna bývalá okresní města (tj. 73 uzlů grafu) v České republice, nebot se jedná o větší vzorek dat a bude lépe vidět variabilitu v závislosti na počátečním zvolení výchozího města. Za vzdálenosti mezi městy používám vzdušnou vzdálenost, která dobře aproximuje vzdálenosti skutečné. Ze simulací vyplývá, že obecně nelze nijak určit, které město by bylo pro začátek algoritmu nejvhodnější. Mezi mnou vypočteným nejlepším a nejhorším řešením je značný rozdíl, který je po vykreslení grafu zcela patrný. Tím se jen potvrzuje, že tato metoda není vhodná pro konečné řešení tohoto problému a bude třeba řešení dále posunout nějakou další metodou blíže k optimálnímu řešení. Konkrétně pak pro můj případ je nejlepší aproximací výchozí město Kolín a nejhorší výchozí město Tachov. Z tohoto srovnání by se mohlo zdát, že okrajová města jsou na tom vždy o trochu hůře, obecně se však toto tvrzení simulacemi nepotvrdilo. Obrázek 4.3: Nejlepší řešení na okresních městech Celková délka trasy = 4 508 km. 33
Obrázek 4.4: Nejhorší řešení na okresních městech Celková délka trasy = 5 266 km. 4.2.2. Metoda hladového algoritmu Tato metoda tvoří cestu mezi městy tak, že utřídí všechny hrany grafu (cesty mezi městy) dle velikosti. Vybere nejkratší hranu a pokud tato hrana splní podmínku, že jejím přidáním nevznikne cyklus s méně městy než je celkový počet měst a že přidáním této hrany nevzroste u libovolného vrcholu (města) stupeň vrcholu na více než dva, pak je tato hrana přidána do cyklu. Poté se vybírá nejmenší hrana následující. Algoritmus se ukončí po nalezení cyklu se všemi městy. Postup algoritmu je podobný Kruskalovu hladovému algoritmu, kterým se budeme zabývat u Christofidesovy metody. [8] Postup algoritmu lze dobře pochopit z ilustračního obrázku 4.5, který navazuje na obrázek 4.1. Čísla u jednotlivých hran reprezentují pořadí přidání hrany do cyklu. Obrázek 4.5: Vývoj hladového algoritmu Tuto metodu jsem dále žádným způsobem nezpracovala ani neprogramovala. 34
4.2.3. Metoda vkládání měst do trasy Tato metoda je opět poměrně přímá a má mnoho variant. Algoritmus načíná na podmnožině vrcholů (měst) a postupně se k nim po jednom přidávají další města. Počáteční podmnožinou je často trojice či dvojice vrcholů. Princip metody spočívá v tom, že v každém kroku se snažíme přidat další vrchol do uzavřeného tahu tak, aby přírůstek vzdálenosti, který vznikne přidáním tohoto vrcholu, byl minimální. Takto opakujeme, až do uzavřeného tahu přidáme všechny vrcholy a vynikne nám tedy cyklus měst. Obrázek ilustruje několik prvních kroků metody na modelovém příkladě, kde počáteční podmnožinou byly vybrány vrcholy grafu, které spojuje nejkratší hrana. Pořadí u šedých hran naznačuje postup celého algoritmu. Obrázek 4.6: Vývoj metody vkládání cest do trasy Tuto metodu jsem opět zpracovala ve skriptovacím jazyce Python a zobrazila pomocí NumPy. Výsledem výpočtu můžete vidět na obrázku níže. Délkou trasy je metoda srovnatelná s metodou hledání nejbližšího souseda. Obrázek 4.7: Použití metody vkládání měst do trasy na bývalých okresních městech ČR Celková délka trasy = 4 854 km. 35
4.2.4. Metoda dvojité minimální kostry grafu Tato metoda patří již mezi sofistikovanější metody. Základem je sestrojení tzv. minimální kostry grafu. Jedná se o podgraf grafu, pro který platí, že mezi každými dvěma vrcholy lze najít spojnici a celkové ohodnocení hran v tomto grafu bude minimální. Při konstrukci tohoto podgrafu lze využít Kruskalova algoritmu. Postup tohoto algoritmu lze najít v příloze na konci práce. Obrázek 4.8: Sestrojení minimální kostry grafu na bývalých okresních městech ČR Celková délka cest = 3 716 km. Metoda dvojité minimální kostry grafu pak spočívá pouze v dublování kostry grafu. Tedy vytvoříme novou množinu a každá hrana v minimální kostře grafu bude v námi nově vytvořené množině hran obsažena právě dvakrát. Na této množině hran pak lze sestrojit Eulerův cyklus použitím všech hran. Eulerův cyklus pak jednoduše převedeme na Hamiltonův. Procházením Eulerova cyklu si postupně zapisujeme navštívené vrcholy a vrcholy, které se v seznamu budou opakovat vynecháme. Tím vznikne Hamiltonův cyklus, kde každý vrchol navštívíme právě jednou. [8] Tato metoda zaručuje nejhůře dvojnásobně dlouhou dráhu oproti optimálnímu řešení, nebot platí, že kostra grafu bude mít vždy menší celkové ohodnocení trasy než trasa optimální. 36
4.2.5. Christofidesova metoda Algoritmus Christofides je pojmenován podle Nicose Christofidese, který jako první navrhl tento způsob výpočtu. Většina heuristik garantuje nejhorší výsledek ve dvojnásobné výši oproti optimu (tedy nalezená trasa heuristikou je v nejhorším případě dvakrát tak dlouhá než optimální trasa). Nicos Christofides navrhl rozšíření algoritmu tak, aby nejhorší možný výsledek měl vůči optimu poměr 3/2 (tedy nejhorší případ nalezené trasy bude o polovinu delší než délka optimální trasy). Tento algoritmus je zároveň i nejlepším dosud známým algoritmem. [7] Vytvoříme graf G = (V, E), kde vrcholy grafu budou námi navštívená města a E budou hrany mezi nimi. Konstrukce trasy pak probíhá následovně: vytvoříme minimální kostru grafu G vytvoříme podmnožinu vrcholů C grafu, která obsahuje pouze vrcholy s lichým stupněm na množině C vytvoříme minimální perfektní párování hrany minimální kostry grafu a minimálního perfektního párování sjednotíme do jedné množiny 1 Z tohoto sjednocení vytvoříme Eulerův cyklus Eulerův cyklus transformujeme na Hamiltonův cyklus [7] Nyní s výhodou využijeme pojmů vysvětlených v kapitole 3. Je důležité si uvědomit, že Eulerův cyklus sestrojíme v takto upraveném podgrafu vždy. Po konstrukci minimální kostry grafu vybíráme právě vrcholy s lichým stupněm, které nám brání v konstrukci Eulerova cyklu. Ty pak díky minimálnímu párování a sjednocení budou mít všechny sudý stupeň. Z věty 3.2.3 ale víme, že lze sestrojit Eulerův cyklus. Převod Eulerova cyklu na Hamiltonův pak vytvoříme jednoduše tak, že utvoříme posloupnost po sobě jdoucích vrcholů v Eulerově cyklu a opakující se vrcholy vynecháme. Tím vznikne Hamiltonův cyklus na všech vrcholech grafu G. Tuto metodu jsem opět zpracovala ve skriptovacím jazyce Python. Na grafu jsem vytvořila minimální kostru grafu pomocí hladového algoritmu (viz přílohy práce). Po té jsem určila vrcholy grafu s lichým počtem stupňů a na nich provedla minimální pseudopárování. Vzhledem k pokročilé tématice pro algoritmy na minimální perfektní párování v grafech jsem se rozhodla pro zjednodušený algoritmus, který na těchto bodech vytvoří tzv. pseudopárování. Algoritmus funguje tak, že setřídí hrany mezi vybranými městy dle velikosti a vybere nejkratší hranu. Poté tyto dva již spojené vrcholy odstraní a opět zbývající hrany setřídí a vybere nejkratší z nich. Takto pokračuje, až spáruje všechny města. Tento problém jsem řešila i pomocí programů, které vytvoří minimální párování na mnou dané množině vrcholů s lichým stupněm. Ukázalo se, že mnou navržený algoritmus generuje pro mnou navržený příklad 73 okresních měst v České republice stejné řešení, jako algoritmus určující minimální párování. Tyto dvě množiny jsem po té sjednotila a vytvořila Eulerův 1 Zde je nutno poznamenat, že pokud bude libovolná hrana zastoupena v obou podmnožinách, pak je nutné ji ve sjednocení počítat jako objekt, který se v této množině vyskytne dvakrát. Což je bohužel i částečné porušení definice grafu. Tuto konstrukci je nutné provést, abychom v dalším kroku mohli sestrojit Eulerův cyklus. 37
cyklus. Ten jsem pak jednoduchým způsobem transformovala na Hamiltonův cyklus, a tím jsem získala Christofidesovo řešení. Obrázek 4.9: Minimální kostra grafu a pseudominimální párovaní Celková délka cest = 4 753 km. Obrázek 4.10: Řešení motodou Christofides Celková délka trasy = 4 271 km. 38
4.3. Algoritmy pro zlepšení vlastností trasy obchodního cestujícího V předchozím textu jsme shrnuli několik metod, jak spočítat řešení problému obchodního cestujícího s dostatečně dobrou aproximací od optimální trasy. Dále je nutno uvést, že tyto algoritmy mohou být účinné, ale stále je tu mnohdy možnost posunout dané nalezené přibližné řešení ještě více k řešení optimálnímu. Vzniká tedy nová třída algoritmů, které na vstupu dostanou již nějaké libovolně nalezené přibližné řešení problému obchodního cestujícího a dále jej pouze přibližují k optimu a trasu jako takovou již nekonstruují. Z těchto algoritmů lze vybrat od jednoduchých a rychlých až po sofistikované a velmi efektivní. Pak má tento přístup výhodu tedy i v tom, že lze libovolně kombinovat konstrukční a zlepšující heuristiky a tedy i na daném problému použít danou nejvhodnější kombinaci metod. Tyto metody jsem studovala i v rámci spolupráce s norskou univerzitou Molde University College při řešení úkolů projektu, na kterém jsem se mohla podílet. Z vlastní zkušenosti tedy vím, že řada těchto metod (především pokročilejších) se používá v praxi a velmi dobře funguje i na velkých modelech, které by v případě celočíselného lineárního programování stály podstatně více výpočetního času. 4.3.1. 2-optimální algoritmus Jedním z prvních algoritmů je tzv. 2-optimální algoritmus, který jako jeden z prvních navrhl G. A. Croes již v roce 1958 2. Tento algoritmus staví na jednoduché metodě záměny dvou cest v celkové trase a testování, zda je ohodnocení nově vytvořené trasy menší, než ohodnocení trasy původní. Názorně je možno si tuto metodu představit na obrázku 4.11. Tato metoda je poměrně jednoduchá a rychlá, a proto se její použití doporučuje téměř vždy. Laicky lze říci, že po aplikování tohoto algoritmu vznikne kolem měst tzv. bublina. Tedy z grafického pohledu, kde všechny cesty budou znázorněny jako úsečky, které budou proporcionálně odpovídat své vzdálenosti mezi městy, se cesty nemohou křížit a budou obepínat města ve formě jedné velké zdeformované bubliny. Nejlépe je tento efekt vidět na následujících aplikacích, především na obrázku 4.12. Obrázek 4.11: Schéma 2-optimálního algoritmu Metodu lze konkrétně velmi dobře pochopit na algoritmu zapsaném na další straně textu. Trasu obchodního cestujícího reprezentujeme jednotlivými body, poskládanými za sebou v posloupnosti, v pořadí, v jakém jsou navštíveny. Tuto počáteční posloupnost 2 G. A. CROES (1958). A method for solving traveling salesman problems. 39