• No results found

Vytvoření aplikace pro analýzu toků v síti

N/A
N/A
Protected

Academic year: 2022

Share "Vytvoření aplikace pro analýzu toků v síti"

Copied!
44
0
0

Loading.... (view fulltext now)

Full text

(1)

Studijní program: B2646 Informační technologie Studijní obor: Informační technologie

Vytvoření aplikace pro analýzu toků v síti

Creating an application for the analysis of network flows

Bakalářská práce

Autor: Jan Šrámek

Vedoucí práce: Ing. Josef Chudoba, Ph.D.

V Liberci 28. 4. 2013

(2)

Prohlášení:

Byl jsem seznámen s tím, že na mou bakalářskou práci se plně vztahuje zákon č.

121/200 Sb. o právu autorském, zejména § 60 – školní dílo.

Beru na vědomí, že Technická univerzita v Liberci (TUL) nezasahuje do mých autorských práv užitím mé bakalářské práce pro vnitřní potřebu TUL.

Užiji-li bakalářskou práci nebo poskytnu-li licenci k jejímu využití, jsem si vědom povinnosti informovat o této skutečnosti TUL; v tomto případě má TUL právo ode mne požadovat úhradu nákladů, které vynaložila na vytvoření díla, až do jejich skutečné výše.

Bakalářskou práci jsem vypracoval samostatně s použitím uvedené literatury a na základě konzultací s vedoucím bakalářské práce.

Datum

Podpis

(3)

Poděkování

Rád bych touto cestou vyjádřil poděkování Ing. Josefu Chudobovi Ph.D. za jeho cenné rady, připomínky a trpělivost při vedení mé bakalářské práce.

(4)

Abstrakt

Tato bakalářská práce se zabývá analýzou toků v sítích. Úkolem je seznámit se s problematikou toků v sítích a následně vytvořit aplikaci, ve které bude možné libovolné sítě definovat a analyzovat třemi různými algoritmy. Aplikace bude vytvořena pomocí programovacího jazyka C# ve vývojovém prostředí Microsoft Visual Studio.

Pro analýzu toků budou v aplikaci implementovány algoritmy: Fort-Fulkersonův algoritmus, Dinicův algoritmus a Golbergův push-relabel algoritmus. Aplikace bude mít jednoduché uživatelské rozhraní pro nadefinování libovolného orientovaného grafu včetně ohodnocení hran kapacitami. Dále bude možné v aplikaci ručně nadefinovat více vrcholů představujících zdroje a spotřebiče. Aplikace umožní také veškeré vstupy ukládat a načítat ze souborů. Výstupem aplikace budou výpisy o průběžné činnosti algoritmů a výsledná informace, zda je, či není možné všechny spotřebiče dostatečně zásobovat definovanými zdroji. Aplikace bude schopna všechny algoritmy po dokončené analýze zhodnotit z hlediska rychlosti výpočtu. Součástí práce je využití aplikace na popsání reálné situace, řešící problematiku toků a následné její vyřešení.

Klíčová slova

Toky v sítích, grafy, aplikace, analýza, algoritmus, Dinic, Goldberg, Ford, Fulkerson.

(5)

Abstract

This thesis concentrates on analysis of flow networks. The aim of this thesis is to get acquainted with the issue of flow networks and then to create an application which will allow defining and analyzing any network using three different algorithms. The application will be created in the Microsoft Visual Studio IDE using the C#

programming language. In order to analyze the flow, following algorithms will be implemented in the application: Ford–Fulkerson algorithm, Dinic's algorithm and the push–relabel algorithm. The application will have a simple user interface that will allow the user to define any oriented graph including the possibility to weight edges with capacities. Next, it will be also possible to manually define multiple vertices representing the source and sink. The application will also allow saving and retrieving all inputs from the files. The output of the application will be a report about algorithms activity and the result will inform the user whether it is possible or not to sufficiently serve all sinks by the defined sources. After completing the analysis, the application will be able to evaluate all the algorithms in terms of calculation speed. Next part of the thesis focuses on the possibility to use the application to describe real situations which address the issue of flow and resolution.

Key words

Network flows, graphs, aplication, analysis, algorithms, Dinic, Goldberg, Ford, Fulkerson.

(6)

Obsah

Prohlášení: ... 3

Poděkování ... 4

Abstrakt ... 5

Klíčová slova... 5

Abstract ... 6

Key words ... 6

Obsah ... 7

Seznam obrázků ... 9

Seznam tabulek ... 9

Úvod ... 10

1 Teoretická část ... 11

1.1 Úvod do problematiky ... 11

1.2 Matematický popis problematiky ... 12

1.3 Použité algoritmy ... 13

1.3.1 Ford Fulkersonův algoritmus ... 13

1.3.2 Dinicův algoritmus ... 15

1.3.3 Goldbergův push-relabel algoritmus ... 16

1.4 Praktické využití ... 18

2 Praktická část ... 19

(7)

2.5 Časové a výkonnostní srovnání ... 24

2.5.1 Asymptotická složitost ... 24

2.5.2 Výkonnostní srovnání... 25

2.6 Popis souboru pro import a export ... 27

2.7 Interface ... 29

2.7.1 Vytvoření a modifikace grafu... 30

2.7.2 Definice zdrojů a spotřebičů... 33

2.7.3 Spuštění analýzy a výpisy aplikace ... 35

3 Praktická aplikace ... 37

3.1 Vytvoření sítě ... 37

3.2 Řešení úloh ... 41

Závěr ... 43

Použitá literatura ... 44

Elektronická příloha ... 45

(8)

Seznam obrázků

Obrázek 1: Použitý algoritmus nejkratší cesty ... 14

Obrázek 2: Ford-Fulkersonův algoritmus ... 14

Obrázek 3: Dinicův algoritmus ... 16

Obrázek 4: Goldbergův push-relabel algoritmus ... 17

Obrázek 5: Diagram použitých tříd ... 23

Obrázek 6: Ukázkový graf XMG souboru ... 28

Obrázek 7: Ukázka XMG souboru ... 29

Obrázek 8: Interface aplikace navigační okno ... 30

Obrázek 9: Definice souseda... 31

Obrázek 10: Generátor grafu ... 32

Obrázek 11: Generátor zdrojů a spotřebičů ... 35

Obrázek 12: Oblast železniční sítě ... 38

Seznam tabulek

Tabulka 1: Asymptotické složitosti algoritmů ... 25

Tabulka 2: Výsledky rychlostních testů ... 26

Tabulka 3: Seznam měst ... 39

Tabulka 4: Seznam železničních tras ... 39

(9)

Úvod

Tato bakalářská práce pojednává o problematice týkající se teorie grafů v oblasti řešení toků v sítích. Cílem bakalářské práce je seznámení se s uvedenou problematikou a následné vytvoření aplikace, která bude toky v síti analyzovat. Software bude mít rozhraní, pomocí kterého bude uživatel definovat síť spolu se zdroji toku a spotřebiči.

Výstupem aplikace bude vyhodnocení, zda v konkrétní síti je možné pomocí definovaných zdrojů vyřídit požadavky všech spotřebičů. Pro analýzu budou ve vytvořeném programu použity tři různé algoritmy:

 Ford-Fulkersonův.

 Dinicův.

 Golbergův push-relabel.

Aplikace bude vytvořena tak, aby bylo možné jej využít pro výuku a pochopení jednotlivých algoritmů. K tomu budou sloužit informační výpisy, které v průběhu analýzy bude aplikace vypisovat.

Práce je rozdělená do tří hlavních částí. V první teoretické části se v práci vysvětluje motivace řešení úloh o tocích a principy jejich řešení. Součástí kapitoly jsou matematické definice, které problematiku popisují. V této kapitole jsou také popsány jednotlivé použité algoritmy v aplikaci. Druhá část bakalářské práce se zabývá popisem vytvořené aplikace. V kapitole se uvádějí požadavky, které byly na aplikaci kladeny a následný výběr použitých technologií pro tvorbu softwaru. V praktické části bakalářské práce je také popsána struktura vytvořeného programu a uživatelský návod pro práci s aplikací. Ve třetí části bakalářské práce je popsána reálná situace, odpovídající problematice toků v síti a následně vyřešena pomocí vytvořené aplikace.

V závěrečné části je vyhodnocení cílů bakalářské práce.

(10)

1 Teoretická část

1.1 Úvod do problematiky

Problematika zkoumání toků [1][7] v sítích je motivována praktickými úlohami o propustnosti sítí – například řešením železniční, silniční nebo vodovodní sítě.

Z pohledu řešení jednotlivých úloh se obvykle pracuje v uzavřeném konečném systému toků, kde existují zdroje - vrcholy, kde tok vzniká a tzv. spotřebiče - vrcholy, kde tok zaniká. Ostatní vrcholy, označované jako vnitřní, jsou místa, kudy tok protéká a kde vtok se musí rovnat výtoku z každého uzlu.

Pro řešení toků v sítích je možné využít následující algoritmy:

 Ford-Fulkersonův algoritmus, viz kapitola 1.3.1.

 Edmons-Karpův algoritmus.

 Dinicův algoritmus, viz kapitola 1.3.2.

 Dinicův algoritmus s metodou tří Indů.

 Goldbergův Push-Relabel algoritmus, viz kapitola 1.3.3.

(11)

1.2 Matematický popis problematiky

základní značení[6]

 je konečný graf na vstupu algoritmu (podle potřeby buďto orientovaný nebo neorientovaný).

 jsou množiny vrcholů a hran grafu . Hranu z vrcholu , do vrcholu , značíme . Platí pro orientovanou i neorientovanou hranu.

 a je počet vrcholů a hran, tedy | | | |

 Pro libovolnou množinu vrcholů nebo hran ̅ označovat doplněk této množiny.

Definice toků v sítích

Síť je uspořádaná pětice ( )

 ( ) je orientovaný graf.

 je zdroj.

 je spotřebič neboli stok.

 je funkce udávající kapacity jednotlivých hran.

Ohodnocení funkce je libovolná funkce . Pro každé ohodnocení můžeme definovat:

( ) ∑ ( ) ( ) ( ) ∑ ( ) ( ) ( ) ( ) ( )

Předchozí funkce jinými slovy vyjadřují součet všech toků, které do vrcholu přitékají, dále součet všech toků, které z vrcholu odtékají a přebytek ve vrcholu. Je vidět, že přebytek ve vrcholu je rozdíl všech vstupujících a všech vystupujících toků daného vrcholu.

Tok je ohodnocení pro které platí:

 ( ) ( ).

 ( )

Přičemž první definice říká, že musí být dodrženy kapacity hran a druhá definice vyjadřuje platnost Kirchhoffova zákonu pro tok v síti.

Velikost toku je:

 | | ( )

(12)

Rezerva hrany ( ) se při toku definuje jako:

 ( ) ( ( ) ( )) ( ) ( ).

1.3 Použité algoritmy

1.3.1 Ford Fulkersonův algoritmus

Ford-Fulkersonův [1][3] algoritmus je jedním z algoritmů založených na principu hledání zlepšujících cest v grafu. Algoritmus byl popsán v roce 1957.

Algoritmus začíná tak, že všem hranám přiřadí tok hodnoty nula, protože na počátku je na řešené síti nulový tok (nic jí neprotéká). Dále se začne testovat nalezení zlepšující cesty (cesta od vtoku do stoku), jestliže tato cesta bude existovat, tak se zvýší tok od zdroje ke spotřebiči o minimální hodnotu hrany na nalezené zlepšující cestě.

Naopak, jestliže další cesta již není nalezena, znamená to, že algoritmus končí a nalezený tok je výsledným maximálním tokem v síti.

V případě aplikace v programu tak algoritmus hledá existující cestu z vtoku, vrcholu představujícího součet všech zdrojů, ke stoku, speciálnímu vrcholu zastupující všechny spotřebiče v síti. Tyto vrcholy vystupují v aplikaci jako vrcholy „s“ a „t“.

Při hledání cesty je použit algoritmus pro hledání nejkratší cesty v grafu pomocí průchodu grafu do šířky. Nalezenou cestu využije o maximální možnou hodnotu a graf upraví. Upravení grafu znamená snížení kapacit všech použitých hran cesty o již využitou hodnotu toku (viz. obrázek 2). Tento proces se cyklicky opakuje, dokud nedojde k vyřešení úlohy nebo již není možné najít cestu ze zdroje ke spotřebiči.

Po skončení algoritmu vzniká v grafu tzv. zbytková síť.

(13)

start

Je v násl. Úrovni Cesta ke zpracování?

Cesta neexistuje

Vstup do vyšší úrovně

Zbývá cesta Ke zpracování V této úrovni?

Vede tato cesta do stoku?

Cesta nalezena

Existuje Nenavštívený soused vrcholu?

Přidání cesty k vrcholu pro zpracování v další

úrovni Ne

ano

ano

ano ne

ano ne

ne

Obrázek 1: Použitý algoritmus nejkratší cesty

START

Existuje nevyřešený

Vstup?

Úloha vyřešena ne

ano

Ecistuje

cesta z s do t ? ne Konec algoritmu

Zjisti nejmenší kapacitu na cestě

ano

Řeší použitý Tok spotřebiče

Sniž kapacitu všech hran použité cesty o potřebnou honodtu Sniž kapacitu hran

cesty o nalezenou min. hodnotu

ne ano

Obrázek 2: Ford-Fulkersonův algoritmus

(14)

1.3.2 Dinicův algoritmus

Dinicův algoritmus [1][2] je stejně jako Ford-Fulkersonův algoritmus založen na hledání zlepšujících cest od zdroje ke spotřebiči. Hlavní myšlenka je taková, že oproti hledání všech zlepšujících cest se v grafu hledají zlepšující toky pomocí blokujících toků. Tyto toky se hledají zpravidla na nejkratší vzdálenosti mezi zdrojem a spotřebičem. Tuto myšlenku uvedli Ford a Fulkerson ve své práci a popsali jej jako heuristiku. Jako první provedl analýzu této heuristiky ruský matematik Dinits (často překládán jako Dinic) v roce 1970. Edmonds a Karp nezávisle publikovali slabší analýzu v roce 1972. Ale protože to byla první anglicky publikovaná analýza, tak se algoritmus často označuje jako Edmonds-Karpův.

V počátku si algoritmus vytvoří kopii původního grafu. Tento graf se jmenuje síť rezerv. Aby bylo možné najít blokující tok o nejkratší možné délce, je potřeba všechny vrcholy v síti rezerv ohodnotit vzdáleností od zdroje. Všechny vrcholy tak budou rozděleny do několika úrovní odpovídajících této vzdálenosti. Blokující tok se také hledá v tzv. čisté síti. Čistá síť vznikne očištěním sítě rezerv. Princip očištění spočívá v tom, že se odstraní všechny hrany v síti, které nejsou ve směru zdroj- spotřebič, nebo tyto cesty nevedou ke spotřebiči vůbec a tvoří tak v grafu slepé uličky.

Aplikace provede jak ohodnocení vrcholů vzdálenostmi tak očištění grafu pomocí jedné rekurzivní funkce. Tato funkce prochází graf do hloubky a při každém novém vrcholu zvyšuje hodnotu hladiny, ve které se vrchol nachází. Pokud tímto průchodem funkce nedojde až do vrcholu „t“, který představuje všechny spotřebiče v grafu, zpětným chodem rekurze se následně všechny hrany průchodu mažou. Výstupem z funkce je také informace o tom, zda je možné se dostat od zdroje ke spotřebiči. V případě že ano, tak je v čisté síti nalezen blokující tok. Použité hrany v nalezeném toku se zohlední v síti rezerv a cyklus se opakuje, dokud existuje cesta od zdroje ke spotřebiči.

(15)

start

Vytvoř síť rezerv

Existuje

Cesta z s do t Konec algoritmu

Spočítej a očisti podsíť

Existuje cesta v čísté síti

ne

ano

Použij tok na nalezené cestě ano

Aplikuj toky do sítě rezerv

ne

Obrázek 3: Dinicův algoritmus

1.3.3 Goldbergův push-relabel algoritmus

Goldbergův [1][8] algoritmus patří do třídy algoritmů s operacemi „přemístění přebytku“ a „zvedání vrcholu“ na nalezení maximálního toku. Algoritmus pochází z roku 1985. V aplikaci je využita varianta z roku 1988 podle Golberga a Tarjana.

V anglické literatuře se Goldbergův algoritmus též nazývá algoritmem preflow-push nebo relabel-to-front.

V algoritmech vylepšující cesty se tok podél jedné hrany postupně nasčítá z toků podél vylepšujících cest. Těchto cest může být poměrně mnoho a nalezení zlepšující cesty může trvat až ( ). Proto se nabízí myšlenka, jestli není možné tok podél hrany poslat naráz.

Myšlenku tohoto algoritmu je možné si představit jako vlnu, která se šíří od zdroje ke spotřebiči. Postup algoritmu je tedy takový, že nejprve protlačíme ze zdroje co největší tok do sousedních vrcholů. V těchto vrcholech tak vznikne přebytek toku a tím se stávají aktivními vrcholy. Aktivní vrchol je tedy takový, že do něj více toku přitéká, než odtéká. Postupné protáčení toku směrem ke spotřebiči je zajištěno neustálým zpracováváním aktivních vrcholů. Protlačí-li tedy jeden vrchol určité množství přebytku toku do druhého vrcholu, druhý vrchol se stává aktivním vrcholem.

(16)

Aby byl zajištěn směr toku ke spotřebiči, je nutné všechny vrcholy v grafu ohodnotit výškou. Vrcholy blíže ke zdroji mají větší výšku než vrcholy u spotřebiče. Celý tok se potom chová podobně jako kapalina v přírodě a po možných cestách teče z kopce dolů.

Jakmile algoritmus první vlnou dojde až ke spotřebiči, je stále potřeba vyřídit všechny aktivní vrcholy. Zbylým aktivním vrcholům se stále algoritmus pokouší zvedat výšku do chvíle, kdy tok bude moci využít hrany vedoucí v opačném směru. Touto zpětnou vlnou je zajištěna možnost přepravení zbytku toku za předpokladu, že existuje ještě nevyužitá možná cesta.

Algoritmus se skládá ze dvou hlavních částí. První částí je cyklus, který dokud existuje aktivní vrchol, tak jej nechává vyřešit a stará se tak o korektní ukončení algoritmu. Druhá část je samotné řešení aktivního vrcholu. V této části se algoritmus stará o hledání možných sousedů vrcholu, do kterých by svůj přebytek protlačil. Pokud se podaří přepravit veškerý přebytek ve vrcholu, vrchol přestává být aktivním. Pokud i po protlačení do jiného vrcholu má vrchol přebytek, zvýší se jeho výška a zařadí se na konec seznamu aktivních vrcholů.

Veškerý přepravený tok v průběhu algoritmu do spotřebiče je na konci algoritmu výsledným maximálním tokem.

Start

inicializace

Existuje Aktivní Vrchol?

ne

Existuje Přípustná

Hrana?

ano

Protlač po harně možné maximum

ano

ne

(17)

1.4 Praktické využití

Řešení toků v sítích se zabývá hledáním maximálního toku a minimálního řezu.

Problematiku maximálních toků je možné si představit jako úkol, kdy z určitého zdroje například přehrady, se zjišťuje maximální tok vody, který je možné dopravit do města, které přehrada zásobuje. Přičemž přehradu a město spojuje vodovodní systém a každá trubka v systému má jiný maximální průtok vody za minutu. Za předpokladu, že voda nikde na cestě nevzniká a zároveň se neztrácí, lze takový případ popsat také orientovaným ohodnoceným grafem. V grafu se poté řeší možnosti cesty toku od zdroje ke stoku. [1][4]

Sítě jsou popsány:

 Hranami - úseky potrubí, které mají danou svou maximální propustnost (kapacitu).

 Vrcholy - místa, kde se setkává více úseků potrubí.

(18)

2 Praktická část

2.1 Požadavky na aplikaci

Úkolem bylo vytvořit aplikaci s jednoduchým grafickým rozhraním, ve které bude moci uživatel jednoduše nadefinovat libovolnou síť jako orientovaný ohodnocený graf. A to buď zcela nový graf, nebo již v minulosti aplikací vytvořený.

Součástí aplikace bude rozhraní, kde bude možné libovolné vrcholy grafu označit jako zdroje toku a spotřebiče. Přičemž zdroj nemůže být zároveň spotřebičem.

Každý vrchol a spotřebič bude možné ohodnotit množstvím toku, který do sítě produkuje, respektive požaduje.

Uživatel bude mít možnost využít pro analýzu toku v síti nadefinovaného grafu tři různé algoritmy:

 Ford-Fulkersonův algoritmus (viz. kapitola 1.3.1).

 Dinicův algoritmus (viz. kapitola 1.3.2).

 Push-relabel algoritmus (viz. kapitola 1.3.3).

Po spuštění požadovaných algoritmů bude aplikace analyzovat, zda jsou zdroje schopny skrze graf vyřídit požadavky všech spotřebičů v síti. Aplikace bude klíčové kroky algoritmu vypisovat do jednoduché konzole pro informování uživatele.

Dalším požadavkem byla možnost načtení již vytvořeného grafu pomocí přesně nadefinovaného souboru (viz. kapitola 2.6). Aplikace by také měla umožňovat graf, vytvořený v aplikaci včetně definovaných zdrojů a spotřebičů, do souboru zapisovat (ukládat).

2.2 Výběr technologií

(19)

ultimate. Vývojové prostředí je vytvořeno zakladateli programovacího jazyka C#

a vzhledem k použití studentské licence se jednalo o vhodnou volbu.

2.2.1 Programovací jazyk C#

C# je vysokoúrovňový objektově orientovaný programovací jazyk vyvinutý firmou Microsoft zároveň s platformou .NET Framework. Microsoft založil C#

na jazycích C++ a Java a je nepřímým potomkem jazyka C, ze kterého čerpá syntaxi.

C# lze využít k tvorbě databázových programů, webových aplikací a stránek, webových služeb a formulářových aplikací ve Windows.

První verze C# 1.0 byla vydána v roce 2002 společně s .NET Frameworkem 1.0.

Tato verze obsahovala základní podporu objektového programování, ve které vycházela z jazyka C++ a zkušeností s jejich aktualizací v jazyce Java. Nyní se používá verze C#

5.0 společně s .NET Frameworkem 4.5 a Visual Studiem verze 2012.

Základní vlastnosti jazyka C# jsou:

 V C# neexistuje vícenásobná dědičnost.

 Neexistují žádné globální proměnné a metody. Všechny funkce a metody musí být deklarovány uvnitř tříd. Náhradou za ně jsou statické metody a proměnné veřejných tříd.

 Pro přístup k proměnným se z principu zapouzdření používají metody get a set.

 C# je typově bezpečnější než C++.

 Neobsahuje a ani nepotřebuje dopřednou deklaraci - není důležité pořadí deklarace metod.

 Jazyk C# je case sensitive – rozlišuje velká a malá písmena.[5]

2.2.2 Vývojové prostředí Microsoft Visual Studio

Microsoft Visual Studio je vývojové prostředí (IDE) od Microsoftu. Může být použito pro vývoj konzolových aplikací a aplikací s grafickým rozhraním spolu s aplikacemi Windows Forms, webovými stránkami, webovými aplikacemi a webovými službami jak ve strojovém kódu, tak v řízeném kódu na platformách Microsoft Windows, Windows Mobile, Windows CE, .NET, .NET Compact Framework a Microsoft Silverlight.

(20)

Visual Studio obsahuje editor kódu podporující IntelliSense a refaktorování.

Integrovaný debugger pracuje jak na úrovni kódu, tak na úrovni stroje. Další vestavěné nástroje zahrnují designer formulářů pro tvorbu aplikací s GUI.

Visual Studio podporuje jazyky prostřednictvím jazykových služeb, což umožňuje, aby editor kódu a debugger podporoval jakýkoliv programovací jazyk. Mezi vestavěné jazyky patří i C# použitý při tvorbě aplikace.

2.3 Popis aplikace

Aplikace pro analýzu toků v síti je vytvořena pomocí vývojového prostředí Microsoft Visual studio C# 2010 (kapitola 2.2.2). Je programována v jazyce C#

(kapitola 2.2.1) jako formulářová aplikace pro operační systémy Microsoft Windows s platformou .NET Framework verze 4. V programu je možné vytvořit pomocí grafického rozhraní libovolný orientovaný ohodnocený graf (kapitola 2.7.1).

V programu je možné definovat libovolný vrchol grafu jako zdroj i s hodnotou množství, které je schopen poskytnout spotřebičům. Libovolné vrcholy, které neplní úlohu zdrojů, mohou být označeny jako spotřebiče, včetně hodnoty, kterou požadují.

(viz. kapitola 2.7.2)

Program umožňuje vytvořený graf i nadefinované zdroje se spotřebiči exportovat do speciálního XML souboru. Stejný typ souboru je možné v programu importovat (kapitola 2.6).

Software vypisuje během analýzy informační výpisy o postupu algoritmu a na konci každé úlohy vypíše hlášení s výsledkem analýzy a údaji informujícím o délce trvání daného algoritmu.

2.4 Vnitřní struktura programu

Program je vytvořen pomocí objektově orientovaného jazyka C#. Právě

(21)

Objektová reprezentace grafu

Každý vytvořený graf je reprezentován kolekcí objektů třídy „Vrchol“. Dále graf obsahuje dvě kolekce čísel, „zdroje“ a „spotřebiče“. Pro uchování informace o tom, které vrcholy v grafu představují zdroje resp. spotřebiče.

Každá instance třídy „Vrchol“ nese následující informace:

 Id vrcholu.

 Stav semaforu pro práci s vrcholem.

 Kolekci objektů třídy „Hrana“.

 Typ vrcholu.

 Úroveň, představující hladinu od zdroje „s“.

 Množství toku, který aktuálně ve vrcholu přebývá.

Třída Hrana je datový typ zastupující hranu v grafu. Každý objekt třídy Hrana obsahuje informaci o:

 Vrcholu, ze kterého hrana vychází.

 Koncovém vrcholu hrany.

 Kapacitě, kterou je možné při použití hrany využit.

Pomocí předchozích dvou tříd je možné v programu interpretovat libovolný orientovaný ohodnocený graf. Program pracuje s podmnožinami v grafu.

Podmnožinami jsou cesty. Cestou je například výsledek funkce pro hledání nejkratší cesty v grafu. Cesty jsou v programu reprezentovány instancemi třídy „Cesta“, které kolekcí vrcholů definují, přes které vrcholy cesta vede. V jedné proměnné typu

„Vrchol“ také nese informaci o posledním vrcholu cesty, aby bylo možné v použitých algoritmech zjistit, zda se algoritmus nenachází již v posledním vrcholu. Diagram použitých tříd je vyobrazen na následujícím obrázku 5.

(22)

Obrázek 5: Diagram použitých tříd

Aby bylo možné s aplikací pracovat i v průběhu analýzy a nedocházelo k momentům, kdy aplikace neodpovídá, byla v programu použita třída

„BackgroundWorker“. Tato třída umožňuje spouštět funkce v programu v jiném vlákně.

Grafické rozhraní a spuštěný algoritmus pro analýzu tak běží ve dvou odlišných

(23)

naměřenou hodnotu v podobě počtu instrukčních cyklů procesoru, nebo tuto hodnotu v závislosti na typu procesoru převést na jednotku času.

2.5 Časové a výkonnostní srovnání

2.5.1 Asymptotická složitost

Asymptotická složitost je ve výpočetní technice nástroj, který slouží pro popsání efektivity a rychlosti výpočetních algoritmů. Jedná se o způsob popisu, který určuje, jakým způsobem se bude chovat algoritmus při změně velikosti vstupních dat.

Ford-Fulkersonův algoritmus

Hlavní vnější cyklus algoritmu hledá postupně vylepšující cesty. Po použití každé vylepšující cesty je minimálně jedna hrana odebrána. Tento cyklus řeší problém s časovou složitostí ( ). Uvnitř tohoto cyklu je algoritmus pro hledání nejkratší cesty v grafu. Hledání nejkratší cesty probíhá pomocí průchodu grafem do šířky. Algoritmus pro hledání nejkratší cesty v grafu pracuje se složitostí ( ). Složitost celého algoritmu je ( ).

Dinicův algoritmus

Hlavní cyklus algoritmu hledá cesty ze zdroje do spotřebiče délky právě d. Tato délka je nejkratší nezpracovaná vzdálenost cesty v grafu. Počet opakování tohoto cyklu je nejvýše n. Proto je složitost tohoto cyklu ( ). Uvnitř cyklu probíhá algoritmus pro hledání blokujících toků. Tento vnitřní algoritmus pracuje s asymptotickou časovou složitostí ( ). Časová složitost celého algoritmu je ( ).

Golbergův push-relabel algoritmus

Vnější cyklus probíhá, dokud existuje v úloze aktivní vrchol. Maximální počet zvednutí vrcholu je n-1 krát. Za předpokladu, že proběhne nejhorší možný scénář algoritmu, bude potřeba každý vrchol zvednout na maximální hodnotu. Z toho vyplývá, že časová složitost tohoto cyklu je ( ). Vnitřní cyklus algoritmu protlačuje přebytek z aktivního vrcholu po přípustných hranách do sousedících vrcholů. Vzhledem k rozdílným výškám vrcholů v grafu proběhne tento cyklus nejvíce √ krát.

Asymptotická složitost celého algoritmu bude ( √ ) .

(24)

Tabulka 1: Asymptotické složitosti algoritmů

2.5.2 Výkonnostní srovnání

Výkonnostní srovnání algoritmů porovnává všechny tři algoritmy podle doby trvání analýzy. Tato hodnota je odečtena vždy z výsledného výpisu v softwaru na konci každého algoritmu. Údaj použitý pro porovnání výsledků byl počet provedených instrukčních cyklů procesu v průběhu analýzy. Pro přesnější měření byla spuštěna analýza bez volby podrobného výpisu. Protože hustota jednotlivých podrobných výpisů je u každého algoritmu rozdílná a samotný výpis je časově náročnou operací, byly by výsledky se spuštěnou touto volbou velmi zkreslené.

Pro výkonnostní srovnání všech tří algoritmů byly vybrány následující velikosti grafu:

 10 vrcholů.

 100 vrcholů.

 1 000 vrcholů.

 10 000 vrcholů.

Grafy byly vytvořeny pomocí generátoru náhodných grafů, který je součástí vytvořeného softwaru (viz kapitola 2.7.1). Graf každé velikosti byl vygenerován s minimálním a poté maximálním počtem hran. Měření probíhalo na obou těchto grafech. V případě nejmenšího grafu s deseti vrcholy byly označeny dva náhodné vrcholy jako zdroje o produkci 50 a dva spotřebiče o stejném požadavku. Důvodem zvolení hodnoty 50 byl fakt, že generátor ohodnocuje každou hranu v grafu náhodnou kapacitou o velikosti mezi číslem 1 a 100 a proto je zaručeno, že některé hrany se nasytí

(25)

Tabulka 2: Výsledky rychlostních testů

Vrcholy, Hrany 10, 29 10, 76 100, 417 100, 417 1 000, 3 994 1 000, 16 199 10 000, 40 300 10 000, 40 300

Počet zdrojů * tok 2*50 2*50 5*50 5*50 20*50 20*50 10*50 10*50

Počet spot. * tok 2*50 2*50 5*50 5*50 20*50 20*50 10*50 10*50

Ford-Fulkerson 14 000 883 22 000 19 000 332 000 1 234 000 3 968 000 16 439 000

Dinic 7 283 743 19 000 32 000 1 725 000 4 084 000 116 275 000 419 920 000

G: push-relabel 2 395 360 7 000 4 500 18 846 000 113 000 1,8 mld. 1 988 000

Vyřízen požadavek ne ano ano ano ne ano ne ano

Graf

Výsledky (počet instrukčních cyklů procesoru)

Z tabulky je možné vyčíst rozdílné chování jednotlivých algoritmů vzhledem ke změně vstupních dat. Pro každý graf je zeleně zvýrazněno pole s nejlepším výsledkem. Nejhorší výsledek je označen šedě.

Na první pohled je možné konstatovat, že Golbergův push-relabel algoritmus je nejrychlejším algoritmem ze tří zvolených. Ovšem rychlost každého algoritmu je v porovnání s ostatními výkonný či nikoliv v závislosti na podobě vstupních dat.

Například u Golbergova algoritmu, ačkoliv na většině grafů vykazuje nejvyšší výkonnost, se v jistém momentu jeho rychlost dramaticky snižuje. Pokud u tohoto algoritmu dojde ke zpětné vlně protlačování přebytků zpět do zdroje (viz. kapitola 1.3.3), stává se diametrálně pomalejším algoritmem než zbylé dva. Tento jev nastal při pátém a sedmém měření, kdy nebylo možné zásobit spotřebiče a zbylý tok bylo nutné dopravit grafem zpět. V případě, že úloha v grafu s nejvyšším počtem vrcholů měla více hran a tak měla řešení, délka analýzy byla 770 milisekund. Při stejném počtu vrcholů ale menším množství hran úloha nevedla ke splnění požadavku a analýza trvala necelých 15 minut.

Dále je z tabulky 22 zřejmé, že Dinicův algoritmus vykazuje nižší výkonnost při zvyšování složitosti grafu než Ford-Fulkersonův i Golbergův algoritmus. Tento jev je důsledkem implementace v softwaru. Dinicův algoritmus hledá blokující toky na očištěné síti (viz. kapitola 1.3.2) a měl by tak být rychlejší než Ford-Fulkersonův postup. Při složitém grafu dochází velmi často k očišťování sítě a součástí tohoto procesu je vytváření kopie sítě rezerv. Toto cyklické vytváření nových instancí třídy graf je v důsledku použité implementace pomalé a značně ovlivňuje výkonnost algoritmu. Proto se stává při zvyšování počtu vrcholů vždy nejpomalejším algoritmem.

Obecně je možné z měřených údajů konstatovat, že výběr ideálního algoritmu z hlediska rychlosti není jednoznačně možné zvolit před použitím algoritmu. Rychlosti

(26)

analýzy jsou totiž ovlivněny výsledkem úlohy. Lze tedy pouze vycházet z předpokladů, jak by výsledek mohl dopadnout vzhledem k charakteristice grafu.

2.6 Popis souboru pro import a export

Pro import a export vytvořeného grafu se používají soubory s příponou XMG (XML graf). Tento soubor vychází ze značkovacího jazyka XML. Důvodem byl přehledný hierarchický způsob zápisu dat v XML. Zároveň XML značky zastupují objekty přímo v programu a umožňují tak jednoduchý a kvalitní import a export vytvořených objektů. Zpracování XML souborů je podporováno řadou nástrojů a programovacích jazyků. Vzniká tak i možné rozhraní pro další programy, které by s grafem pracovaly. Například pro grafickou interpretaci grafu a následné porovnávání zbytkových grafů s původními.

Soubor XMG popisuje kompletní graf v programu. V hlavičce souboru je definována verze a znakový formát. Program využívá XML verzi 1.0 a znakovou sadu UTF-8. Kořenovou značkou je značka <Uloha>. Celý graf je také zapouzdřen mezi značky <puvodniGraf>. Značka původní graf je nutná z důvodu, že se jedná o algoritmem neovlivněný úplný graf.

Značka <Vrchol> představuje každý vrchol v grafu a je nutné uvést uvnitř značky parametr idVrchol. Uvnitř každého definovaného vrcholu musí být uvedeno, o jaký typ vrcholu se jedná. Typ vrcholu uvádí, zda se jedná o zdroj (<typVrcholu>1</typVrcholu>) nebo spotřebič je hodnota mezi značkami bude „2“.

Pokud vrchol není zdrojem ani spotřebičem tato hodnota je „0“.

Sousedé každého vrcholu se definují uvnitř vrcholu mezi značky <Sousede>.

Každý soused se zapisuje hranou ve formátu <Hrana kapacita="100" idVrcholu="1" />.

Při vytváření nového XMG souboru pro import je potřeba počítat také s vrcholy „s“

(27)

s

3

4

1

2

t

1

1 1 1

1

3 3

Obrázek 6: Ukázkový graf XMG souboru

Graf na obrázku 6 je tvořen celkem šesti vrcholy. Vzhledem k hranám vystupujícím z vrcholu „s“ je dáno, že vrcholy 3 a 4 jsou zdroje. Produkce těchto zdrojů je opět určena kapacitami těchto hran. Do vrcholu „t“ vstupují hrany z vrcholů 1 a 2 a z toho vyplývá, že tyto vrcholy jsou spotřebiče o požadavcích 1 respektive 4. Všechny ostatní hrany určují sousednosti mezi vrcholy a přes tyto hrany je hledán tok mezi „s“

a „t“. Pro takto nadefinovaný graf bude XMG soubor vypadat následovně (obrázek 7):

(28)

Obrázek 7: Ukázka XMG souboru

2.7 Interface

(29)

a které spotřebiče. Prvky této skupiny označeny zelenou barvou a jejich označení začíná číslicí 2. Vpravo dole je poslední část grafického rozhraní s názvem „Výstup“, která slouží pro výpisy o aktuální činnosti algoritmu a uvádí jejich výsledky. Popřípadě je zde možnost uložení celého výstupního výpisu do txt souboru. Prvky této části jsou vyobrazeny modře a označeny číslicí 3.

Obrázek 8: Interface aplikace navigační okno

2.7.1 Vytvoření a modifikace grafu

Pro jakoukoliv práci s aplikací je vždy potřeba pracovat s již vytvořeným a přesně nadefinovaným grafem. K vytvoření grafu slouží prvky označené červeně a očíslovány čísly „1.x“, na navigačním obrázku 8. Graf je možné vytvořit třemi různými způsoby:

 Ruční vytvoření zcela nového grafu.

 Vytvoření náhodného grafu pomocí generátoru přímo v aplikaci.

 V minulosti vytvořený graf naimportovat nebo ručně sestavit soubor pro import (viz. kapitola 2.6).

Chce-li uživatel vytvořit nový graf, postupuje následovně: V levé horní části se nachází tlačítko „Nový vrchol“ (prvek 1.2, obrázek 8). Po použití tohoto tlačítka program vytvoří vždy nový vrchol grafu a vypíše jej do list boxu „vrcholy“ (prvek 1.6, obrázek 8) pod tímto tlačítkem. Výpis vrcholů je ve formě: “vrchol id-Vrcholu (počet sousedů)“. Přičemž id vrcholu je hodnota auto-inkrementovaná reprezentující pořadové

(30)

číslo. Takto vytvořený vrchol nemá žádné sousedící vrcholy ani není sousedícím vrcholem kteréhokoliv jiného vrcholu v grafu. Pro přidání sousedících vrcholů je potřeba v list boxu (prvek 1.6, obrázek 8) „vrcholy“ označit vrchol, pro který bude uživatel sousedy přidávat a poté použít tlačítko „Přidej souseda“(prvek 1.3, obrázek 8).

Okamžitě dojde k vyvolání nového formuláře (viz. obrázek 9), kde je po uživateli požadováno vybrat cílový vrchol (prvek 1, obrázek 9) z množiny již vytvořených vrcholů a kapacitu hrany, která do vrcholu povede (prvek 2, obrázek 9). Vše se potvrdí stisknutím tlačítka „přidej“ (prvek 4, obrázek 9).

Po úspěšném přidání hrany do sousedícího vrcholu, se v list boxu „sousedé“

(prvek 1.6, obrázek 8) vypíše cílový vrchol a kapacita hrany směřující do něj. Výpis všech sousedů se provádí vždy po označení vrcholu v list boxu „vrcholy“. Tímto způsobem uživatel definuje celý graf.

Obrázek 9: Definice souseda

(31)

určuje množství hran, které se budou mezi vrcholy generovat. Je možné vybrat jednu ze tří možností: malé, střední nebo velké množství hran (prvek 3, obrázek 10).

Tato volba určuje interval, ve kterém se bude pohybovat množství vygenerovaných sousedních vrcholů na jeden vrchol. Přičemž volba „malé množství“ odpovídá intervalu 1 až 8 hran připadající na jeden vrchol. Pokud je v grafu menší množství vrcholů než 8, bude jako maximální hodnota vybrána polovina počtu vrcholů v grafu. Volba „střední množství“ pracuje s intervalem 5 až 10 hran na vrchol. Pokud je v grafu nedostatek vrcholů pro tento počet hran, nižší hodnota tohoto intervalu je nahrazena polovinou počtu existujících vrcholů a horní hodnota nahrazena 2/3 počtu vrcholů v grafu. „Velké množství“ je volba, které odpovídá počet 8 až 25 hran na jeden vrchol. Pokud je v tomto případě nedostatek vrcholů, použijí se hodnoty 2/3 počtu vrcholů až počet vrcholů mínus jedna.

Po zadání všech potřebných hodnot uživatel pomocí tlačítka „vytvoř“ (prvek 5, obrázek 10) spustí generování náhodného grafu.

Obrázek 10: Generátor grafu

Třetí možnost vytvoření grafu je pomocí tlačítka „import xmg“ vyobrazeném na obrázku 8 jako prvek 1.12, kdy program celý graf naimportuje ze souboru s příponou xmg, který byl stejným programem vyexportován. Nebo je možné vytvořit nový xmg soubor ručně uživatelem, přesně podle pravidel xml exportu tohoto programu a takový soubor importovat. Popis XML struktury je uveden v kapitole 2.6.

(32)

V každém grafu v aplikaci existují také dva speciální vrcholy „s“ a „t“. Vrchol

„s“ představuje všechny zdroje v grafu a vrchol „t“ všechny spotřebiče. Jsou to pomocné vrcholy, díky nimž algoritmus nemusí řešit tok od každého zdroje zvlášť do jednotlivých spotřebičů, ale řeší pouze tok mezi těmito dvěma body. Vrcholy „s“

a „t“ nejsou v list boxech všech dosavadních vrcholů ani sousedů vidět. Aplikace s nimi pracuje automaticky a jejich id jsou:

 s: Vrchol id = -1.

 t: Vrchol id = -2.

V aplikaci je také možné vrcholy i sousedy jednotlivých vrcholů z grafu odstraňovat. Vrcholy lze odstraňovat buď jednotlivě pomocí tlačítka „smaž“ (prvek 1.1, obrázek 8) nebo hromadně pomocí tlačítka „smaž vrcholy“ označeného číslem 1.13 na obrázku 8. Tlačítko pro mazání jednotlivých vrcholů je možné použít až po označení vrchol v seznamu existujících vrcholů. Hromadné mazání vrcholů probíhá tak, že po stisknutí tlačítka „smaž vrcholy“ se vyvolá nový formulář, ve kterém uživatel vybere jeden nebo více vrcholů, které budou z grafu odebrány a stiskne tlačítko „smaž označené“.

Sousedy jednotlivých vrcholů může uživatel také mazat či upravovat. Smazání souseda proběhne po označení vrcholu v seznamu sousedů a stisknutím tlačítka

„odeber“ (prvek 1.4, obrázek 8). Odebrání má za následek smazání hrany mezi vrcholem a sousedem, nikoliv odebrání vrcholu z grafu. Aplikace umožňuje hranu mezi vrcholy také modifikovat. Úpravou je myšleno měnit kapacitu hrany. Úpravu kapacity hrany uživatel provede kliknutím na tlačítko „uprav“ (prvek 1.5, obrázek 8). Následně se vyvolá formulář, ve kterém jsou vypsány informace o vrcholu, ze kterého hrana vychází, do kterého vrcholu směřuje a aktuální kapacita hrany. V tomto formuláři uživatel může vyplnit novou hodnotu kapacity hrany a potvrdit úpravu.

(33)

obrázek 8), ve kterém si uživatel vybere, s jakým vrcholem bude pracovat. Pod combo boxem je textové pole, kde je nutné uvést celočíselnou hodnotu (prvek 2.4, obrázek 8).

Hodnota musí být celočíselná pro splnění podmínky konečnosti použitých algoritmů.

V případě že vrchol bude označen jako zdroj, bude tato hodnota představovat jeho maximální možný tok. V případě, že vrchol bude označen jako spotřebič, bude tato hodnota vyjadřovat množství toku požadující po zdrojích. Označení vrcholu se potvrdí stisknutím tlačítka „označ jako zdroj“ (prvek 2.1, obrázek 8) nebo „označ jako spotřebič“ (prvek 2.3, obrázek 8).

Druhá varianta je označení několika vrcholů za zdroje či spotřebiče pomocí implementované funkce pro výběr náhodných vrcholů v grafu. Tato funkce umožňuje uživateli označit náhodné vrcholy jako zdroje či spotřebiče ve větším množství.

Při zvolení této varianty postupuje uživatel následovně. Použitím tlačítka 2.2 na obrázku 8 se vyvolá nový formulář „Generátor označení“ (viz. obrázek 11). V tomto formuláři je uživatel dotazován, kolik vrcholů má být vybráno jako zdroj a kolik jako spotřebič.

Počet vrcholů, které budou označeny jako zdroj uživatel uvádí do text boxu 1 na obrázku 11. Počet vrcholů, které budou označeny jako spotřebič do text boxu 4 na obrázku 11. Označování vrcholů probíhá na již vytvořeném grafu, a proto je nutné dodržet maximální přípustné množství vrcholů pro označení. Jinými slovy součet všech vrcholů a všech spotřebičů nemůže být větší než celkový počet vrcholů v grafu. Tato podmínka je ošetřena aplikací. Při zadání vyššího čísla než je přípustné pro vytvořený graf, je tato hodnota při opuštění text boxu automaticky opravena na maximální možnou hodnotu. Tato podmínka uvažuje také s množstvím zdrojů a spotřebičů, které uživatel míní vytvořit generátorem. Jinak řečeno pokud uživatel v generátoru vyplní maximální přípustné množství pro nové zdroje, nemůže již zadat množství nových spotřebičů vyšší než 0, protože veškeré neoznačené vrcholy v grafu již budou použity jako zdroje. Oba formuláře jsou vzájemně ovlivněny touto podmínkou.

Po zadání počtů vrcholů je potřeba uvést novým zdrojům hodnotu produkovaného toku a spotřebičům tok, který požadují. Množství toku, které bude uvedeno, platí pro všechny zdroje respektive spotřebiče, které se vytvoří. Například pokud uživatel zadá množství produkce 10, pak každý ze zdrojů vytvořený generátorem bude produkovat tok o hodnotě 10. Toto platí také pro spotřebiče. Tok, který budou zdroje produkovat uživatel zadává do text boxu 2 na obrázku 11. Požadavek spotřebičů

(34)

uživatel zadává do text boxu 3 na obrázku 11. Pro spuštění označování uživatel použije tlačítko 5 na obrázku 11 a aplikace provede označení vrcholů.

Dole v tomto bloku jsou dva list boxy vypisující již existující zdroje a spotřebiče. Je také možné pro nadefinování zdrojů a spotřebičů použít import a export celého grafu, kdy se v souboru s grafem nedefinují také všechny zdroje a spotřebiče.

Popis XML struktury je uveden v kapitole číslo 2.6.

Obrázek 11: Generátor zdrojů a spotřebičů

2.7.3 Spuštění analýzy a výpisy aplikace

Pokud je již nadefinován graf včetně zdrojů a spotřebičů, může uživatel spustit analýzu. Uživatel vybere zaškrtnutím check boxů požadované algoritmy:

 Ford-Fulkersonův algoritmus (viz kapitola 1.3.1).

 Dinicův algoritmus (viz kapitola 1.3.2).

 Goldbergův push relabel algoritmus (viz kapitola 1.3.3).

(35)

 Podpis algoritmu.

 Informace o začátku / ukončení analýzy.

 Celková doba běhu algoritmu v jednotkách instrukčního cyklu procesoru.

 Celková doba běhu algoritmu v milisekundách.

Pokud uživatel požaduje podrobnější výpis informací, označí před spuštěním analýzy check box „podrobný výpis“ (prvek 3.2, obrázek 8). Při této volbě bude aplikace mimo již uvedené výpisy také informovat o aktuální činnosti algoritmu.

Tyto výpisy jsou specifické pro každý algoritmus. Například v případě Dinicova algoritmu budou výpisy obsahovat momenty, kdy probíhá čištění sítě a jaké toky v ní byly použity, v případě Golbergova push-relabel algoritmu to budou informace o aktivních vrcholech a postupném protlačování přebytků toku z těchto vrcholů.

(36)

3 Praktická aplikace

Toky v sítích patří k nejčastěji aplikovaným částem teorie grafů. Pomocí toků je možné modelovat mnoho praktických situací. K popisu se využívá ohodnocený orientovaný graf, kterým lze popsat jakákoliv obecná síť. V této kapitole se popíše vybraná oblast železniční sítě v České republice orientovaným grafem a následně se vyřeší dvě úlohy týkající se analýzy toků v síti.

3.1 Vytvoření sítě

Pro řešení praktické úlohy byla vybrána železniční síť. Tato síť je grafem reprezentována následovně:

 Vrcholy jsou železniční stanice.

 Hrany mezi vrcholy reprezentují úseky železniční tratě mezi stanicemi.

 Kapacita hran odpovídá maximálnímu počtu lidí, přepravených po daném úseku tratě (po hraně).

 zdroje budou představovat libovolné železniční stanice, ve kterých budou lidé pouze nastupovat.

 spotřebiče jsou takové železniční stanice, ve kterých lidé pouze vystupují. Jinými slovy stanice, představující cílovou zastávku pro pasažéry.

Aby bylo možné správně ohodnotit graf kapacitami, je třeba uvést, že veškeré hodnoty budou znamenat počet pasažérů za jeden den. Pokud tedy například kapacita hrany v jednom směru bude mít hodnotu 200, bude to znamenat,

(37)

Liberec 11

Turnov 24

Mladá Boleslav 28

Stará Paka 31

Jičín 54

Chlumec n. Cidl.

58

Hradec Králové 43 086

086

Kolín 47 Česká Lípa 18

Černousy 1

Trutnov 35 Harrachov 10 2

3

4 5

6 7

8 9 12

14 13 15

16 17

19 20

21

22 23

25 26

60

29 30

32 33

34

36

37

38

39

40 41

42

44 45 46

48 49 50 51

52

53 55

56

57 59 27

Obrázek 12: Oblast železniční sítě

Na obrázku 12 je vyobrazena část železniční sítě České republiky v oblasti mezi Libereckým a Královehradeckým krajem. Černé kružnice označují stanice a modré úseky představují trasy železnice. Každá stanice je číselně označena. Toto označení slouží pouze pro popis stanic v softwaru a ve skutečné mapě železniční sítě nevystupuje. Z důvodu, že pro řešení v aplikaci je důležitější číselné označení jednotlivých vrcholů, není většina měst v mapě označena. Stanice, u nichž je název města, se nijak neliší od ostatních vrcholů. Popisky měst slouží pouze pro geografickou orientaci v mapě. Modré číselné označení tras odpovídá skutečnému číslu traťového úseku podle podkladů českých drah. Nejedná se tedy o kapacity hran ale pouze o identifikační čísla. Seznam všech měst vzhledem k číselnému označení je v tabulce 3.

Veškeré potřebné údaje pro popis této sítě jsou uvedeny v tabulce 4.

(38)

Tabulka 3: Seznam měst

1 Černousy 21 Doksy 41 Dvůr Králové

2 Frýdlant 22 Bakov n/J 42 Smiřice

3 Jindřichovice p. Smrkem 23 Mnichovo Hradiště 43 Hradec Králové

4 Raspenava 24 Turnov 44 Rosice n/L

5 Bíly potok p. Smrkem 25 Železný Brod 45 Pardubice

6 Jablonec n/N 26 Semily 46 Přelouč

7 Josefův Důl 27 Jablonec n/J 47 Kolín

8 Smržovka 28 Mladá Boleslav 48 Velký Osek

9 Tanvald 29 Dolní Bousov 49 Poděbrady

10 Harrachov 30 Libuň 50 Nymburk

11 Liberec 31 Stará Paka 51 Veleliby

12 Hrádek n/N 32 Martinice 52 Křinec

13 Zittau 33 Kunčice n/L 53 Kopidlno

14 Varnsdorf 34 Vrchlabí 54 Jičín

15 Rybniště 35 Trutnov 55 Ostroměř

16 Jedlová 36 Svoboda n/Ú 56 Lázně Bělorad

17 Nový Bor 37 Královec 57 Hněvčeves

18 Česká Lípa 38 Č. Kostelec 58 Chlumec n/Cidl.

19 Mimoň 39 Starkoč 59 Hostinné

20 Jablonné v. Podj. 40 Jaroměř 60 Rokytnice n/J

Tabulka 4: Seznam železničních tras

Trasa č. Trasa mezi městy Vrcholy jízd/d Kapacita c

010 Kolín, Přelouč, Pardubice 47, 46, 45 54 44280

020 Hradec Králové, Chlumec n/C, Velký Osek 43, 58, 48 6 1980

030 Liberec, Turnov, Železný Brod, Semily, Stará Paka 11, 24, 25, 26, 31 19 4750

030 Stará Paka, Dvůr Králové n/L, Jaroměř 31, 41, 40 16 2400

031 Jaroměř, Smiřice, Hradec Králové, Rosice, Pardubice 40, 42, 43, 44, 45 34 8160 032 Jaroměř, Starkoč, Červený Kostelec, Trutnov 40, 39, 38, 35 14 5040

034 Smržovka, Josefův Důl 8, 7 10 800

035 Železný Brod, Tanvald 25, 9 14 1960

036 Liberec, Jablonec n/N, Smržovka, Tanvald 11, 6, 8, 9 22 2640

036 Tanvald, Harrachov 9, 10 13 1300

037 Liberec, Raspenava, Frýdlant 11, 4, 2 8 1280

037 Frýdlant, Černousy 2, 1 5 800

038 Raspenava, Bílý Potok 4, 5 8 720

039 Frýdlant, Jinřichovice p. Smrkem 2, 3 6 510

040 Stará Paka, Martinice, Kunčice, Hostinné, Trutnov 31, 32, 33, 59, 35 8 2160 040 Stará Paka, Lázně Bělohrad, Ostroměř, Chlumec n/C 31, 56, 55, 58 13 3510

041 Turnov, Libuň, Jičín 24, 30, 54 10 2000

041 Jičín, Ostroměř, Hněvčeves, Hradec Králové 54, 55, 57, 43 11 2200

042 Martinice, Jablonec n/J 32, 27 9 720

042 Jablonec n/J, Rokytnice 27, 60 1 80

043 Trutnov, Královec 35, 37 3 255

044 Kunčice, Vrchlabí 33, 34 17 1530

045 Trutnov, Svoboda n/Ú 35, 36 12 1080

061 Veleliby, Křinec, Kopidlno, Jičín 51, 52, 53, 54 11 1650

062 Chlumec n/C, Křinec 58, 52 6 480

064 Stará Paka, Libuň, Dolní Bousov, Mladá Boleslav 31, 30, 29, 28 6 720 820

pasaž./s

330 250 150 240 360 80 140 120 100 160 160 90 85 270 270 200 200 80 80 85 90 90 150

80 120

(39)

Hodnoty v tabulce 4 plně definují celou uvedenou železniční síť. Na obrázku 12 lze vyhledat libovolnou trasu a pomocí tabulky 4 zjistit o který úsek se jedná a jaká je maximální kapacita tohoto úseku (této hrany). Pokud například zjišťujeme kapacitu hrany mezi vrcholy 11 a 6 a postupujeme následovně:

1. Na obrázku 12 zjistíme číslo trasy mezi vrcholy 11 a 6. V tomto případě je to číslo trasy 036.

2. V tabulce 4 vyhledáme řádek popř. řádky s číslem trasy 036.

3. V případě, že řádků je více je nutné vybrat ten řádek, ve kterém se jedná o trasu mezi vrcholy 11 a 6.

4. Z hodnot v tabulce lze nyní vyčíst, že se jedná o trasu mezi městy:

Liberec, Jablonec n/N, Smržovka, Tanvald. Dalším údajem je, že na této trase se pohybuje během dne několik typů vlakových souprav, jejichž průměrný maximální počet pasažérů je 120. Vlaky projedou na trase 22 krát denně, a proto je výsledná kapacita hrany mezi těmito vrcholy rovna číslu 2640.

Informace v tabulce jsou podloženy skutečnými daty uváděnými Českými drahami. Pro zjištění hodnot uvedených v tabulce 4 byl zvolen konkrétní den v roce a to svátek z důvodu zpřehlednění informací. Zdrojem byl internetový server

„http://www.zelpage.cz/razeni“. Přičemž maximální kapacita soupravy je počet míst pro pasažéry udávaný výrobcem vagonů. Podle pravidel Českých drah se na konkrétních trasách železnice pohybují přesně dané vlakové soupravy. Z toho vyplývá, že při zanedbání dnů s rozdílným denním provozem, získáváme přesný popis železniční sítě. Jinými slovy na trase č. 036 z Tanvaldu do Harrachova jezdí soupravy, jejichž průměrná maximální kapacita je 100 pasažérů, 13 krát denně, a proto je kapacita této hrany vždy 1300. Soupravy jezdí po trasách vždy ve stejném počtu v obou směrech, a proto je kapacita hran v obou směrech stejná.

S takto definovaným grafem je možné řešit pomocí vytvořené aplikace různé úlohy o propustnosti. Oblast železniční sítě na obrázku 12 je součástí elektronické přílohy v adresáři „\priklady XMG\zeleznicni_trat.xmg“.

(40)

3.2 Řešení úloh

První úloha s tímto grafem bude zjišťovat propustnost po železniční síti mezi Libercem a Hradcem Králové (nebude uvažována časová dostupnost nalezené cesty).

Do již nadefinovaného grafu v programu přibude nový zdroj a spotřebič. Jako zdroj bude zvolen vrchol 11 (Liberec). Město Liberec má zhruba sto tisíc obyvatel, a proto hodnota produkce tohoto zdroje bude 100 000. Pro zjištění maximální propustnosti mezi těmito vrcholy bude označen vrchol 43 (Hradec Králové) jako spotřebič a jeho požadavek bude také hodnota 100 000. Po spuštění analýzy končí všechny tři algoritmy se stejným výsledkem. Výstup aplikace pro Ford-Fulkersonův algoritmus bez použití podrobného výpisu je následující:

>>FORD-FULKERSON | Začínám analyzovat|

>>FORD-FULKERSON | Dokončeno | Nelze zásobovat spotřebiče, zbývá: 91370

>>FORD-FULKERSON | čas: | 3031 (tiks)

>>FORD-FULKERSON | čas: | 1 (ms)

Z výpisu lze vyčíst, že spotřebiče nelze zásobovat a z celkového požadavku 100 000 stále chybí 91 370. Propustnost železniční sítě mezi Libercem a Hradcem Králové je tedy 8630 pasažérů za jeden den. Další informace z výsledného výpisu oznamují, že software pomocí Ford-Fulkersonova algoritmu, vyřešil tuto úlohu za 1 milisekundu a pro dokončení analýzy procesor vykonal 3031 instrukčních cyklů.

Ve druhé úloze bude probíhat analýza s jedním zdrojem a třemi spotřebiči.

V tomto případě bude potřeba zjistit maximální propustnost z jednoho města do tří odlišných. Řekněme, že z určitého důvodu bude třeba všechny občany jednoho města transportovat do konkrétních tří měst, například kvůli přítomnosti kvalitní nemocnice.

Aby řešení nebylo na první pohled jednoznačné, všechna čtyři města byla zvolena tak, aby se v nich křížilo více tras s většími kapacitami.

(41)

kapacitu v obou směrech. Zdroje tak budou vrcholy 28 (Mladá Boleslav), 43 (Hradec Králové), 11 (Liberec). Produkce všech zdrojů bude počet obyvatel města Turnov tedy 14 400. Spotřebič bude vrchol 24 (Turnov) s požadavkem také 14 400.

Výstup po analýze pomocí Dinicova algoritmu je následující:

>>DINIC | Začínám analyzovat | Graf - počet vrcholů: 62 počet hran: 147

>>DINIC | Dokončeno | Nelze zásobovat spotřebiče, zbývá: 180

>>DINIC | čas: | 10374 (tiks)

>>DINIC | čas: | 5 (ms)

Výpis oznamuje, že maximální tok mezi zdroji a spotřebičem je o hodnotu 180 menší než požadovaný. Z tohoto vyplývá, že pomocí nadefinované železniční sítě je možné během jednoho dne dopravit až na posledních 180 lidí všechny obyvatele města Turnov do měst Liberec, Hradec Králové a Mladá Boleslav.

(42)

Závěr

V rámci bakalářské práce byla úspěšně vytvořena aplikace pro analýzu toků v síti. Program byl vytvořen pomocí vývojového prostředí Microsoft Visual Studio v programovacím jazyce C#. Aplikace umožňuje definovat libovolný orientovaný graf a v tomto grafu definovat vybrané vrcholy jako zdroje či spotřebiče. Program korektně analyzuje toky v sítích pomocí Ford-Fulkersonova, Dinicova a Golbergova push-relabel algoritmu. Analýzu je možné spustit s volbou podrobného výpisu, kdy aplikace vypisuje důležité kroky algoritmu a umožňuje tak pochopit chování algoritmů v praxi.

V programu je dále implementována možnost ukládání a načítaní veškerých vstupů z a do speciálního XMG souboru. Součástí aplikace je generátor náhodných grafů a generátor označení náhodných vrcholů za zdroje a spotřebiče. Součástí bakalářské práce je popis práce s vytvořenou aplikací.

V rámci bakalářské práce byly jednotlivé implementované algoritmy porovnány z hlediska rychlosti výpočtu.

Pomocí vytvořené aplikace byly vyřešeny úlohy o propustnosti v síti, tvořené skutečnou oblastí železniční sítě v České republice.

(43)

Použitá literatura

[1] ČERNÝ, Jakub. Obsah. Základní grafové algoritmy [online]. MFF UK,

Praha, 2010 [cit. 2013-05-15]. Dostupné z:

http://kam.mff.cuni.cz/~kuba/ka/

[2] DEMEL, Jiří. Grafy a jejich aplikace. Vyd. 1. Praha: Academia, 2002, 257 s. ISBN 80-200-0990-6.

[3] DVOŘÁK, Tomáš. Toky v sítích. 2009, 22 s. Dostupné z:

http://ksvi.mff.cuni.cz/~dvorak/vyuka/UIN009/Toky.pdf

[4] JIROVSKÝ, Lukáš. Toky v sítích. Teorie grafů [online]. 2010 [cit. 2013- 05-15]. Dostupné z: http://teorie-grafu.cz/vybrane-problemy/toky-v- sitich.php

[5] DRAYTON, Peter, Ben ALBAHARI a Ted NEWARD. C# v kostce:

pohotová referenční příručka. 1. vyd. Překlad Karel Voráček. Praha:

Grada, 2003, 764 s. ISBN 80-247-0443-9.

[6] MAREŠ, Martin. Krajinou grafových algoritmů: průvodce pro středně pokročilé. Vyd. 1. Praha: ITI, 2007, 71 s. ISBN 978-80-239-9049-2.

[7] Tok v síti. In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation, 2001 [cit. 2013-05-15]. Dostupné z:

http://cs.wikipedia.org/wiki/Tok_v_s%C3%ADti

[8] CORMEN, Thomas H. Introduction to algorithms. 3rd ed. Cambridge:

MIT Press, 2009, 1292 s. ISBN 978-0-262-03384-8.

(44)

Elektronická příloha

 Soubor BakalarskaPrace.pdf s textem bakalářské práce ve formátu pdf.

 Složka s aplikací.

 Složka s vytvořenými grafy v souborech XMG.

 Složka se zdrojovými kódy aplikace.

References

Related documents

Cílem bakalářské práce je sestavit výpočetní program pro výpočet základních vratných změn stavu v ideálním plynu, který by měl sloužit jako pomůcka při

Student od počátku přistupoval k práci velmi iniciativně a prakticky samostatně zvláclnul celou poměrně složitou problematiku rozšíření vyuŽití programu

Hodnocen´ı navrhovan´ e vedouc´ım bakal´ aˇ rsk´ e pr´ ace: velmi dobře minus Hodnocen´ı navrhovan´ e oponentem bakal´ aˇ rsk´ e pr´ ace:.. Pr˚ ubˇ eh obhajoby bakal´

V čem vidíte hlavní příčiny masivní robotizace čínského průmyslu, již jsme svědky v posledních letech?. Nabízí tento čínský/světový trend příležitosti i pro

Literárně-dramatická výchova je důležitou součástí předškolního vzdělávání. Dítě se v tomto věku teprve učí být jedincem, který je součástí okolního

V současné době se velmi často používá pojem optimální řešení, i diplomantka jej často používá.. Jsem přesvědčen, že zná správné české synonymum ke

(Kalinová 2014, s. Jak už jsem výše zmiňovala, genetická metoda je spojována s hláskováním. Co se týče zaměření metody, analyticko-syntetická metoda klade důraz

1 - administrativní informace – KDO, KDE je pracoviště umístěno, čeho je součástí, kdo je jeho majitel či zřizovatel, případně jaká je je organizační