Mendelova univerzita v Brně Provozně ekonomická fakulta
Modely dopravních úloh minimalizující dobu přepravy Disertační práce
Vedoucí práce: doc. Ing. Josef Holoubek, CSc.
Ing. Pavel Kolman
Brno 2012
2
Na tomto místě bych rád poděkoval doc. Ing. Josefu Holoubkovi, CSc. za odborné vedení, cenné připomínky a zejména za trpělivost, kterou projevoval v průběhu vzniku této disertační práce. Mé díky patří také všem blízkým, kteří mě při psaní této práce podporovali.
4
Prohlašuji, že jsem tuto disertační práci vypracoval samostatně s využitím pramenů uvedených v seznamu použité literatury.
V Brně dne 30. srpna 2012
....................................................
6
7
Abstract Kolman, P. Transportation problem models to minimize transportation time. Dissertation thesis. Brno, 2012. In this dissertation, methods were proposed for solving models of specific transportation problem to minimize the necessary transportation time. For the proposed models, software was prepared to find solutions to the models. The methods were verified, statistically evaluated and compared using quality of the obtained solutions and time required for solution finding. Finally, for every described method, a practical example was provided.
Abstrakt Kolman, P. Modely dopravních úloh minimalizující dobu přepravy. Disertační práce. Brno, 2012. V disertační práci jsou navrženy způsoby řešení specifických typů modelů dopravních úloh minimalizujících čas přepravy. Dále je vytvořen podpůrný software, který tyto modely řeší. Navržené metody jsou verifikovány a statisticky vyhodnoceny, přičemž je porovnána kvalita získaného řešení a čas potřebný k jeho nalezení. U každé metody je předvedena názorná ukázka její aplikace na konkrétním příkladě.
8
9
OBSAH
Obsah 1 Úvod
13
2 Cíl práce
15
3 Literární přehled 3.1 Matematické modelování . . . . . . . . . . . . . . . 3.1.1 Průběh rozhodovacího procesu . . . . . . . . 3.2 Operační výzkum a jeho disciplíny . . . . . . . . . 3.3 Matematické programování . . . . . . . . . . . . . . 3.4 Lineární programování . . . . . . . . . . . . . . . . 3.5 Simplexová metoda . . . . . . . . . . . . . . . . . . 3.5.1 Kanonický tvar . . . . . . . . . . . . . . . . 3.5.2 Test optimality . . . . . . . . . . . . . . . . 3.5.3 Změna báze . . . . . . . . . . . . . . . . . . 3.5.4 Ukončení výpočtu . . . . . . . . . . . . . . . 3.6 Konečnost simplexové metody . . . . . . . . . . . . 3.6.1 Problém degenerace a zacyklení . . . . . . . 3.6.2 Výběr klíčového políčka dle Tyce . . . . . . 3.6.3 Charnesova perturbační metoda . . . . . . . 3.6.4 Blandův algoritmus výběru klíčového políčka 3.7 Vícekriteriální optimalizace . . . . . . . . . . . . . 3.7.1 Lexikografická metoda . . . . . . . . . . . . 3.8 Úlohy řešené pomocí lineárního programování . . . 3.9 Typy distribučních úloh . . . . . . . . . . . . . . . 3.9.1 Obecná dopravní úloha . . . . . . . . . . . . 3.9.2 Kontejnerový dopravní problém . . . . . . . 3.9.3 Obecný distribuční problém . . . . . . . . . 3.9.4 Dopravní úloha s mezičlánkem . . . . . . . . 3.9.5 Přiřazovací problém . . . . . . . . . . . . . . 3.9.6 Úloha o pokrytí . . . . . . . . . . . . . . . . 3.9.7 Okružní dopravní problém . . . . . . . . . . 3.10 Základní pojmy z informatiky . . . . . . . . . . . . 3.11 Hodnocení kvality algoritmů . . . . . . . . . . . . . 4 Metodika práce 4.1 Testování statistických hypotéz . . . . . . . . . 4.2 Testy o tvaru rozdělení . . . . . . . . . . . . . . 4.2.1 χ2 -test dobré shody . . . . . . . . . . . . 4.2.2 Test podle Shapira-Wilka . . . . . . . . 4.3 Parametrické testy . . . . . . . . . . . . . . . . 4.3.1 Hypotéza o střední hodnotě . . . . . . . 4.3.2 Hypotéza o shodě dvou středních hodnot
. . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
16 16 16 18 18 19 20 20 21 22 23 25 25 25 26 27 28 28 29 30 30 31 32 33 34 34 35 36 37
. . . . . . .
39 39 40 40 41 42 42 42
10
OBSAH
4.4 4.5 4.6
4.7 4.8
4.3.3 Hypotéza o rozptylu . . . . . . 4.3.4 Hypotéza o shodě dvou rozptylů Neparametrické testy . . . . . . . . . . 4.4.1 Wilcoxonův dvouvýběrový test Regresní analýza . . . . . . . . . . . . 4.5.1 Lineární regresní model . . . . . Modelovací jazyk Lingo . . . . . . . . . 4.6.1 Ovládání programu . . . . . . . 4.6.2 Popis jazyka, zápis modelů . . . 4.6.3 Využití modelovacího jazyka . . 4.6.4 Nejdůležitější funkce . . . . . . Software Gretl . . . . . . . . . . . . . . Vývojové prostředí jazyka Delphi . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
43 44 44 45 45 45 46 46 47 48 51 52 52
5 Návrh vlastní metodiky 5.1 Modifikace Blandova algoritmu eliminujícího zacyklení . . . . . . . . 5.2 Dynamická dopravní úloha s celkovým přepravovaným množstvím . . 5.2.1 Popis řešeného problému . . . . . . . . . . . . . . . . . . . . . 5.2.2 Návrh řešení problému . . . . . . . . . . . . . . . . . . . . . . 5.3 Dynamická dopravní úloha s dílčími limity přepravovaného množství . 5.3.1 Popis modelu DTPN . . . . . . . . . . . . . . . . . . . . . . . 5.3.2 Rychlý algoritmus úlohy DTPN dávající přípustné řešení . . . 5.3.3 Pomalá verze řešení úlohy DTPN, bez ověření optimality řešení 5.3.4 Algoritmus nalézající optimální řešení . . . . . . . . . . . . . .
53 53 54 55 55 57 57 58 60 61
6 Vlastní práce 6.1 Knihovna datova struktura.pas . . . . . . . . . . . . . . . . . . . . 6.2 Knihovna simplexka.pas . . . . . . . . . . . . . . . . . . . . . . . . 6.2.1 Export modelů do Linga . . . . . . . . . . . . . . . . . . . . 6.2.2 Export modelů do TEXu . . . . . . . . . . . . . . . . . . . . 6.2.3 Testování knihovny simplexka.pas . . . . . . . . . . . . . . . 6.3 Optimalizace krmných směsí . . . . . . . . . . . . . . . . . . . . . . 6.3.1 Vlastní program pro optimalizaci krmných směsí . . . . . . . 6.3.2 Vstupní data a jejich formát . . . . . . . . . . . . . . . . . . 6.3.3 Výstupní data . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.4 Modifikace knihovny simplexka.pas . . . . . . . . . . . . . . 6.3.5 Program krmiva.pas . . . . . . . . . . . . . . . . . . . . . . 6.3.6 Hledání optimálního řešení při míchání krmných směsí . . . 6.3.7 Praktické využití programu . . . . . . . . . . . . . . . . . . 6.4 Dynamická dopravní úloha s celkovým přepravovaným množstvím . 6.4.1 Nově definované datové struktury . . . . . . . . . . . . . . . 6.4.2 Procedury a funkce knihovny dynamicka dopravni uloha.pas 6.4.3 Struktura vstupních souborů . . . . . . . . . . . . . . . . . .
63 63 65 69 70 70 77 77 78 80 80 82 83 85 86 86 88 95
. . . . . . . . . . . . . . . . .
11
OBSAH
6.5
6.4.4 Konzolová aplikace DTP.exe . . . . . . . . . . . . . . . . . . . 6.4.5 Model přepravy s jednou časovou jednotkou . . . . . . . . . . 6.4.6 Přeprava kalamitního dřeva . . . . . . . . . . . . . . . . . . . Dynamická dopravní úloha s dílčími limity přepravovaného množství . 6.5.1 Datová struktura modelu . . . . . . . . . . . . . . . . . . . . . 6.5.2 Knihovna unit DTPN fast.pas . . . . . . . . . . . . . . . . . . 6.5.3 Knihovna unit DTPN slow.pas . . . . . . . . . . . . . . . . . 6.5.4 Knihovna unit DTPN optimal.pas . . . . . . . . . . . . . . . . 6.5.5 Konzolová aplikace dtpn.exe . . . . . . . . . . . . . . . . . . . 6.5.6 Meření času výpočtů . . . . . . . . . . . . . . . . . . . . . . . 6.5.7 Srovnání algoritmů . . . . . . . . . . . . . . . . . . . . . . . . 6.5.8 Přeprava sklízeného ovoce . . . . . . . . . . . . . . . . . . . .
95 97 100 107 107 109 112 113 115 116 116 120
7 Diskuze
125
8 Závěr
131
Literatura
133
Přílohy
136
A Model směšovacího problému
137
B Směšovací problém ve vstupním formátu programu
139
C Denní rozpisy odeslaných a přijatých vagonů
141
D Úlohy DTPN řešené algoritmem fast
143
E Úlohy DTPN řešené algoritmem slow
152
F Úlohy DTPN řešené algoritmem optimal
161
G Denní rozpisy odeslaného a dodaného ovoce
171
12
OBSAH
1
1
ÚVOD
13
Úvod
Mezi charakteristické znaky dnešní doby patří nezpochybnitelný technologický pokrok, který zasahuje do mnoha oborů lidské činnosti, a který se nevyhnul ani oblasti kvantitativních metod. Došlo také ke vzniku zcela nových oborů a ovlivnění těch stávajících nově vzniklými. Mezi relativně nové obory, které v posledních desetiletích zažily obrovský rozvoj, patří i informatika ve spojení s výpočetní technikou. Její vývoj ovlivnil i matematiku a tím i oblast kvantitativních metod, neboť díky možnostem využití výpočetní techniky se těmto oblastem otevřely naprosto nové a dříve netušené možnosti. Úlohy, které byly dříve lidskými silami v reálném čase efektivně neřešitelné, se s pomocí počítačů staly řešitelné hravě. Vznikla celá řada nových metod, které byly dříve nemyslitelné. Mezi tyto obory, které jsou úzce spjaty s rozvojem počítačů, patří i operační výzkum. Rozvoj počítačů umožnil rozvoj matematického modelování a především metod pro řešení těchto modelů. Jednou z nich, univerzální pro řešení modelů lineárního programování, je i simplexová metoda. Obrovskou předností je její poměrně rozumná časová složitost. I když v nejhorším možném případě může být počet kroků potřebných k nalezení optimálního řešení až exponenciální vzhledem k rozměrům modelu, v drtivé většině případů tomu tak není a časová složitost metody je pouze polynomiální. To přispívá k obecně dobré řešitelnosti těchto typů úloh. I když pro většinu řešených problémů jsou k jejich popisu nutné nelineární modely, u nichž bývá nalezení optimáního řešení nepoměrně obtížnější, existuje nezanedbatelná skupina problémů, které lze modelovat pomocí lineárního programování a řešit simplexovou metodou. Potom, existuje-li možnost volby, je lepší sestavit model lineární. V rámci množiny úloh lineárního programování existují i speciální případy těchto úloh. Tyto modely potom mají specifickou strukturu, a ačkoli jsou přímo řešitelné simplexovou metodou, byly vyvinuty metody, které využívají struktury těchto modelů k nalezení optimálního řešení s potenciálně lepší časovou složitostí, než je samotná simplexová metoda. Mezi tyto speciální případy patří i dopravní úlohy, mající za cíl minimalizovat cenu přepravy. Jedním z problémů, který se v matematickém modelování objevuje poměrně často je, že i malá změna zadání způsobí rozsáhlou změnu modelu a do značné míry je schopna ovlivnit i jeho řešitelnost tou kterou metodou. To je případ i dopravních úloh, jejichž optimalizačním kriteriem je minimalizace přepravní doby. Pro tyto typy modelů nebylo možné použít některou ze známých metod řešení, proto bylo nutné pro sestavené modely navrhnout způsob, jak je vyřešit. Využití modelů dopravních úloh minimalizujících dobu potřebnou k přepravě se nabízí zejména v situacích, kdy je třeba co nejrychleji přepravit materiál, ať už z důvodu jeho rychlého podléhání zkáze, či jiného důvodu. Nalezení optimálního řešení může v tomto případě zkrátit dobu přepravy na přijatelné minimum. To je důležité zejména u přepravy materiálu, který rychle podléhá zkáze. V tomto případě
14
1
ÚVOD
využití kvantitativních metod může znamenat jednak úsporu materiálu, který by v opačném případě došel ke zkáze, a také nezanedbatelnou konkurenční výhodu. V tom spočívá síla využití kvantitativních metod pro podporu rozhodování. Je však třeba si uvědomit, že nástroje kvantitativních metod musí zůstat prostředkem, jak usnadňovat lidem rozhodování v jejich práci, pomáhat jim v jejich pracovních činnostech a zlepšovat výkonnost, nikoli být bičem, kterým budeme takzvaně manažerskými metodami v rámci „optimalizaceÿ, „zefektivňování činnostíÿ a „systémových změnÿ zvyšovat mnohdy již tak velký tlak na samotný výkon s cílem bezduché maximalitace zisku bez ohledu na další souvislosti pro úzkou skupinu vyvolených a tím činit lidský život čím dál tím méně snesitelný.
2
2
CíL PRÁCE
15
Cíl práce
Během řešení praktických problémů v průběhu spolupráce s praxí vyvstala akutní potřeba řešit speciální typy dopravních úloh, jejichž optimalizačním kriteriem byla minimalizace doby potřebné k přepravení materiálu. Problémem bylo, že pro takto definované problémy neexistovaly známé modely umožňující nalezení optimálního řešení. Všeobecně známé způsoby řešení dopravních úloh nebyly s ohledem na specificka popisovaných modelů aplikovatelné. Výše uvedené skutečnosti byly motivací pro sepsání této disertační práce, v jejímž rámci bylo definováno více cílů, které však spolu bezprostředně souvisí. Prvním cílem je navrhnout způsoby řešení těchto problémů. V této souvislosti bude nutné podrobně popsat charakteristiku řešených problémů včetně důvodů, proč nelze použít některé ze stávajících známých způsobů jejich řešení. V dalším kroku budou obecně popsány způsoby sestavování modelů a následně budou navrženy způsoby, jak tyto modely vyřešit. Druhým z cílů je vytvořit pro popisované problémy software umožňující jejich řešení. Pro tvorbu tohoto software bude použito vývojového prostředí Delphi. Pro popisované problémy budou vytvořeny knihovny s algoritmy, které je řeší. U každé knihovny budou popsány její nejdůležitější funkce a bude uvedena ta část zdrojového kódu, která je něčím specifická, resp. je pro danou knihovnu klíčová. Dále bude vytvořena parametricky ovládaná konzolová aplikace, která umožní řešení i pro běžné uživatele. Tento cíl je nezbytný pro splnění dalších dvou cílů. Třetím cílem je otestování a srovnání navržených algoritmů vzhledem ke kvalitě nalezeného řešení a časové náročnosti výpočtu. Při testování budou náhodně vygenerovány problémy, které budou následně vyřešeny. Doba řešení a kvalita nalezeného řešení budou vzájemně porovnávány, přičemž toto srovnání bude statisticky vyhodnoceno. V této souvislosti bude také verifikována správnost (přípustnost) získaného řešení. Čvrtým cílem je ukázat řešení konkrétního praktického problému s pomocí navržených metod a vytvořeného softwaru, a to včetně nalezení a vypsání optimálního řešení, jeho podrobného okomentování a stanovení z toho vyplývajících závěrů. Posledním krokem bude závěrečné shrnutí získaných poznatků.
16
3
3
LITERÁRNí PŘEHLED
Literární přehled
V následující kapitole budou stručně uvedeny poznatky, z nichž vychází praktická část práce.
3.1
Matematické modelování
Oblast matematického modelování [13, 22, 28] zahrnuje desítky disciplín. Jako příklad lze uvést modelování chemických jevů v biologii, sociologii, demografii, meteorologii, aj. Co je tedy model? Je to zjednodušený popis reálného systému, který obsahuje s ohledem na analyzovaný problém nejpodstatnější prvky a vazby mezi nimi. Při tvorbě modelu není možné a ani žádoucí zachytit všechny detaily, nicméně je nutné zaměřit se na ty části modelu, které jsou z hlediska cíle analýzy podstatné. Při vytváření modelu je třeba brát zřetel na tyto skutečnosti: 1. v případě přílišného zjednodušení modelu oproti skutečnosti budou výsledky, které jeho řešením získáme, nereálné, 2. pokud se budeme snažit o co nejvěrnější zachycení skutečnosti, získáme sice kvalitní model, nicméně jeho analýza bude neuskutečnitelná a výsledky nedosažitelné. Sestavování modelu je tedy vždy hledáním kompromisu mezi dokonalým modelem na straně jedné a jeho snadnou řešitelností na straně druhé. 3.1.1
Průběh rozhodovacího procesu
V rámci rozhodovacího procesu je třeba definovat dvě základní role podílející se na problému: rozhodovatel (rozhodovací subjekt), který je zadavatelem problému, a analytik, který je jeho řešitelem. Jakmile analytik získá z jeho pohledu konečné řešení, nabídne jej rozhodovateli, a ten ho buď akceptuje, nebo vrátí k přepracování společně s poopraveným zadáním problému. Zpětná vazba hraje v tomto procesu velmi důležitou roli. Přesný průběh rozhodovacího procesu je k dispozici na obrázku 1. Rozhodovací proces lze rozdělit do následujících fází [13]: 1. Definice problému. Nejprve je třeba existenci problému rozpoznat a následně jej jasně definovat. 2. Ekonomický model. Je chápán jako „podrobnýÿ slovní popis problému a těch částí reálného systému, které s tímto problémem souvisejí nebo jej dokonce přímo či nepřímo vyvolávají. Je zapotřebí popsat všechny procesy a činitele, kteří ovlivňují jejich průběh. V této fázi je nesmírně důležitý dialog mezi rozhodovacím subjektem a analytikem.
3.1
17
Matematické modelování
reálný systém
definice problému ekonomický model implementace
matematický model řešení úlohy interpretace výsledků, verifikace modelu
Obr. 1: Průběh rozhodovacího procesu. Zdroj: Fábry [13].
3. Matematický model. Matematický model je obecně převedením ekonomického modelu do světa matematiky či lépe řečeno do světa exaktních věd. Jednotlivé části ekonomického modelu se stávají parametry, proměnnými, funkcemi, rovnicemi, nerovnicemi, grafy, atd. 4. Řešení úlohy. Pokud je v možnostech současné vědy a techniky vyřešit sestavený model v rozumném čase, je jeho vlastní řešení rutinní záležitostí1 realizovanou obvykle s pomocí konkrétního softwaru. 5. Interpretace výsledků. Jde o slovní vyjádření či vysvětlení numerických výsledků, získaných v předchozím kroku při řešení úlohy. Při interpretaci se analytik vrací zpět přes matematický model až k ekonomickému modelu, kterému zadavatel rozumí, neboť jej společně s analytikem sestavoval. Tato činnost je na obrázku 1 znázorněna šipkou směrem k ekonomickému modelu. Verifikace modelu je ověření správnosti sestaveného modelu a posouzení reálnosti získaných výsledků. 6. Implementace. Tento krok následuje po úspěšné verifikaci modelu, je završením celého rozhodovacího procesu. Zadavatel získal od analytika reálné výsledky a je na něm, aby tyto výsledky uvedl do praxe. Cílem implementace je zlepšit fungování systému. Přestože v tuto chvíli rozhodovací proces končí implementací výsledků, měla by po něm následovat ještě kontrola toho, zda byla provedená změna pro reálný systém skutečně očekávaným přínosem. Chyby se totiž lze dopustit v každé fázi rozhodovacího procesu. 1
O těchto problémech se zmiňuje kapitola 3.11.
18
3.2
3
LITERÁRNí PŘEHLED
Operační výzkum a jeho disciplíny
Operační výzkum (někdy také Operační analýza) je souborem víceméně samostatných vědeckých disciplín, jejichž společným jmenovatelem je hledání nejlepšího, optimálního řešení. Mezi základní disciplíny operačního výzkumu patří [22]: 1. Matematické programování, které je podrobněji popsáno v sekci 3.3. 2. Vícekriteriální rozhodování se zabývá analýzou rozhodovacích úloh, kde jsou varianty hodnoceny podle více kriterií zároveň. V typickém případě nejsou hodnotící kriteria ve vzájemném souladu. 3. Teorie grafů patří mezi velmi často používané odvětví operačního výzkumu. Nejčastější použití je v oblasti analýzy a řízení projektů. 4. Teorie zásob se zabývá strategií řízení zásobovacího procesu a optimalizací objemu skladovaných zásob, optimalizačním kriteriem bývá minimalizace nákladů souvisejících s držením, objednáváním a vydáváním zásob ze skladu. 5. Teorie hromadné obsluhy zkoumá chování systémů, ve kterých se vyskytují dva typy jednotek: požadavky, které do systému přicházejí, a obslužné linky, které tyto požadavky vyřizují. S tím souvisí i vznik front. 6. Modely obnovy zkoumají systémy, ve kterých jsou jednotky, které po určité době selžou a je třeba je nahradit novými. Cílem je odhadnout věkovou strukturu těchto jednotek a predikovat počty, které bude třeba nahradit. 7. Markovovy rozhodovací procesy představují obecný prostředek pro popis chování dynamických systémů. Cílem je predikce budoucího chování těchto systémů. 8. Teorie her řeší konfliktní rozhodovací situace. Jednotliví účastníci (hráči) mají strategie chování a na základě jejich uplatnění závisí hráčova výhra či prohra. Teorie her se zabývá hledáním optimálních strategií maximalizujících pravděpodobnost výhry. 9. Simulace je silným nástrojem pro analýzu složitých systémů, které by šly jinak analyzovat jen stěží. Spočívá v experimentování s vytvořeným modelem daného systému na počítačích. Simulace obvykle probíhá ve zrychleném čase.
3.3
Matematické programování
Matematické programování se zabývá řešením optimalizačních úloh, ve kterých se jedná o nalezení extrému daného kriteria, definovaného ve tvaru kriteriální funkce n proměnných, na množině variant určených soustavou omezujících podmínek, které jsou zadány ve tvaru lineárních nebo nelineárních rovnic či nerovnic. Matematický model úlohy matematického programování zapíšeme následovně [28]:
3.4
19
Lineární programování
maximalizovat (minimalizovat) z = f (x1 , x2 , . . . , xn ), za podmínek g1 (x1 , x2 , . . . , xn ) g2 (x1 , x2 , . . . , xn ) .. . gm (x1 , x2 , . . . , xn ) x1 , x2 , . . . , xn
≥ 0 ≥ 0
(1)
≥ 0 ≥ 0,
kde n je počet proměnných modelu, m je počet jeho omezujících podmínek a f (~x), gi (~x), i = 1, 2, . . . , m jsou obecné funkce n proměnných. Z matematického hlediska hledáme hodnoty proměnných xj , které respektují omezující podmínky a zároveň dosahují extrému dané kriteriální funkce. V případě, že účelová funkce a všechny omezující podmínky jsou lineární, mluvíme o úloze lineárního programování, v opačném případě o úloze nelineárního programování. Aplikace úloh lineárního programování jsou poměrně četné, úlohy nelineárního programování jsou s ohledem na jejich mnohdy problematickou řešitelnost výrazně méně používané. Matematické programování zahrnuje mimo jiné následující oblasti: • Konvexní programování, které je speciálním případem úlohy matematického programování, kde účelová funkce i omezující podmínky jsou konvexní. • Kvadratické programování má kvadratickou a zároveň konvexní účelovou funkci, omezující podmínky jsou lineární. Jde o speciální případ úlohy konvexního programování. • Lineární programování, jehož účelová funkce i omezující podmínky jsou lineární. Pro jeho řešení se používá simplexové metody. Je speciálním případem úlohy kvadratického programování s nulovými koeficienty u nelineárních členů.
3.4
Lineární programování
Vznik lineárního programování je datován roky 1930–1940. Lineární programování proto, že použité funkce popisující model jsou výhradně lineární. Úloha lineárního programování je obecně řešitelná simplexovou metodou. Úlohu lineárního programování lze zapsat následovně: zmax(min) = ~c T ~x A~x R ~b ~x ≥ ~0, kde:
(2)
20
3
LITERÁRNí PŘEHLED
• ~c T = (c1 , . . . , cn ) je vektor koeficientů účelové funkce, • A = (aij ), kde i = 1, . . . , m a j = 1, . . . , n je matice strukturních (technickoekonomických) koeficientů, • ~x = (x1 , . . . , xn )T je vektor hledaných proměnných, • ~b = (b1 , . . . , bm )T je vektor pravých stran soustavy omezujících podmínek.
3.5
Simplexová metoda
Simplexová metoda je univerzální metodou zformulovanou pro řešení neceločíselných úloh lineárního programování. Jedná se o iterativní metodu a byla zformulována Dantzigem v roce 1947. Její princip spočívá v testování sousedních vrcholů v rámci množiny přípustných řešení. Zkoumáme, zda zlepší, zhorší či nezmění hodnotu účelové funkce. V praxi je simplexová metoda velmi efektivní, většinou je pro vyřešení úlohy potřeba od 2m do 3m kroků, kde m je počet omezení a její časová složitost je polynomiální [33]. V nejhorším případě může být časová složitost simplexové metody exponenciální, jak dokládá např. [25]. Výpočet simplexovou metodou probíhá ve dvou fázích: 1. fáze – nalezení přípustného řešení – během výpočtu se pohybujeme ve vrcholech mimo oblast přípustných řešení, alespoň jedna omezující podmínka není splněna, 2. fáze – zlepšování přípustného řešení až do dosažení optimálního řešení – vrcholy, ve kterých se pohybujeje, náleží do množiny přípustných řešení, dochází k postupnému zlepšování hodnoty účelové funkce. Dále popisovaný algoritmus simplexové metody bude odpovídat dvoufázové metodě s tím rozdílem, že jednotlivé fáze nebudou striktně odděleny.2 3.5.1
Kanonický tvar
Mějme úlohu LP, řešitelnou simplexovou metodou. V prvním kroku je nutné ji transformovat na tzv. kanonický tvar. Úloha obsahuje n proměnných3 a m omezujících podmínek. Při převodu na kanonický tvar se v úloze objeví dva nové typy proměnných: doplňkové a umělé proměnné.4 Úkolem doplňkových proměnných je upravit jednotlivé omezující podmínky do tvaru rovnic. Jejich hodnota je rovna rozdílu mezi levou a pravou stranou omezující podmínky, koeficient účelové funkce je nulový. U omezujících podmínek ve tvaru 2
Výpočet v rámci obou fází bude probíhat shodně. Rozdíl mezi první a druhou fází výpočtu bude v přítomnosti umělých proměnných v bázi – dokud budou v bázi přítomny umělé proměnné s kladnou hodnotou, půjde o první fázi výpočtu, po jejich eliminaci o druhou fázi výpočtu. 3 Proměnná n odpovídá počtu strukturních, doplňkových a umělých proměnných. 4 V některé literatuře je možné se setkat s pojmy přídatná proměnná odpovídající doplňkové a pomocná proměnná odpovídající umělé proměnné.
3.5
21
Simplexová metoda
„≤ÿ se doplňkové proměnné přičítají, pro omezení typu „≥ÿ odečítají. Umělé proměnné mají za úkol doplnit chybějící jednotkové sloupcové vektory tak, aby úloha v kanonickém tvaru obsahovala jednotkovou submatici. Z toho důvodu se vyskytují v omezujících podmínkách, které neobsahují kladnou doplňkovou proměnnou: v omezeních typu „=ÿ a „≥ÿ. V účelové funkci je jejich koeficientům přiřazena prohibitivní sazba: +M pro minimalizační a −M pro maximalizační typy úloh, zajišťující jejich přednostní vyřazení z báze (eliminaci). Tab. 1: Pravidla pro přidávání doplňkových a umělých proměnných. Zdroj: vlastní práce.
typ omezení „≤ÿ „=ÿ „≥ÿ
doplňková proměnná +d −d
umělá proměnná +u +u
V kanonickém tvaru obsahuje úloha LP v matici strukturních koeficientů právě m jednotkových sloupcových vektorů, z nichž lze vytvořit jednotkovou submatici (počet jednotkových sloupcových vektorů je identický s počtem vlastních omezujících podmínek). Pak proměnné x1 , . . . , xm tvořící jednotkovou matici nazveme bazické proměnné, zbývající proměnné xm+1 , . . . , xn jako nebazické proměnné.5 Hodnoty bazických proměnných jsou rovny hodnotám pravé strany, nebazické proměnné jsou vždy rovny nule. Řešení lze vyjádřit soustavou rovností: x1
3.5.2
+ α1, m+1 xm+1 + . . . + α1n xn = β1 x2 + α2, m+1 xm+1 + . . . + α2n xn = β2 .. .. .. .. .. . . . . . xm + αm, m+1 xm+1 + . . . + αmn xn = βm
(3)
Test optimality n−m
z }| { Vektor řešení soustavy (3) lze zapsat jako ~xTB = (β1 , . . . , βm , 0, . . . , 0) a hodnota účelové funkce zB = ~cT ~xB = c1 β1 + c2 β2 + . . . + cm βm . Nyní předpokládejme, že novou bazickou proměnnou se stane proměnná xr namísto proměnné xs . Hodnota do báze nově vstupující proměnné xr = t, pro t > 0. Novému bazickému řešení bude potom odpovídat vektor 5
V literatuře se také může objevit označení základní proměnné pro bazické a nezákladní proměnné pro nebazické proměnné.
22
3
x1 = β1 − α1r t x2 = β2 − α2r t .. .
xs ~xR = xm xm+1 xr
= = = = .. .
LITERÁRNí PŘEHLED
βs − αsr t = 0 βm − αmr t 0 t
(4)
xn = 0
Dosazením vektoru ~xR do účelové funkce dostaneme výraz zR = ~cT · ~xR . Jeho rozepsáním a úpravou získáme zR = c1 β1 + c2 β2 + . . . + cs βs + cm βm − t(c1 α1r + c2 α2r + . . . + cs αsr + cm αmr ) + cr t. Substitucí zr = c1 α1r + c2 α2r + . . . + cs αsr + cm αmr a vytknutím t před závorku obdržíme zR = zB − t(zr − cr ). Z uvedeného vyplývá, že výraz −t(zr − cr ) určuje celkovou změnu účelové funkce. Ke zlepšení hodnoty účelové funkce proto dojde u maximalizačních úloh pouze v případě, že zr −cr < 0 a u minimalizačních v případě opačném, tj. zr −cr > 0. Označme tento výraz symbolem ∆r a nazvěme jej indexním číslem. Z výše uvedeného odvození lze nyní formulovat test optimality, nejprve obecně: řešení úlohy LP je optimální v tom případě, kdy jakákoli do báze nově vstupující proměnná nezlepší hodnotu účelové funkce. Konkrétně u maximalizačních úloh musí pro všechny proměnné platit ∆j = zj − cj ≥ 0 a u minimalizačních ∆j = zj − cj ≤ 0. 3.5.3
Změna báze
V případě, že při hledání optima je kriterium optimality porušeno, je nutné přejít do některého ze sousedních vrcholů s lepší hodnotou účelové funkce. Obecně probíhá změna báze tak, že je nejdříve určena proměnná vstupující do báze a následně proměnná z báze vystupující dle těchto pravidel: 1. Proměnnou vstupující do báze vybereme podle pravidel: min {∆j } pro ∆j < 0, resp. max {∆j } pro ∆j > 0,
(5) (6)
kde (5) platí pro maximalizační a (6) pro minimalizační typy úloh, j = 1, . . . , n. 2. Proměnná vystupující z báze – s ohledem na dodržení podmínek nezápornosti je nutné zvolit jako vystupující z báze tu bázickou proměnnou, kde je nejmenší podíl pravé strany a kladného strukturního koeficientu, tj. βi pro αir > 0. (7) min αir
3.5
Simplexová metoda
23
Vstupující proměnná v simplexové tabulce určuje tzv. klíčový sloupec, vystupující klíčový řádek. Jejich průsečíkem je klíčový prvek, tzv. pivot. Pro přepočet se použije Gaussova metoda úplné eliminace. Po přepočtu je nutné opět úlohu otestovat kriteriem optimality a případně dále pokračovat ve výpočtu, pokud nově získané řešení není optimální, resp. výpočet ukončit [22, 19, 34]. 3.5.4
Ukončení výpočtu
Po konečném počtu kroků docházíme k výsledku řešené úlohy LP. Situace, které mohou nastat, jsou uvedeny v následujícím výčtu: • Úloha má jedno optimální řešení – kriterium optimality je splněno, v bázi se nevyskytuje umělá proměnná s kladnou hodnotou a všechna indexní čísla nebázických proměnných jsou různá od nuly. • Úloha má více optimálních řešení – kriterium optimality je taktéž splněno, v bázi se nevyskytuje umělá proměnná s kladnou hodnotou a alespoň jedno indexní číslo pro nebazickou proměnnou se rovná nule. • Úloha nemá konečné optimální řešení – kriterium optimality není splněno, v klíčovém p-tém sloupci jsou všechna αip ≤ 0 a z toho důvodu nelze určit proměnnou vystupující z báze.6 • Úloha nemá ani jedno přípustné řešení – kriterium optimality je splněno, přičemž v bázi zůstala alespoň jedna umělá proměnná s kladnou hodnotou.7 Vývojový diagram přesně popisující jednotlivé kroky výpočtu je uveden na obr. 2 na straně 24. Je třeba podotknout, že existuje více modifikací simplexové metody. Vlastní výpočet obvykle probíhá v simplexové tabulce, již podrobně popisuje např. [12].
6
Obvykle jde o nevhodně sestavený model. Jedná se o případ, kdy byl výpočet ukončen již v první fázi řešení. Druhou fázi není možné zahájit, protože množina přípustných řešení je prázdná. 7
konec
změna báze
ne
Obr. 2: Algoritmus simplexové metody. Zdroj: vlastní práce. konec
1 BOŘ + ∞ NEBOŘ
ano
∀ αip ≤ 0
ne
∀ nebázická ∆j 6= 0
ano
∀ um. prom. = 0
ano
ne
konec
1 BOŘ
konec
úloha nemá přípustné řešení
3
Legenda: VBŘ – výchozí bazické řešení TO – test optimality OŘ – optimální řešení BOŘ – bazické optimální řešení NEBOŘ – nebazické OŘ
více BOŘ
určení klíčového políčka
úloha nemá konečné OŘ
konec
ano
ano
určení klíčového řádku
ne
∀ αip ≤ 0
určení klíčového sloupce p
ne
je splněn TO
test optimality (výpočet ∆j )
výchozí simplexová tabulka
formulace kanonického tvaru, určení VBŘ
start
24 LITERÁRNí PŘEHLED
3.6
25
Konečnost simplexové metody
3.6
Konečnost simplexové metody
Podle Lagové [28] najdeme optimální řešení úlohy LP mezi bazickými přípustnými řešeními. Jejich počet je konečný, horní hranice je dána kombinačním číslem m+n (m + n)! , (8) = m! · n! m kde m je počet vlastních omezujících podmínek a n počet proměnných. 3.6.1
Problém degenerace a zacyklení
Simplexová metoda je metodou iterativní a vyznačuje se konečným počtem kroků, potřebných k nalezení optimálního řešení, jejichž horní hranice je určena vztahem (8). Avšak v případě výskytu degenerovaného řešení (bazické řešení obsahuje méně kladných proměnných než vlastních omezujících podmínek) může dojít k situaci, že změna účelové funkce je při změně báze nulová, neboť pravá strana některého z omezení je rovna nule. Pokud se nulová změna účelové funkce vyskytuje ve více řádcích, může dojít k zacyklení. Při ručním výpočtu si řešitel zacyklení snadno uvědomí, ale při výpočtu na počítači se v případě neošetření tohoto problému program dostane do nekonečné smyčky. Proto je důležité tento potenciální problém ošetřit. 3.6.2
Výběr klíčového políčka dle Tyce
Běžně užívaný způsob volby pivota, popsaný v podsekci 3.5.3, nevede nejrychleji k optimálnímu řešení a v extrémních případech hrozí zacyklení, jak uvádí Tyc [42]. Uvádí, že běžně popisovaný postup nechá vstoupit do nové báze vrchol s nejlepším jednotkovým zlepšením učelové funkce, ačkoli jeho celkové zlepšení může být v případě degenerované úlohy i nulové. Do nové báze doporučuje zvolit proměnnou s maximálním celkovým zlepšením účelové funkce dle vzorců: βi (9) ∆zmax = min ∆r · min ∀∆r <0 αir u maximalizačních typů úloh a ∆zmin
βi = max ∆r · min ∀∆r >0 αir
(10)
u minimalizačních typů úloh, αir > 0, i = 1, . . . , m a r je index proměnných porušujících test optimality. Autory popisovaný způsob nejenže může dojít k optimálnímu řešení při menším počtu kroků, ale také vylučuje možnost vzniku zacyklení, popisovaného např. v [15]. Jak uvádí [42, str. 173]: „Je s podivem, že se tomuto tématu věnuje spousta zbytečných stran v řadě seriozních knih, i když jde ve skutečnosti o pseudoproblém, uměle
26
3
LITERÁRNí PŘEHLED
nastolený zjevně proto, aby se tyto zbytečné strany (a řada zbytečných článků) mohly zaplnit. Zvolíme-li totiž optimální kriterium, nemůže cyklus nikdy nastat z principu.ÿ Tento způsob eliminace zacyklení je pouze částečný. Oproti tvrzení Tyce zacyklení spolehlivě zabrání pouze v případě, že existuje βi 6= 0. (11) ∆r · min αir Pokud v příslušné bázi neexistuje možnost zvolit pivota, jehož uvedení do báze by způsobilo nenulovou změnu účelové funkce, k zacyklení dojít může. Jako příklad lze zvolit např. libovolný přiřazovací problém rozměru alespoň 10 × 10, řešený pomocí simplexové metody. 3.6.3
Charnesova perturbační metoda
Princip metody [28, 29] spočívá v úpravě úlohy tak, aby všechny pravé strany měly kladnou hodnotu. Tím zajistíme kladnou změnu účelové funkce. V okamžiku, kdy podle (7) najdeme ve více řádcích bi = 0 a není možno jednoznačně určit klíčový řádek, uvažujeme namísto vektoru pravých stran ~b vektor perturbovaných pravých stran ~b(ε) = ~b +
n X
εj~aj ,
(12)
j=1
kde ~aj je j-tý sloupec matice strukturních koeficientů A a 0 < ε < 1 je dostatečně malé kladné číslo blízké nule. Uvažujeme pouze řádky, ve kterých jsme našli bi = 0. Seřadíme-li sloupce tabulky ~aj tak, že na prvním místě je sloupec s kladnými koeficienty, jsou perturbované pravé strany kladné a změna účelové funkce je nenulová. Nemůže tedy dojít k zacyklení báze. Jestliže takový sloupec nenajdeme, můžeme dát na prvních m míst v matici A jednotkové vektory bazických proměnných a tím zaručit kladné perturbované pravé strany. Z takto upravených pravých stran určíme klíčový řádek podle vztahu (7). Protože podle (12) má každý další sloupec menší vliv na hodnotu perturbované pravé strany, nemusíme pracně vypočítávat jejich hodnotu, ale můžeme postupně dělit sloupce seřazené matice A odpovídajícími koeficienty klíčového sloupce tak dlouho, až jednoznačně označíme klíčový řádek (tj. na místo vektoru pravých stran ~b postupně dosazujeme seřazené sloupce simplexové tabulky). Předpokládejme pro jednoduchost, že klíčový sloupec je k-tý, sloupce jsou uspořádány a k nejednoznačnosti při určování klíčového řádku došlo v prvních dvou b2 b1 a . Hledáme tedy: sloupcích, tj. a1k a2k a11 a21 1. min , , a1k a2k
3.6
27
Konečnost simplexové metody
a12 a22 , , 2. min a1k a2k a13 a23 3. min , ... a1k a2k
tak dlouho, až jednoznačně určíme klíčový řádek. Seřazení vektorů a~j se pak musí dodržovat během celého výpočtu. 3.6.4
Blandův algoritmus výběru klíčového políčka
V průběhu řešení úloh LP během výpočtu může v jednotlivých iteracích simplexové metody dojít k zacyklení, například u této úlohy lineárního programování [41] zmax = 10x1 − 57x2 − 9x3 − 24x4 0,5x1 − 5,5x2 − 2,5x3 + 9x4 0,5x1 − 1,5x2 − 0,5x3 + x4 x1 x1 , x2 , x3 , x4
≤ ≤ ≤ ≥
0 0 1 0
v případě, že pro změnu báze bude volen pivot podle vzorců (5) a (7) běžného užívaného algoritmu určení klíčového políčka, viz kapitola 3.5.3. To je velký problém zejména v případě počítačového řešení příslušných úloh, kdy se při výpočtu program dostane do nekonečné smyčky a následuje buď jeho pád nebo vynucené ukončení bez jakékoli šance na nalezení optimálního řešení. Start
Je ´ uloha maximalizaˇcn´ı?
ano
Najdi sloupec r, kde r = min{j} pro ∆j > 0.
ne Najdi sloupec r, kde r = min{j} pro ∆j < 0.
Najdi l, kde l = ˇr´adek βi pro αir > 0. αir
min
Souˇradnice kl´ıˇcov´eho pol´ıˇcka jsou (l, r).
Konec
Obr. 3: Blandův algoritmus eliminující zacyklení. Zdroj: vlastní práce.
28
3
LITERÁRNí PŘEHLED
Řešení problému zacyklení přináší Blandův anticyklický algoritmus [3]. Jde o jednoduché pravidlo pro výběr klíčového políčka, skládající se ze dvou částí: • výběr klíčového sloupce, kdy ze všech sloupců porušujících test optimality vybere sloupec s nejmenším indexem r, • výběr klíčového řádku, kdy ze všech nejmenších podílů vybere ten, který má nejmenší index l. Aplikací tohoto pravidla dojde k eliminaci zacyklení. To je velmi důležité pro stabilitu výpočtů, zejména u speciálních typů úloh LP, které mohou mít díky silné degeneraci k zacyklení „sklonyÿ. Vývojový diagram použití Blandova anticyklického pravidla je k dispozici na obrázku 3.
3.7
Vícekriteriální optimalizace
Při sestavování modelů rozhodovacích problémů se občas vyskytuje požadavek na nalezení optimálního řešení, které vyhovuje více stanoveným kriteriím. Touto problematikou se zabývá vícekriteriální rozhodování, viz např. [17, 19]. Obecný model vícekriteriálního lineárního programování má tvar: s zmax
=
n X
j=1 n X
csj xj
pro s = 1, 2, . . . , k,
aij xj R bi pro i = 1, 2, . . . , m,
(13)
j=1
xj ≥ 0 pro j = 1, 2, . . . , n,
kde k je počet zvolených kriterií, tj. účelových funkcí. Zápis předpokládá všechny účelové funkce jako maximalizační, což lze zajistit obrácením znamének koeficientů účelové funkce u minimalizačních účelových funkcí. Ačkoli existují i jiné metody vícekriteriální optimalizace, mezi nejčastěji používané patří: • metoda globální účelové funkce, • lexikografická metoda, • metoda cílového programování. Z hlediska zpracování disertační práce je podstatná lexikografická metoda, která je popsána v následující podsekci 3.7.1. 3.7.1
Lexikografická metoda
Při použití této metody musí rozhodovatel určit pořadí významnosti jednotlivých 1 2 účelových funkcí. Řekněme, že zmax je nejdůležitější, další v pořadí je zmax , atd.
3.8
Úlohy řešené pomocí lineárního programování
29
k až poslední je zmax . Řešení popisovanou metodou probíhá v několika krocích, kdy v s-tém kroku, pro s = 1, 2, . . . , k, řešíme úlohu: s zmax = ~cs~x
A~x R ~b ~c1~x ≥ z1∗ ~c2~x ≥ z2∗ .. . ∗ ~cs−1~x ≥ zs−1 ~x ≥ 0
(14)
V každém kroku tedy připojujeme podmínku, že hodnota optimalizovaného kriteria v předchozím kroku neklesne pod ideální hodnotu zs∗ . Přechod k dalšímu kroku je omezen jen na případy, kdy má úloha více než jedno řešení. Proto je v praxi metoda modifikovaná tak, že v každém dalším kroku připustíme předem stanovenou odchylku od získané hodnoty kriteria v kroku předcházejícím, v s-tém kroku tedy řešíme úlohu s zmax = ~cs~x
A~x R ~b ~c1~x ≥ z1∗ − δz1 ~c2~x ≥ z2∗ − δz2 .. . ∗ ~cs−1~x ≥ zs−1 − δzs−1 ~x ≥ 0
(15)
Metoda je výhodná v tom, že kopíruje reálné uvažování manažerů při rozhodování o výběru nejvhodnější varianty plánu, jak uvádí Gros [17].
3.8
Úlohy řešené pomocí lineárního programování
S pomocí metod lineárního programování lze řešit poměrně širokou škálu úloh. Zde je výčet těch nejznámějších [28]: 1. Úlohy výrobního plánování (problém alokace zdrojů). Jde o určení výrobního sortimentu v podmínkách omezených vstupů (kapacity surovin, energie, strojového času, atd.) a výstupů (je dán minimální či maximální objem produkce, výrobní poměr výrobků, atd.). Optimalizačním kriteriem je obvykle minimalizace nákladů, resp. maximalizace zisku. 2. Úlohy finančního plánování (optimalizace portfolia). Cílem je určit objem investic do jednotlivých investičních variant. Optimalizačním kriteriem je
30
3
LITERÁRNí PŘEHLED
maximalizace očekávaného výnosu za určeného maximálního rizika, resp. minimalizace rizika. Proměnné představují objemy investic. 3. Směšovací problém (nutriční, výživový problém). Cílem je vytvořit směs (roztok, slitinu, . . . ) požadovaných vlastností s tím, že pro její vytvoření lze použít danou nabídku výchozích komponent. Proměnné v úloze odpovídají použitým komponentám, hodnoty proměnných množství (objemu) použitých komponent. Optimalizačním kriteriem je minimalizace nákladů na vytvoření požadované směsi. 4. Úloha o dělení materiálu (řezný problém). Úkolem je rozdělit materiál na menší části tak, aby byl minimalizován odpad. Přitom je třeba respektovat požadavky na to, v jakém poměru mají vzniklé menší části být, kolik jich má vzniknout atd. Úloha o dělení materiálu může být jednorozměrná resp. vícerozměrná. Jednorozměrný problém vede na úlohu lineárního programování, vícerozměrný je výrazně složitější. 5. Rozvrhování pracovníků na směny. V tomto typu úloh bývá definována celá řada omezujících podmínek, vycházejících např. z kvalifikace pracovníků, minimálního nebo pevně stanoveného počtu pracovníků, kteří musí být v jednom okamžiku na směně, atd. Proměnné v modelu určují, zda pracovník na směnu přiřazen bude, resp. nebude. 6. Distribuční úlohy lineárního programování. Jedná se o velkou skupinu úloh, která s ohledem na zaměření disertační práce bude popsána v sekci 3.9.
3.9
Typy distribučních úloh
V této kapitole je uveden přehled nejčastěji používaných distribučních úloh. I přes veškerou snahu se nepodařilo najít modely, které by řešily dopravní úlohy z hlediska minimalizace času. Distribuční úlohy jsou speciálním případem úloh lineárního programování. Jako úlohy lineárního programování jsou řešitelné běžnou simplexovou metodou. S ohledem na jejich vlastnosti již poměrně malé dopravní úlohy vedou k rozměrným simplexovým tabulkám. S ohledem na jejich specifika lze využít speciálních algoritmů, které výpočet zjednodušují [35]. 3.9.1
Obecná dopravní úloha
Dopravní úlohu lze formulovat za následujících předpokladů [35]: • je přepravován stejnorodý produkt (materiál) od dodavatelů k odběratelům, • mezi každým dodavatelem a odběratelem je uvažována pouze jedna dopravní cesta, • po každé cestě lze převézt libovolné množství materiálu,
3.9
31
Typy distribučních úloh
• přepravní náklady jsou přímo úměrné přepravovanému množství. V rámci dopravní úlohy je dáno m dodavatelů D1 , . . . , Dm a n odběratelů O1 , . . . , On . Každý z dodavatelů má kapacitu skladu ai , pro 1 ≤ i ≤ m a každý z odběratelů určený požadavek bj , 1 ≤ j ≤ n. Přepravovaný materiál může být přepraven od libovolného dodavatele k libovolnému odběrateli, náročnost přepravy mezi i-tým dodavatelem a j-tým odběratelem je ohodnocena cenou cij . Kapacity dodavatelů nesmí být překročeny, požadavky odběratelů musí být uspokojeny, tzn. m n P P ai ≥ bj .8 Pak, při splnění uvedených podmínek, lze model dopravní úlohy i=1
j=1
zapsat takto [34]:
Zmin =
m X n X
cij xij
(16)
i=1 j=1
n X j=1 m X
xij ≤ ai
(i = 1, 2, . . . , m)
(17)
xij = bi
(j = 1, 2, . . . , n)
(18)
i=1
xij ≥ 0
(19)
Model obsahuje celkem m + n omezujících podmínek. Prvních m omezujících podmínek určených dle vzorce (17) zajišťuje nepřekročení kapacity žádného z dodavatelů. Následujících n omezujících podmínek vyjádřených vzorci (18) zaručí naplnění požadavků každého z odběratelů. Tato dopravní úloha je přímo řešitelná simplexovou metodou. Její rozměry jsou však částečně limitující: úloha o m dodavatelích a n odběratelích bude mít v základním tvaru m + n omezujících podmínek a m · n strukturních proměnných, přičemž při převodu do kanonického tvaru by přibylo dalších m doplňkových a n umělých proměnných. Přitom struktura úlohy zůstává neměnná s nejméně m · n − (m + n − 1) nulovými proměnnými v matici úlohy v základním tvaru. Rozměry úlohy a její charakteristické vlastnosti byly důvodem k vytvoření speciálních algoritmů s vyšší efektivitou řešení. Ty jsou popsány např. v [34]. 3.9.2
Kontejnerový dopravní problém
Představuje modifikaci dopravního problému, kdy je přeprava realizována s pomocí kontejnerů o kapacitě K jednotek. Náklady na přepravu jsou vztaženy na jeden kontejner bez ohledu na to, zda je či není plný. 8
Za takto zadaných podmínek je úloha, kde řešitelná je a ekonomický smysl dává také.
P
ai <
P
bj „neřešitelnáÿ, matematicky ovšem
32
3
LITERÁRNí PŘEHLED
Model kontejnerového dopravního problému zapíšeme jako zmin =
m X n X
cij yij
i=1 j=1
n X j=1
m X
xij ≤ ai , xij = bj ,
(20)
i=1
xij ≤ Kyij , xij ≥ 0, yij ≥ 0, celá,
kde: • xij je objem přepravy v počtu přepravených jednotek mezi i-tým dodavatelem a j-tým odběratelem, • yij je počet kontejnerů pro přepravu mezi i-tým dodavatelem a j-tým odběratelem, • cij jsou náklady na přepravu jednoho kontejneru mezi i-tým dodavatelem a j-tým odběratelem, • ai je kapacita i-tého dodavatele, • bj je požadavek j-tého odběratele, • K je kapacita kontejneru. Opět budeme předpokládat, že součet kapacit dodavatelů je větší nebo roven součtu požadavků odběratelů. 3.9.3
Obecný distribuční problém
Obecný distribuční problém se liší od dopravního problému v tom, že kapacity dodavatelů a požadavky odběratelů nejsou uvedeny ve stejných jednotkách. Pro vzájemnou porovnatelnost je třeba do modelu zařadit přepočítací koeficienty. Matematický model obecného distribučního problému zapíšeme následovně: zmin(max) =
m X n X
cij xij
i=1 j=1
n X
j=1 m X
xij ≤ ai ,
kij xij = bj ,
i=1
xij ≥ 0,
(21)
3.9
33
Typy distribučních úloh
kde: • • • • •
xij jsou proměnné modelu, cij jsou cenové koeficienty, ai je kapacita i-tého dodavatele (zdroje) v měrných jednotkách č. 1, bj je požadavek j-tého odběratele v měrných jednotkách č. 2, kij jsou přepočítací koeficienty popisující vztah mezi i-tým zdrojem a j-tým požadavkem.
3.9.4
Dopravní úloha s mezičlánkem
Je modifikací úlohy 3.9.1. Dopravní problém zde má dva navazující stupně. V prvním je přepravováno zboží od dodavatelů (výrobců) Di do meziskladu Mj , ve druhém z meziskladu Mj k odběratelům Ok , pro i = 1, . . . , m, j = 1, . . . , n a k = 1, . . . , s. Optimalizačním kriteriem je minimalizace celkové náročnosti dopravy. Matematický model obecného distribučního problému zapíšeme následovně: zmin =
m X n X i=1 j=1
cij xij +
n X s X
djk yjk
j=1 k=1
n X j=1 m X
i=1 s X k=1
m X i=1
n X
xij −
j=1 s X
xij ≤ ai , xij ≤ bj , yjk ≤ bj , yjk = pk , yjk = 0,
k=1
xij , yij ≥ 0,
kde: • • • • • • •
xij jsou proměnné modelu vztahující se k přepravě od Di do Mj , yjk jsou proměnné modelu vztahující se k přepravě z Mj k Ok , cij jsou cenové koeficienty vztahující se k dopravě od Di do Mj , djk jsou cenové koeficienty vztahující se k dopravě z Mj k Ok , ai je kapacita i-tého dodavatele (zdroje), bj je kapacita j-tého meziskladu, pk je požadavek k-tého odběratele.
(22)
34
3
LITERÁRNí PŘEHLED
Dvoustupňové dopravní úlohy lze řešit buď simplexovou metodou nebo pomocí upraveného algoritmu modifikované metody užívané pro řešení dopravních úloh, jak uvádí Holoubek [19]. 3.9.5
Přiřazovací problém
Podle Jablonského [22] lze přiřazovací problém charakterizovat jako úlohu, ve které se jedná o nalezení vzájemně jednoznačného přiřazení dvojice jednotek ze dvou skupin (jednotky z 1. skupiny si označíme Ai pro i = 1 . . . , n, jednotky ze druhé skupiny Bj pro j = 1, . . . , n) tak, aby toto přiřazení přineslo co největší efekt. Obě skupiny mají stejný počet prvků. Matematický model přiřazovacího problému zapíšeme následovně: zmin(max) =
n X n X
cij xij
i=1 j=1
n X
j=1 n X
xij = 1, xij = 1,
i=1
xij =
(23) 0 , 1
kde: • xij má hodnotu 1, je-li jednotka Ai přiřazena jednotce Bj , v opačném případě má hodnotu 0, • cij je cena přiřazení jednotky Ai jednotce Bj . Přiřazovací problém je možné řešit buď simplexovou metodou (která je obecnější), anebo tzv. Maďarskou metodou, která byla vyvinuta specielně pro tento typ problému. 3.9.6
Úloha o pokrytí
Cílem úlohy o pokrytí je rozhodnout o výstavbě K obslužných stanic, které mohou být umístěny v obvodech Oi pro i = 1, . . . , n a kde n > K. S rozhodnutím o výstavbě je třeba přiřadit každé stanici pole působnosti, tj. obvody, které jimi budou obsluhovány. Matematický model úlohy o pokrytí je následující: zmin =
n X n X i=1 j=1
cij xij fj
3.9
35
Typy distribučních úloh n X j=1
n X
xij ≤ nyi , xij = 1,
i=1 n X
(24)
yi = K,
i=1
xij , yi =
0 , 1
kde: • xij má hodnotu 1, je-li obvod Oj obsluhován stanicí zřízenou v obvodě Oi , • yi má hodnotu 1 v případě, že stanice je zřízena v lokalitě Oi , v opačném případě má hodnotu 0, • K je počet stanic. Tato úloha je modifikací přiřazovacího problému. 3.9.7
Okružní dopravní problém
Problém se občas nazývá Úloha obchodního cestujícího. Je dáno n míst A1 , A2 ,. . . , An . Obchodní cestující se nachází ve výchozím stanovišti (např. A1 ) a musí postupně navštívit všechna zbývající stanoviště. Každé z nich musí být navštíveno právě jednou. Po jejich navštívení se vrací do výchozího stanoviště. Optimalizačním kriteriem je najít okruh s nejkratší vzdáleností. Matematický model přiřazovacího problému zapíšeme následovně: zmin(max) =
n X n X
cij xij
i=1 j=1
n X j=1 n X
xij = 1, xij = 1,
(25)
i=1
δi − δj + nxij ≤ n − 1, 0 xij = , 1 kde: • xij má hodnotu 1, pojede-li obchodní cestující přímo z místa Ai do místa Aj , v opačném případě má hodnotu 0, • cij je vzdálenost mezi místy Ai a Bj ,
36
3
LITERÁRNí PŘEHLED
• podmínka δi − δj + nxij ≤ n − 1 má za úkol zabránit vzniku dílčích okruhů. Nalezení optimálního řešení je u této úlohy velmi obtížné. Obtížnost je dána jak počtem omezujících podmínek, tak i počtem proměnných a jejich bivalentností. Protože tento problém má velké množství praktických aplikací, pro nalezení řešení se používají speciální algoritmy, dávající suboptimální řešení. Problematika časové složitosti při hledání optimálního řešení je popsána např. v [10].
3.10
Základní pojmy z informatiky
Vzhledem k tomu, že se část disertační práce věnuje programování, je třeba definovat pojmy, které se v ní budou vyskytovat. Definice jsou převzaty z [2, 39]. Proměnná v informatickém slova smyslu je způsob odkazání se do počítačové paměti v počítačovém programu. Toto místo v paměti obsahuje hodnotu – číselnou, textovou, resp. jiný, složitější typ dat. Datový typ je způsob uchování dat, který obsahuje specifický typ resp. rozsah hodnot. Při ukládání dat do proměnných musí být každá proměnná přiřazena konkrétnímu datovému typu. Běžná data obsahují celočíselné hodnoty, reálné hodnoty, znaky, znakové řetězce a pole. Dále mohou být definovány speciální, např. datové, časové, booleovské, anebo proměnlivé datové typy. Algoritmus je množina instrukcí, někdy zvaných procedury nebo funkce, která se používá k vykonání některého úkolu. Může jím být jednoduchý proces, jako např. součet dvou čísel, nebo složitá funkce, jako např. nalezení optimálního řešení úlohy lineárního programování. Datová struktura je způsob uchovávání a organizování dat v počítači tak, aby mohly být efektivně využity. Podmnožinou datových struktur jsou datové typy. Ty se rozdělují na primitivní, smíšené a abstraktní. Příklady jednotlivých kategorií datových typů jsou uvedeny v následujícím seznamu. • Primitivní datové typy, jejímiž zástupci jsou např. – – – – –
boolean – hodnota true/false, char – jeden znak, float – uchovává reálné číslo, double – uchovává reálné číslo většího rozsahu, integer – uchovává celočíselné struktury
• Složené datové typy, např. – – – –
Pole (Array), Záznam (Record), Union, Variant
• Abstraktní datové typy, např.
3.11
Hodnocení kvality algoritmů
– – – – – –
3.11
37
Kontejner, Seznam, Fronta, Zásobník, String, Graf.
Hodnocení kvality algoritmů
Při návrhu resp. porovnávání kvality algoritmů, je vhodné se při posuzování zaměřit na tato kriteria [7, 8]: • Rychlost výpočtu (časová složitost). Jak dlouho budeme čekat, než algoritmus vrátí výsledek. • Paměťovou náročnost (paměťová složitost). Kolik paměti program zabere? Bude disponibilní paměť stačit? • Časová náročnost tvorby programu. Jak dlouho bude trvat, než program napíšeme a odladíme? Časová složitost algoritmu spuštěného na vstup D je počet kroků, které algoritmus provede. Časová složitost algoritmu je funkce T : N → N, kde T (n) je (maximální) počet kroků, které provede algoritmus běžící na datech o velikosti n. Paměťovou složitost lze definovat jako funkci spotřeby paměti v závislosti na velikosti vstupních dat n. Krokem algoritmu je myšlena jedna operace (instrukce) daného stroje (počítače). Je to např. přiřazení, aritmetická operace +, −, ∗, /, vyhodnocení podmínky, apod. Za krok algoritmu lze tedy považovat libovolnou operaci proveditelnou v konstantním čase. Označme velikost vstupu jako n a nechť c je nějaká konstanta. Časové složitosti c · n budeme říkat lineární, časové složitosti c · n2 kvadratická, c · n3 kubická a c · an pro a > 1 exponenciální. S časovou složitostí algoritmu úzce souvisí i doba jeho výpočtu. Představme si počítač, který zvládne 109 kroků za vteřinu9 . Potom tabulka 2 udává čas potřebný k realizaci výpočtu v závislosti na časové složitosti algoritmu pro velikost vstupu n. Z tabulky 2 je vidět, že všechny výpočty, kromě těch s časovou složitostí 2n a n!, budou trvat „rozumný časÿ. Proto budeme považovat algoritmy s nejvýše polynomiální časovou složitostí za rozumné a těm ostatním se budeme snažit vyhnout. Při rozhodování o dalším využití algoritmů je nutné provést jejich vzájemné porovnání. To lze provádět prakticky i teoreticky. Při teoretickém porovnávání lze odhadnout počet kroků algoritmu a jeho spotřebu paměti. V případě, že je algoritmus komplikovaný, může být nalezení správných odhadů obtížné. Reálné hodnoty 9
Jde o běžný počítač z roku 2012.
38
3
LITERÁRNí PŘEHLED
Tab. 2: Čas výpočtu v závislosti na velikosti vstupních dat. Zdroj: Černý [7].
log √ n n n n log n n2 n3 2n n!
n = 10 n = 100 n = 1 000 n = 1 000 000 3,3 ns 6,7 ns 10 ns 20 ns 3,2 ns 10 ns 31,6 ns 1 µs 10 ns 100 ns 1 µs 1 ms 33 ns 664 ns 9,9 µs 20 ms 100 ns 10 µs 1 ms 16,5 min 1 µs 1 ms 1s 31 let 1 µs 3 · 1014 let 3 · 10286 let ≈∞ 142 3 ms 3 · 10 let ≈∞ ≈∞
mohou být mnohokrát horší než nejlepší odhady. Velmi často také záleží na charakteru dat. Proto mnohdy nezbývá než algoritmy otestovat na simulovaných nebo reálných datech. V praxi se ale také může stát, že praktickým porovnáním algoritmů dostaneme opačný závěr než jejich teoretickým porovnáním. Tedy, že se algoritmus s teoreticky vysokou časovou složitostí může prakticky chovat lépe, než algoritmus s teoreticky nízkou časovou složitostí. Příkladem může být simplexový algoritmus. V nejhorším případě má exponenciální časovou složitost, ale na praktických datech se chová daleko lépe než všechny známé polynomiální algoritmy pro lineární programování.
4
39
METODIKA PRÁCE
4
Metodika práce
4.1
Testování statistických hypotéz
Dle [18, 30] se statistickou hypotézou rozumí určitý předpoklad o parametrech či tvaru rozdělení zkoumaného znaku. Tento vyslovený předpoklad nazýváme nulovou hypotézou a značíme H0 . Proti této hypotéze stavíme tzv. alternativní hypotézu H1 , která neguje v nulové hypotéze uváděné tvrzení. Hypotéza může být formulována jako oboustranná, test hypotézy je potom dvoustranným testem; anebo jednostranná, dělící se dále na pravostrannou a levostrannou. Tyto jednostranné hypotézy jsou následně testovány jednostranným testem, pravostranným či levostranným. Testovaná hypotéza může ve skutečnosti platit anebo neplatit. Během testování může být hypotéza zamítnuta nebo nezamítnuta; bez ohledu na skutečnost, zda platí či neplatí. Vznikají možnosti uvedené v tabulce 3: Tab. 3: Chyby I. a II. druhu a jejich pravděpodobnosti. Zdroj: Hindls [18].
Úsudek o H0 Nezamítá se Zamítá se
Skutečnost H0 je pravdivá H0 je nepravdivá správné rozhodnutí, chyba II. druhu, 1−α β chyba I. druhu, správné rozhodnutí, α 1−β
Pravděpodobností 1 − β nazýváme sílu testu, tj. pravděpodobnost zamítnutí nulové hypotézy H0 , platí-li alternativní hypotéza H1 . Síla testu 1 − β ani pravděpodobnost chyby druhého druhu β není známa. Pravděpodobnost chyby prvního druhu α si zvolíme sami a nazveme ji hladinou významnosti. Obvykle volíme 5% nebo 1% hladinu významnosti. Testové kriterium T bude nabývat hodnot z výběrového prostoru S, rozděleného na dvě disjunktní podmnožiny: • hodnot svědčících ve prospěch hypotézy H0 , tzv. obor nezamítnutí V , • hodnot svědčících ve prospěch alternativní hypotézy H1 , tzv. kritický obor W . Pro obě podmnožiny V , W výběrového prostoru S platí, že S = V ∪W a V +W = ∅. Při testování dále postupujeme podle následujícího schematu: 1. Je vyslovena nulová hypotéza H0 a alternativní hypotéza H1 . 2. Je zvolena hladina významnosti α. 3. Je určen kritický obor: výběrový prostor S testového kriteria T je rozdělen na dva podprostory – nekritický obor V a kritický obor W . Velikost kritického oboru je stanovena tak, abychom se chyby prvního druhu dopustili nejvýše ve
40
4
METODIKA PRÁCE
100α procentech případů. Musí být tedy splněno α = P (T ∈ W | H0 ). Při znalosti rozdělení T za podmínky H0 lze určit kritický obor, který se liší podle toho, zda jde o jednostranné či oboustranné testy: • pokud ve prospěch H1 svědčí nízké hodnoty testového kriteria, bude kritický obor určen intervalem W ≡ (Tmin ; Tα i , • v případě, že ve prospěch H1 svědčí vysoké hodnoty testového kriteria, pak je kritický obor určen intervalem W ≡ hT1−α ; Tmax ) , • jestliže ve prospěch H1 svědčí extrémní (tj. vysoké a nízké) hodnoty testového kriteria, pak je kritický obor určen sjednocením intervalů
W ≡ Tmin ; T α2 ∪ T1− α2 ; Tmax .
4. Výpočet hodnoty testového kriteria – dle vzorce pro výpočet hodnoty kriteria určíme jeho hodnotu. 5. Formulace závěrů testu – můžeme dojít k těmto dvěma možnostem: • Hodnota testového kriteria leží v kritickém oboru, tj. T ∈ W platí při 100α% riziku nesprávnosti tohoto výroku. Hypotézu H0 zamítáme ve prospěch alternativní hypotézy H1 . • Hodnota testového kriteria náleží do oboru přijetí, tj. T ∈ V , hypotézu H0 nezamítáme a konstatujeme, že hypotéza H1 nebyla prokázána.
4.2
Testy o tvaru rozdělení
Pomocí těchto testů ověříme, zda sledovaná data mají některé ze známých rozdělení s daným parametrem, či nikoli. Podle výsledků testů o tvaru rozdělení budou následně použity buď parametrické nebo neparametrické testy. 4.2.1
χ2 -test dobré shody
Pomocí tohoto testu lze otestovat, zda má základní soubor zvolené rozdělení či nikoli. Test se vyskytuje ve více obměnách: • Nulová hypotéza H0 předpokládá, že v základním souboru roztříděném podle zvoleného znaku do k skupin jsou podíly variant v základním souboru rovny číslům π0,1 , π0,2 , . . . , π0,k .
4.2
41
Testy o tvaru rozdělení
• Nulová hypotéza H0 předpokládá, že základní soubor má rozdělení určitého typu včetně znalosti parametrů. Pak jde o tzv. úplně specifikovaný model. • Nulová hypotéza H0 předpokládá, že základní soubor má rozdělení určitého typu, přičemž parametry rozdělení nejsou známy. Mluvíme o neúplně specifikovaném modelu. Za testové kriterium je zvolena statistika G=
k X (ni − nπ0,i )2
nπ0,i
i=1
,
(26)
kde ni jsou pozorované četnosti a nπ0,i jsou teoretické četnosti v i-té skupině pro i = 1, . . . , k. Pro dostatečný počet pozorování má statistika G přibližně χ2 -rozdělení s ν = k − 1 stupni volnosti. Alternativní hypotéza H1 neguje nulovou hypotézu, tzn. tvrdí, že rozdělení je jiné, popřípadě že má jiné parametry než námi zvolené rozdělení. Kritický obor je vymezen pro hodnoty statistiky G ≥ χ21−α (ν) pro ν = k − h − 1 stupňů volnosti, kde k je počet tříd a h počet odhadovaných parametrů. χ2 test dobré shody popisuje např. [14]. 4.2.2
Test podle Shapira-Wilka
Testuje hypotézu H0 , že data pochází z normálního rozdělení. Nechť x1 , . . . , xn jsou pozorovaná data. Ta uspořádáme podle velikosti tak, že dostaneme neklesající posloupnost x∗1 ≤ x∗2 ≤ . . . ≤ x∗n .
(27)
Jako testovací kriterium bude použita statistika W :
W =
m X i=1
(n)
ai
∗
· x∗n−i+1 − xi
n X i=1
!2
,
(28)
(xi − x)2
1X n n−1 xi , m = v případě, že n je sudé, m = kde x = v případě, že n je liché n i=1 2 2 n
(n)
a ai jsou konstanty generované z průměrů, rozptylů a kovariancí pořadové statistiky z výběru rozsahu n normálního rozdělení, viz. např. Handbook of Statistical Methods [32], tabulka 15. Jestliže hodnota W ≤ Wα , pak hypotézu o normalitě základního souboru zamítáme. Wα jsou kritické hodnoty tohoto testu.
42
4
4.3
METODIKA PRÁCE
Parametrické testy
V rámci těchto testů jsou testovány parametry rozdělení základního souboru. 4.3.1
Hypotéza o střední hodnotě
Používá se pro ověření, že průměr základního souboru µ se rovná určité hodnotě µ0 . Nulová hypotéza je formulována jako H0 : µ = µ0 oproti alternativní hypotéze H1 : µ 6= µ0 při oboustranném, resp. H1 : µ > µ0 nebo H1 : µ < µ0 při jednostranném testu. V případě znalosti rozptylu základního souboru σ je zvoleno testové kriterium x − µ0 √ n, (29) U= σ při neznalosti rozptylu základního souboru má testové kriterium tvar x − µ0 √ n, (30) U= s0x přičemž veličina U má normované normální rozdělení. V případě, že testujeme výběr menšího rozsahu (pro n ≤ 30), pak je jako testové kriterium použita statistika x − µ0 √ n, (31) t= s0x mající studentovo t-rozdělení s ν = n − 1 stupni volnosti. 4.3.2
Hypotéza o shodě dvou středních hodnot
Použijeme v případě, že potřebujeme porovnat dva výběry. Na základě tohoto porovnání usuzujeme na vlastnosti základních souborů. Test lze provádět za trojího předpokladu [18]: 1. V případě znalosti rozptylů obou základních souborů existují dva soubory se středními hodnotami µ1 a µ2 s rozptyly σ12 a σ22 . Předpokládáme normalitu rozdělení obou souborů. U obou souborů spočítáme výběrový průměr x1 a x2 z náhodných výběrů o rozsahu n1 a n2 . Pak je nulová hypotéza formulována jako H0 : µ1 = µ2 , resp. µ1 − µ2 = 0.
Alternativní hypotézy a kritický obor jsou uvedeny v tabulce 4. Za testové kriterium je zvolena statistika x1 − x2 U=r 2 , (32) σ1 σ22 + n1 n2 mající v případě platnosti H0 normální rozdělení.
4.3
43
Parametrické testy
Tab. 4: Formulace alternativních hypotéz a vymezení kritických oborů za předpokladu znalosti rozptylů obou základních souborů. Zdroj: Hindls [18].
Test oboustranný jednostranný
Alternativní hypotéza µ1 = µ2 , resp. µ1 − µ2 µ1 < µ2 , resp. µ1 − µ2 µ1 > µ2 , resp. µ1 − µ2
H1 =0 <0 >0
Kritický obor
W ≡ −∞, u α2 ∪ u1− α2 , ∞ W ≡ (−∞, uα i W ≡ hu1−α , ∞)
2. Pokud neznáme rozptyly základního souboru, ale víme, že jsou stejné, použijeme statistiku t= s
x1 − x2 (n1 −
1)s02 1
+ (n2 − n1 + n2 − 2
1)s02 2
r
,
(33)
1 1 + n1 n2
mající při platnosti H0 studentovo t-rozdělení s ν = n1 + n2 − 2 stupni volnosti. Kritický obor je vymezen podobně jako při znalosti rozptylů obou souborů v tabulce 4 s tím rozdílem, že kvantily uα normálního rozdělení jsou nahrazeny kvantily tα studentova rozdělení. 3. Jestliže neznáme rozptyly základních souborů a nemůžeme očekávat jejich shodu, pak použijeme testové kriterium x1 + x 2 , t= s 02 s s02 1 + 2 n1 n2
(34)
které má studentovo t-rozdělení s ν stupni volnosti, přičemž ν vypočteme podle vzorce: 02 2 s1 s02 2 + n1 n2 ν = 02 2 − 2. (35) 02 2 s1 1 s2 1 + n1 n1 + 1 n2 n1 + 1 Vymezení kritického oboru proběhne analogicky jako v případě shodných rozptylů. 4.3.3
Hypotéza o rozptylu
V případě normálního rozdělení základního souboru provedeme výběr o rozsahu n pozorování. Na něm otestujeme hypotézu, že rozptyl základního souboru je roven hodnotě σ02 . Pak nulová hypotéza je formulována ve tvaru H0 : σ 2 = σ02 ,
44
4
METODIKA PRÁCE
alternativní hypotézy budou formulovány takto: H1 : σ 2 6= σ02 pro oboustrannou, H1 : σ 2 > σ02 pro pravostrannou a H1 : σ 2 < σ02 pro levostrannou alternativní hypotézu. Pak jako testové kriterium použijeme statistiku χ2 =
(n − 1)s02 x , σ02
(36)
kde s02 x je výběrový rozptyl. Popisovaná statistika má v případě platnosti nulové hypotézy χ2 rozdělení s ν = n − 1 stupni volnosti.
Kritický obor je určen: E D 2 2 • W ≡ 0, χ α ∪ χ1− α , ∞ u oboustranné hypotézy H1 : σ 2 6= σ02 , 2
2
• W ≡ (0, χ2α i pro pravostrannou hypotézu H1 : σ 2 > σ02 a
• W ≡ χ21−α , ∞ pro levostrannou hypotézu H1 : σ 2 < σ02 .
4.3.4
Hypotéza o shodě dvou rozptylů
Existují dva výběrové soubory o rozsazích n1 a n2 , z nichž jsou vypočteny výběrové 02 rozptyly s02 1 a s2 . Nulová hypotéza je formulována ve tvaru H0 : σ12 = σ22 . Alternativní hypotézy jsou zvoleny v tomto tvaru: H1 : σ12 6= σ22 pro oboustrannou, H1 : σ12 > σ22 , resp. H1 : σ12 < σ22 pro jednostranné alternativní hypotézy. Jako testové kriterium použijeme statistiku F =
s02 1 , s02 2
(37)
která má F rozdělení s ν1 = n1 − 1 a ν2 = n2 − 1 stupňů volnosti a kritické obory jsou vymezeny následovně:
• W ≡ 0, F α2 [n1 − 1; n2 − 1] ∪ F1− α2 [n1 − 1; n2 − 1], ∞ pro oboustrannou hypotézu H1 : σ12 6= σ22 , • W ≡ (0, Fα [n1 − 1; n2 − 1]i pro jednostrannou hypotézu H1 : σ12 < σ22 a • W ≡ hF1−α [n1 − 1; n2 − 1], ∞) pro jednostrannou hypotézu H1 : σ12 > σ22 . Fα [ν1 ; ν2 ] jsou kvantily F -rozdělení na hladině významnosti α při ν1 a ν2 stupních volnosti.
4.4
Neparametrické testy
V případě neznalosti rozdělení základního souboru a nutnosti testování jeho vybraných charakteristik se používají neparametrické testy.
4.5
45
Regresní analýza
4.4.1
Wilcoxonův dvouvýběrový test
Nechť (X1 , X2 , . . . , Xm ) a (Y1 , Y2 , . . . , Yn ) jsou dva nezávislé náhodné výběry ze dvou spojitých rozdělení. Ověřujeme hypotézu H0 : distribuční funkce rozdělení obou výběrů jsou shodné. Všech m + n hodnot uspořádáme do neklesající posloupnosti, tvořící tzv. sdružený výběrový soubor. Jednotlivým hodnotám sdruženého výběrového souboru přiřadíme pořadí. Součet pořadí x1 , x2 , . . . , xn označíme T1 , součet pořadí y1 , y2 , . . . , yn označíme T2 . Vypočítáme hodnoty charakteristik m(m + 1) − T1 , 2 n(n + 1) = m·n+ − T2 . 2
U1 = m · n +
(38)
U2
(39)
Jako testové kriterium použijeme statistiku U = min {U1 , U2 }. Hypotézu H0 zamítáme na hladině významnosti α, pokud U ≤ Uα , kde Uα jsou kritické hodnoty Wilcoxonova dvouvýběrového testu. V případě, že m, n jsou velká čísla (m + n − 2 > 100), lze jako testové kriterium použít statistiku U=r
U1 −
m·n 2
m·n (m + n + 1) 12
,
(40)
která má za platnosti testované hypotézy asymptoticky normální normované rozdělení N (0, 1). Hypotézu H0 tedy zamítáme na hladině významnosti α, jestliže |U | ≥ u α2 , jak uvádí [30].
4.5
Regresní analýza
Regresní analýza se používá pro odhad parametrů regresního modelu, v případě této práce půjde o odhad času výpočtu navrhovaných algoritmů v závislosti na počtu vstupních proměnných. Ve vlastní práci bude využita dvojitá logaritmická funkční forma modelu. 4.5.1
Lineární regresní model
Za předpokladu stochastické lineární závislosti mezi vysvětlovanou proměnnou Y a k vysvětlujícími proměnnými X1 , X2 , . . . , Xk ve tvaru Y = β1 X1 + β2 X2 + . . . + βk Xk + u,
(41)
kde u je náhodná složka a βj je j-tý regresní koeficient, resp. parametr, lze X1 specifikovat jako zvláštní (umělou) proměnnou, která nabývá ve všech pozorováních
46
4
METODIKA PRÁCE
hodnoty jedné, takže vztah (41) lze psát jako Y = β1 + β2 X2 + . . . + βk Xk + u,
(42)
přičemž β1 je absolutní člen, resp. úrovňová konstanta. Jestliže pro náhodnou složku platí, že E(u) = 0, pak očekávanou hodnotu Y jako funkci daných hodnot vysvětlujících proměnných můžeme vyjádřit pomocí deterministického vztahu E(Y ) = β1 + β2 X2 + . . . + βk Xk ,
(43)
který se nazývá regresní funkcí základního souboru. Regresní koeficienty β2 , β3 , . . . , βk měří změnu E(Y ) odpovídající jednotkové změně libovolné vysvětlující proměnné, přičemž ostatní proměnné zůstávají zachovány. Vzhledem k tomu, že koeficienty regresní rovnice ani parametry rozdělení náhodné složky v základním souboru neznáme, musíme se spokojit s jejich odhady získanými z výběrových dat. K dispozici máme zpravidla konečný výběr z n pozorování, z nichž každé obsahuje konkrétní hodnotu vysvětlované proměnné Y a množinu k hodnot vysvětlujících proměnných X1 , X2 , . . . , Xk . Výpočet regresních parametrů se provádí pomocí metody nejmenších čtverců, uvádí [20].
4.6
Modelovací jazyk Lingo
Dopravní úlohy, vyskytující se v této práci, budou optimalizovány v programu Lingo. Hlavním důvodem je možnost využití modelovacího jazyka, umožňujícího poměrně jednoduchého zápisu modelů, a dále také možnosti propojení takto vzniklých modelů s daty, nalézajícími se mimo definovaný model. Nezanedbatelným faktem mluvícím ve prospěch tohoto programu je také skutečnost, že Provozně ekonomická fakulta (PEF) vlastní licenci Lingo Extended, která umožňuje řešit lineární matematické modely bez omezení maximálního počtu proměnných a omezujících podmínek, a to včetně bivalentních, celočíselných resp. nelineárních proměnných. Program Lingo umožňuje řešit matematické modely, které však do něj musí být zapsány v požadovaném formátu. Tím je buď klasický zápis modelů v běžném tvaru, využití modelovacího jazyka nebo možnost načtení dat ve formátu MPS (Mathematical Programming System), který byl vyvinut v šedesátých letech minulého století firmou IBM a je doposud takovým standardem, že jakýkoli program, mající ambice být označován jako profesionální jej má implementován [23]. 4.6.1
Ovládání programu
Samotný program je spustitelný pod operačním systémem Windows a jeho ovládání se až na vlastní specifika neliší od ostatních programů spustitelných pod tímto operačním systémem. V horní části programu se nachází hlavní menu, z něhož je možné
4.6
47
Modelovací jazyk Lingo
se dostat k nastavení libovolných parametrů programu. Pro rychlejší přístup jsou přímo v panelu nástrojů nacházejícím se pod hlavním menu umístěny nejpoužívanější ikony. Většinou se jedná o typické ikony (New, Open, atd.), ale jsou zde i ty, které jsou použitelné při řešení modelu a jeho výpisu, jako např.: • Solve , jenž řeší model, který se nachází v aktuálně vybraném okně programu. Po stisku tohoto tlačítka dojde k výpisu všech proměnných uvedených v modelu a jejich hodnot, a to do samostatného okna. . K jeho aktivování dojde až po vyřešení matematického modelu • Solution stiskem tlačítka Solve. Umožňuje vypsat vybrané proměnné, a to buď všechny, nebo jen ty nenulové. , která do nového okna zakreslí ve formě obrázku znázorňu• Matrix Picture jícího matici strukturu proměnných vyskytujících se v modelu. Samozřejmě je třeba zdůraznit, že modely je nutné zapisovat syntakticky správně: nezapomínat na ukončování každého výrazu středníkem, na shodné názvy proměnných, na správné použití funkcí a jejich parametrů a zejména na párování závorek. Při jakékoli syntaktické chybě nedojde k výpočtu modelu. Protože zejména párování závorek může u složitějších modelů způsobovat problémy, je přímo v panelu nástrojů k dispozici tlačítko pro kontrolu spárování závorek Match Parenthesis 4.6.2
.
Popis jazyka, zápis modelů
Optimalizované modely sestávají obvykle z těchto 3 částí [27]: • účelová funkce, • proměnné modelu, • omezení modelu, přičemž všechny tyto části bude obsahovat jakýkoli model, který má být optimalizován. U všech proměnných vyskytujících se v modelu je automaticky počítáno s jejich nezáporností. Program Lingo nerozlišuje mezi velkými a malými písmeny, tj. není „case sensitiveÿ. Každý matematický výraz musí být ukončený středníkem, v opačném případě tento model nebude vyřešen a program upozorní na syntaktickou chybu v modelu. Model může začít klíčovým slovem MODEL, potom musí být ukončen slovem END. Pro větší přehlednost je vhodné je uvádět. Klíčová slova jsou v programu Lingo zvýrazněna modře. V případě, že autor potřebuje některou část okomentovat, použije vykřičník. Od tohoto znaku až po první výskyt středníku je všechen text považován za komentář
48
4
METODIKA PRÁCE
a nebude při výpočtu interpretován. Komentář je v programu zvýrazněn zelenou barvou. Za klíčovým slovem MODEL následuje buď přímo zápis účelové funkce a vlastních omezení u jednodušších modelů, nebo definice množin, jejich prvků a atributů v případě složitější struktury zapisovaných matematických modelů. Každá definovaná proměnná vyskytující se v modelu musí začínat některým ze symbolů abecedy (A − Z). Za ním mohou již následovat symboly abecedy (A − Z), číselné symboly (0−9), nebo znak podtržítko ( ). Horní limit pro délku jména proměnné je 32 znaků. Při zápisu matematických výrazů lze použít běžné matematické operátory +, -, *, /, (, ), <, =, >, aj. Je možné použít i funkce nadefinované v programu. Ať už v účelové funkci nebo při vlastních omezeních, vždy musí být mezi koeficientem a proměnnou operátor. Nelze tedy zapsat např. 3x, v tomto případě Lingo upozorní na sytaktickou chybu. Správný zápis je 3*x. Účelová funkce se zapisuje jako běžný matematický výraz a začíná dle optimalizačního kriteria buď slovem MAX= pro maximalizační nebo MIN= pro minimalizační typy úloh. Za rovnítkem následuje zápis proměnných modelu vyskytujících se v účelové funkci násobených koeficienty účelové funkce, výraz je ukončen středníkem. V případě, že se optimalizační kriterium v modelu nevyskytuje, řeší Lingo soustavu (ne)rovnic. S ohledem na vlastnosti matematických modelů, které jsou řešitelné jen v případě, že všechny omezující podmínky jsou ve tvaru rovnosti či neostré nerovnosti, je možno nerovnosti v matematickém modelu zapisovat buď jako <= či >= nebo jen pomocí znaků < nebo >, které budou programem považovány za ≤, resp. ≥. Lingo automaticky předpokládá nezápornost všech proměnných vyskytujících se v modelu. V modelu tedy není nutné zapisovat podmínky nezápornosti. Pokud chceme, aby jedna či více proměnných mohla nabývat libovolných hodnot v oboru reálných čísel, musíme pro tuto proměnnou použít funkci @free, zapsanou následovně: @free(promenna);. 4.6.3
Využití modelovacího jazyka
Při zápisu matematických modelů často dochází k situaci, že zapisovaný model má své „charakteristickéÿ vlastnosti, díky nimž lze i skutečně rozsáhlý model s mnoha proměnnými zapsat poměrně úsporně. To je možné pomocí modelovacího jazyka, který je v programu Lingo implementován. Pro přehlednější a efektivnější zápis modelů je vhodné model strukturovat. [22] uvádí následující strukturu:
4.6
Modelovací jazyk Lingo
49
Obr. 4: Ukázka zápisu jednoduchého modelu dopravní úlohy v programu Lingo. Zdroj: vlastní práce.
MODEL: SETS: !definice množin, jejich prvků a atributů; ENDSETS DATA: !specifikace vstupních dat; ENDDATA INIT: !nastavení počátečních hodnot proměnných; ENDINIT END Výhoda této struktury zápisu je zřejmá. Je oddělen model (zapsaný pomocí modelovacího jazyka) od dat, která lze dle potřeby měnit. Vlastní popis modelu pomocí modelovacího jazyka se obvykle zadává mezi část SETS, kde je definována datová struktura, a část DATA, obsahující parametry modelu. Sekce SETS je volitelnou částí modelu. Začíná klíčovým slovem SETS: a je ukončena klíčovým slovem ENDSETS. V modelu množinová sekce uvedena být nemusí, může se vyskytovat jednou či vícekrát, a to kdekoli v modelu dle potřeby. Jediným
50
4
METODIKA PRÁCE
požadavkem je, že množiny se svými atributy musí být definovány předtím, než je na ně v modelu poprvé odkazováno [38]. Jak uvádí [22], v rámci sekce SETS jsou definovány množiny, prvky množin a jejich atributy. Lingo rozeznává dva druhy množin: primitivní a odvozené. • Primitivní množiny jsou souborem prvků, jejichž počet nezávisí na jiných množinách. Je to pouhý výčet prvků, které mají společné vlastnosti – atributy. Syntaxe zápisu primitivní množiny je následující: jmeno mnoziny/prvky mnoziny/:atributy; Jako příklad lze uvést množinu dodavatelů, obsahující dva prvky (dodavatele dod1 a dod2) s atributem kapacita: dodavatele/dod1,dod2/:kapacita; V případě, že je nutno definovat velký počet prvků množiny, je zápis výčtem všech prvků nepraktický. Prvky mohou být zadány pořadovými čísly. Zápis stejného problému s 20 dodavateli by potom vypadal následovně: dodavatel/dod1..dod20/:kapacita; • Odvozené množiny definují své prvky jako kombinaci prvků primitivních množin nebo jako podmnožinu primitivní množiny. Zápis odvozené množiny je následující: jmeno mnoziny(primitivni mnoziny):atributy; Příkladem může být například odvozená množina přeprava, obsahující dvě primitivní množiny dodavatelé (definováni v předchozím odstavci) a odběratelé. Jejími atributy budou přepravované množství a vzdálenost. Zápis pak bude následující: preprava(dodavatel, odberatel): mnozstvi, vzdalenost; Přes datovou sekci modelu do modelu vstupují data, a to v následujícím tvaru: atribut=seznam hodnot; přičemž hodnoty jsou odděleny čárkami či mezerami. Počet hodnot zvoleného atributu se musí shodovat s počtem prvků dané množiny, v opačném případě je indikována chyba a výpočet přerušen. Zápis dat může být následující: DATA: !kapacity dodavatelů, požadavky odběratelů; kapacita= 20, 30; pozadavek= 15, 15, 20; !vzdálenosti mezi dodavateli a odběrateli; vzdalenost= 5, 2, 7 8, 4, 3; ENDDATA
4.6
Modelovací jazyk Lingo
51
Jak je vidět, atribut množství se ve vstupních datech nevyskytuje. Jedná se totiž o hledanou proměnnou, proto budou jeho hodnoty získány až vyřešením modelu. 4.6.4
Nejdůležitější funkce
Funkce jsou jednou z nejdůležitějších vlastností modelovacího jazyka. Charakteristickou vlasností funkcí je, že začínají znakem @, za nímž následuje název funkce a parametry funkce uvedené v závorce. [23] rozlišuje několik kategorií funkcí podle jejich určení, jako např. matematické funkce, indexové funkce, funkce pro popis vlastností modelu, aj. Mezi nejčastěji používané funkce patří indexové funkce. Je jich celkem 5, z nichž zápis prvních čtyř (@MIN, @MAX, @SUM, @PROD) je identický: @FUNKCE(jmeno mnoziny|logicka podminka:vyraz); přičemž logická podmínka nemusí být uvedena. Pokud není uvedena, provádí se funkce pro všechny prvky množiny, v opačném případě pro ty prvky, které uvedenou podmínku splňují. Odlišný způsob zápisu má funkce @FOR: @FOR(jmeno mnoziny|logicka podminka:vyrazy,omezujici podminky); což lze interpretovat takto: pro vybrané prvky množiny proveď uvedené výrazy (což může být buď jeden výraz nebo více výrazů oddělených středníkem). V následující ukázce byla použita suma jako funkce pro výpočet hodnoty účelové funkce, kdy je sčítáno množství materiálu násobené vzdáleností. Ve druhém případě se jedná o zápis omezujících podmínek na straně dodavatelů, kde funkce @FOR byla použita pro zápis omezujících podmínek zajišťujících nepřekročení maximální kapacity každého dodavatele. !účelová funkce modelu; MIN=@SUM(preprava:mnozstvi*vzdalenost); !omezující podmínky zajišťující nepřekročení kapacity i-tého dodavatele; @FOR(DODAVATEL(i): @SUM(ODBERATEL(j):mnozstvi(i,j))<=kapacita(i); ); Mezi funkce, které je vhodné zmínit, patří ještě funkce @BIN(x), která proměnnou x definuje jako bivalentní, tj. nabývající hodnot 0 nebo 1; další funkcí je funkce @GIN(x), která proměnnou x definuje jako celočíselnou. Poslední zmíněnou funkcí je funkce @BND(DM,x,HM) která proměnnou x limituje v intervalu DM ≤ x ≤ HM.
52
4.7
4
METODIKA PRÁCE
Software Gretl
Pro statistické výpočty bude použit software Gretl [16]. Jde o open-source software pod licencí GNU-GPL, který je k dispozici volně ke stažení, např. z odkazu http: //gretl.sourceforge.net/.
4.8
Vývojové prostředí jazyka Delphi
Pro vývoj vlastních aplikací je použito vývojové prostředí jazyka Delphi, jehož ukázka je k dispozici na obrázku 5.
Obr. 5: Ukázka vývojového prostředí programovacího jazyka Delphi. Zdroj: vlastní práce.
Při vlastním programování, tj. při tvorbě aplikací, je často nutné nahlédnout do literatury, v níž jsou popsány specifické procedury a funkce, které mají být aplikovány, resp. je popsána jejich syntaxe. K tomuto účelu budou využívány zejména tyto zdroje: [1, 6, 9, 24, 40].
5
53
NÁVRH VLASTNí METODIKY
5
Návrh vlastní metodiky
Protože modely distribučních úloh popsané v sekci 3.9 neřeší přepravu z hlediska času, bylo nutné tyto modely navrhnout.
5.1
Modifikace Blandova algoritmu eliminujícího zacyklení
Jedním z nejdůležitějších problémů, které bylo nutné vyřešit s ohledem na stabilitu výpočtů programu, byla eliminace zacyklení v průběhu výpočtu. Při zacyklení dochází k situaci, kdy po několika krocích výpočtu se algoritmus dostane do báze, ve které se nacházel v některém z předchozích kroků. Celková změna účelové funkce je přitom nulová. Pokud dojde k reálnému (tj. nenulovému) zlepšení hodnoty účelové funkce, k zacyklení dojít nemůže. To byla základní myšlenka modifikace vylepšení klasického způsobu výběru klíčového políčka Blandovým anticyklickým pravidlem. Počáteční kroky modifikovaného algoritmu se neliší od původního. Nejprve dojde k nalezení klíčového sloupce, následně řádku. V tuto chvíli klasický algoritmus vrací souřadnice klíčového políčka. Zde však dochází k modifikaci – je testována celková změna účelové funkce, tj. βl (44) αlr V případě, že je změna účelové funkce nenulová, vrací algoritmus souřadnice klíčového políčka. Pokud je nulová, reálně hrozí zacyklení, a proto dochází k výběru klíčového políčka pomocí Blandova pravidla. Jako klíčový je zvolen sloupec s nejmenším indexem j, který porušuje kritérium optimality. Klíčový řádek je zvolen standardně, jako βl (45) min αlr ∆r ·
pro αlr > 0. Pokud existuje více minimálních podílů, zvolíme ten s nejmenším indexem. Vývojový diagram upraveného algoritmu je k dispozici na obrázku 6. Ačkoli se při vlastním programování vycházelo z upraveného algoritmu, bylo nutné některé části pozměnit. Jednou z těchto změn je tolerance celkové změny účelové funkce. Ačkoli model pracuje s datovými proměnnými typu real48, zajišťujícími v rámci programovacího jazyka Delphi maximální možnou přesnost, v průběhu výpočtů dochází poměrně často k zaokrouhlování a kumulujícím se nepřesnostem. To může způsobit „nenulovouÿ změnu účelové funkce, způsobenou zaokrouhlováním a k nečekanému zacyklení. Proto je při identifikaci změny účelové funkce nastavena tolerance, určená hodnotou proměnné ε. Pokud je celková změna účelové funkce (v absolutní hodnotě) menší než ε, program považuje celkovou změnu za nulovou a vybírá podle Blandova necyklícího algoritmu. Modifikovaný Blandův algoritmus je podrobně otestován a porovnán s klasickým Blandovým algoritmem v kapitole 6.2.3 na straně 70.
54
5
NÁVRH VLASTNí METODIKY
Start
Najdi sloupec r, kde r = max{∆j } pro ∆j > 0.
ne
Je ´uloha maximalizaˇcn´ı?
ano Najdi l, kde l = ˇr´adek βi pro αir > 0. αir
min
∆r ·
βl =0 αlr
ano
Najdi sloupec r, kde r = min{∆j } pro ∆j < 0.
Je ´uloha maximalizaˇcn´ı?
ano
Najdi sloupec r, kde r = min{j} pro ∆j > 0.
ne ne Najdi sloupec r, kde r = min{j} pro ∆j < 0.
Najdi ˇr´adek l, kde l = βi pro αir > 0. αir
min
Souˇradnice kl´ıˇcov´eho pol´ıˇcka jsou (l, r).
Konec
Obr. 6: Modifikovaný Blandův algoritmus pro výběr klíčového políčka. Zdroj: vlastní práce.
5.2
Dynamická dopravní úloha s celkovým přepravovaným množstvím
Před řešením vlastního problému bude problém podrobně popsán. Při popisu modelu budou popsány nejprve ty části, které jsou shodné s klasickou dopravní úlohou, a následně budou popsány odlišnosti a důvody, proč pro tento model nelze použít klasickou dopravní úlohu. Potom bude následovat návrh na řešení modelu. Vzhledem k tomu, že hledáme optimální řešení v čase, lze úlohu nazvat Dynamická dopravní úloha. Proto bude v dalších částech práce, zejména ve zdrojovém kódu, v souvislosti s touto úlohou používána zkratka DTP10 . 10
Z anglického ekvivalentu Dynamic Transportation Problem.
5.2
Dynamická dopravní úloha s celkovým přepravovaným množstvím
5.2.1
55
Popis řešeného problému
Účastníky dopravního problému jsou dodavatelé a odběratelé. Mějme tedy m dodavatelů D1 , . . . , Dm a n odběratelů O1 , . . . , On . Jejich úkolem je přepravit homogenní materiál od dodavatelů k odběratelům. Doba přepravy mezi každým dodavatelem a odběratelem je známa. V těchto požadavcích se úloha shoduje s klasickou dopravní úlohou, popsanou v podsekci 3.9.1. Avšak oproti předcházejícímu modelu zde existuje více rozdílů. První spočívá v tom, že zde je optimalizačním kriteriem co nejkratší celková doba přepravy.11 Dílčí doby trvání přepravy mezi jednotlivými dodavateli a odběrateli jsou s ohledem na algorimus řešení kladná celá čísla. Dalším rozdílem je fakt, že v tomto typu modelu nejsou dány celkové kapacity dodavatelů resp. pořadavky odběratelů. Účastníci přepravy jsou limitováni maximální denní kapacitou materiálu, kterou jsou schopni odeslat, popřípadě požadavky, které jsou schopni přijmout. Ta se může v jednotlivých dnech měnit, přičemž po určité době se pravidelně opakuje. Doba, po které se kapacity dodavatelů resp. požadavky odběratelů pravidelně opakují (např. týden), bude nazývána časový úsek. Časový úsek (týden) se skládá z časových jednotek (dní). Dále je dáno celkové množství materiálu, které má být přepraveno. V průběhu přepravy nesmí u odběratelů docházet k nahromadění více materiálu, než jsou schopni v příslušné časové jednotce zpracovat. 5.2.2
Návrh řešení problému
Optimalizačním kriteriem modelu DTP je přeprava materiálu od dodavatelů k odběratelům v co nejkratším celkovém čase. Idea řešení vychází z následující myšlenky: maximalizujeme-li při daném množství materiálu přepravu za jeden časový úsek (např. týden) a tento plán rozepisujeme tak dlouho, dokud existuje materiál určený k převozu, doba potřebná k přepravě materiálu bude minimální. Ačkoli se tedy jedná o dopravní úlohu, primárně sestavený model bude maximalizačního typu. Hledanými proměnnými jsou odesílané (resp. přijímané) množství materiálu odeslaného v k-té časové jednotce od dodavatele Di k odběrateli Oj , které jsou značeny xi,j,k 12 . Má-li úloha celkem m dodavatelů, n odběratelů a r časových jednotek v jednom časovém úseku, potom bude obsahovat celkem m · n · r proměnných. Koeficienty účelové funkce ci,j,k budou mít všechny stejnou hodnotu 1, potom účelovou funkci zapíšeme jako zmax =
m X n X r X
xi,j,k .
(46)
i=1 j=1 k=1
V modelu se budou vyskytovat omezující podmínky dvojího typu. Prvním typem jsou omezení dodavatelů. Zde je třeba vzít v potaz fakt, že nesmí být odesláno 11
Důvodem pro minimalizaci doby přepravy může být např. fakt, že přepravovaný materiál rychle podléhá zkáze. 12 Toto značení platí pouze pro metodiku, v dalších modelech se může lišit, nicméně v každém modelu budou proměnné definovány.
56
5
NÁVRH VLASTNí METODIKY
více materiálu, než je limit příslušného dodavatele i pro danou časovou jednotku bi,?,k 13 . To znamená, že v modelu bude celkem m · r omezujících podmínek na straně dodavatelů. Od dodavatele lze materiál odeslat k libovolnému odběrateli, takže pro i-tého dodavatele a k-tou časovou jednotku bude omezující podmínka definována: xi,1,k + xi,2,k + . . . + xi,j,k + . . . + xi,n,k ≤ bi,?,k
(47)
Sestavit omezující podmínky odběratelů je poněkud složitější. Musí platit, že nesmí být přijato více materiálu, než je požadavek odběratele v dané časové jednotce. Avšak doba trvání přepravy od dodavatelů je různá, což je třeba vzít v úvahu. Proto bude omezující podmínka j-tého odběratele v k-té časové jednotce vypadat následovně: x1,j,K + x2,j,K + . . . + xi,j,K + . . . + xm,j,K ≤ b?,j,k ,
(48)
kde K je doba odeslání materiálu vypočítaná dle vzorce K = [k − d(i, j)] mod r,
(49)
kde d(i, j) je doba přepravy materiálu mezi i-tým dodavatelem a j-tým odběratelem, r je počet časových jednotek jednoho časového úseku. Těmito omezujícími podmínkami zajístíme již v době odeslání, že odběrateli bude dovezeno právě takové množství materiálu, které nepřekračuje jeho denní limit v příslušné časové jednotce. Část vzorce mod r popisuje zbytek po celočíselném dělení. Vyřešením úlohy získáme maximální množství materiálu, které jsme během jednoho časového úseku schopni přepravit. Nyní, s ohledem na požadavek co nejrychlejšího ukončení přepravy, budeme ze všech optimálních řešení, garantujících přepravení stejného množství materiálu budeme hledat to z nich, u kterého je doba přepravy mezi dodavateli a odběrateli minimální. Pro tento krok použijeme lexikografickou metodu. Matematický model upravíme přidáním nové omezující podmínky garantující přepravované množství materiálu v časovém úseku: m X n X r X
∗ xi,j,k = zmax ,
(50)
i=1 j=1 k=1
∗ kde zmax je hodnota účelové funkce optimálního řešení předchozího modelu. Přidáním nové omezující podmínky redukujeme množinu přípustných řešení na ta řešení, která byla v původní úloze optimální. Ostatní řešení se stanou nepřípustnými. Přípustnost úlohy je zajištěna, neboť požadujeme řešení, kterého je možné za daných podmínek dosáhnout. Změníme typ a koeficienty účelové funkce:
zmin =
m X n X r X i=1 j=1 k=1
13
d(i, j) · xi,j,k ,
Symbol ? v indexu znamená všechny účastníky, v tomto případě odběratele.
(51)
5.3
Dynamická dopravní úloha s dílčími limity přepravovaného množství
57
kde d(i, j) je stejně jako v přechozím případě doba přepravy materiálu mezi i-tým dodavatelem a j-tým odběratelem. Získané řešení představuje maximum, které lze přepravit během jednoho časového úseku, přičemž ze všech těchto řešení bylo vybráno to s nejmenší celkovou časovou náročností. Pro vyřešení celé přepravy je nutné řešení reprezentující jeden časový úsek rozepsat. Začneme materiálem odeslaným od dodavatelů v den, který je označen jako začátek přepravy, přičemž plán přepravy bude odpovídat optimálnímu řešení modelu pro příslušnou časovou jednotku. Zbývající celkové množství materiálu snížíme o materiál, který byl v daném dni odeslán. Do dne, který odpovídá dni odeslání zvýšenému o dobu přepravy mezi příslušným dodavatelem a odběratelem, zapíšeme dodaný materiál a o tuto hodnotu snížíme celkové požadované množství materiálu. Pokračujeme dalším dnem tak dlouho, dokud je celkové zbývající množství materiálu k přepravě kladné. Jakmile klesne na nulu, výpočet ukončíme. Celkovou dobu přepravy určíme jako rozdíl mezi dnem posledního dodání a prvního odeslání materiálu.
5.3
Dynamická dopravní úloha s dílčími limity přepravovaného množství
V této sekci bude nejprve popsán řešený problém včetně rozdílů mezi klasickou dopravní úlohou a modelem DTP. Následně budou navrženy metody jeho řešení včetně způsobu otestování optimality získaného řešení. Pro popisovaný model byla zvolena zkratka DTPN. 5.3.1
Popis modelu DTPN
Jsou dáni účastníci přepravy: m dodavatelů D1 , . . . , Dm a n odběratelů O1 , . . . , On . Jejich úkolem je přepravit homogenní materiál od dodavatelů k odběratelům. Doba přepravy mezi každým dodavatelem a odběratelem je známa, je to kladné celé číslo. Každý z dodavatelů má určenu jak svou maximální denní kapacitu (resp. kapacitu za časovou jednotku), tak i celkovou kapacitu materiálu, který má být odeslán. Zatímco celkové kapacity zůstávají neměnné, denní kapacity se mohou v jednotlivých časových jednotkách časového úseku měnit. Totéž platí i pro požadavky odběratelů, u kterých jsou dány jak požadavky pro jednotlivé dny, tak i celkové požadavky na materiál, který má být dodán. Stejně jako v modelu DTP, nesmí při převozu dojít k nahromadění většího množství materiálu, než jsou schopni odběratelé v příslušné časové jednotce zpracovat. V souvislosti s problémem vyváženosti úlohy je dán požadavek, že alespoň jedna strana přepravy musí být plně uspokojena. V případě, že je součet kapacit dodavatelů menší než součet požadavků odběratelů, bude veškerý materiál odvezen, avšak někteří z odběratelů nebudou uspokojeni. V opačném případě nebude odvezen veš-
58
5
NÁVRH VLASTNí METODIKY
kerý materiál který je k dispozici, ale všichni odběratelé budou uspokojeni. Z tohoto pohledu bude mít řešená úloha vždy přípustné řešení. 5.3.2
Rychlý algoritmus úlohy DTPN dávající přípustné řešení
S pomocí tohoto algoritmu získáme přípustné řešení úlohy. Důvodem pro jeho uvedení je mimo jiné i požadavek na nalezení přípustného řešení v dále popsaných modelech. Toto řešení bude následně vylepšováno. Myšlenka nalezení přípustného řešení je poměrně jednoduchá: v každém dni odešlu maximální množství materiálu tak, aby všechny omezující podmínky byly splněny. U omezujících podmínek dodavatelů to není problém, neboť k odesílání dochází právě v daném dni. U odběratelů budou jejich požadavky sníženy o materiál nacházející se na cestě od dodavatelů. Pro maximalizaci denně odeslaného množství materiálu sestavíme jednoduchý matematický model k-tého dne, který následně popíšeme. Bude obsahovat celkem m · n proměnných, kde m je počet dodavatelů a n odběratelů. Proměnné xi,j,k budou popisovat množství materiálu, odeslané od i-tého dodavatele j-tému odběrateli ktý den přepravy. Všechny koeficienty účelové funkce ci,j budou mít hodnotu 1 a úloha bude maximalizační (hledáme řešení, které maximalizuje odeslané množství materiálu ve zvoleném dni), tj. zmax =
m X n X
xi,j,k .
(52)
i=1 j=1
V modelu se budou vyskytovat následující typy omezujících podmínek: • Od každého z dodavatelů nesmí být odesláno více než je jeho maximální denní limit, celkem m omezujících podmínek. • Žádnému z odběratelů nesmíme v jeden den dopravit více materiálu, než je jeho maximální limit pro tento den. Protože je doba přepravy různá (maximálně může trvat až r časových jednotek), sestavíme nejvýše n · r omezujících podmínek14 . • Nesmí být překročeny celkové limity odběratelů, celkem n omezujících podmínek.15 Prvním typem omezujících podmínek je m omezujících podmínek, týkajících se dodavatelů. Každá z nich vyjadřuje, že nesmí být odesláno více materiálu, než je limit pro k-tý den, proto omezení i-tého dodavatele bude zapsáno ve tvaru xi,1,k + xi,2,k + . . . + xi,j,k + . . . + xi,n,k ≤ bi,?,k , 14
(53)
Sestavujeme jen ty omezující podmínky, které mohou reálně nastat. Omezující podmínky popisující celkové limity dodavatelů nejsou sestavovány, protože tyto limity jsou brány v úvahu při sestavování omezujících podmínek týkajících se dodavatelů v jednotlivých dnech. 15
5.3
59
Dynamická dopravní úloha s dílčími limity přepravovaného množství
kde bi,?,k je příslušný denní limit i-tého dodavatele v k-tém dni převozu a symbolem „?ÿ je myšlen libovolný odběratel. Zde je třeba upozornit, že pokud celkové zbývající množství materiálu je menší než příslušný denní limit i-tého dodavatele bi,?,k , bude pravá strana příslušného omezení touto hodnotou nahrazena. S omezujícími podmínkami na straně odběratelů je situace poněkud složitější, neboť jejich denní limity již mohou být sníženy o materiál, který byl odeslán příslušnému odběrateli v předchozích dnech od některého z dodavatelů (s výjimkou dne zahájení přepravy, kdy tato situace nenastane). Proto je nejprve nutné zjistit maximálni dobu přepravy r, dle vzorce r = max {d(i, j)} ,
(54)
kde d(i, j) je doba trvání přepravy mezi i-tým dodavatelem (i = 1, . . . , m) a j-tým odběratelem (j = 1, . . . , n). Materiál byl odeslán v jednom dni, ale k odběratelům bude dopraven v průběhu nejvýše r dní. Proto bude sestaveno nejvýše n · r omezujících podmínek popisujících tyto dny. Ve skutečnosti však budou sestavována jen ta omezení, ve kterých může být materiál odeslaný v k-tém dni reálně dodán. Omezující podmínka, popisující limit j-tého odběratele s doručením materiálu za k + p dní od jeho odeslání, kde 1 ≤ p ≤ r, bude vyjádřena: a1,j · x1,j,k + . . . + ai,j · xi,j,k + . . . + am,j · xm,j,k ≤ b?,j,k+p −
r X
xi,j,k+p−l ,
(55)
l=1
kde xi,j,k+p−l je materiál dodaný od i-tého dodavatel j-tému odběrateli l dní před dnem dodání k + p a strukturní koeficienty ai,j nabývají hodnoty 1, jestliže d(i, j) = p, ai,j = (56) 0 jinak. Omezující podmínky má smysl sestavovat pouze pro ty hodnoty p, které se vyskytují v matici doby trvání přepravy. Posledním typem omezení jsou celkové limity odběratelů. Omezující podmínka, limitující celkové odeslané množství materiálu j-tého odběratele v k-tém dni, bude sestavena podle vzorce: x1,j,k + . . . + xi,j,k + . . . + xm,j,k ≤ B?,j −
k−1 X
x?,j,q ,
(57)
q=1
kde výraz B?,j reprezentuje celkové požadavky j-tého odběratele a výraz
k−1 P
x?,j,q
q=1
množství materiálu odeslaného od libovolného dodavatele j-tému odběrateli. Vyřešení modelu pro jeden den (jednu časovou jednotku) ovlivní pravé strany modelu v dalších dnech (časových jednotkách). Model je sestavován a řešen tak
60
5
NÁVRH VLASTNí METODIKY
dlouho, dokud není veškerý disponibilní materiál odvezen od dodavatelů, resp. dokud není odběratelům přivezen všechen materiál, který požadují. S pomocí tohoto algoritmu získáme přípustné řešení popisované úlohy. Tato metoda byla pracovně nazvána fast. 5.3.3
Pomalá verze řešení úlohy DTPN, bez ověření optimality řešení
U zde popisovaného algoritmu bude oproti předchozímu sestaven model pro celou dobu přepravy. Problémem je, že doba přepravy není známa. Proto bude nejprve nalezeno přípustné řešení a na základě doby přepravy získaného řešení bude sestaven matematický model. Pro nalezení přípustného řešení bude použit algoritmus popsaný v podsekci 5.3.2. Sestavovaný model bude obsahovat celkem m · n · (q + r) strukturních proměnných, kde symboly m a n odpovídají značení z předchozícho modelů, q je počet dní, kdy se bude materiál odvážet, a r maximální doba přepravy mezi dodavateli a odběrateli. Je nutné, aby q bylo natolik velké, aby byl tento čas dostačující pro nalezení přípustného a případně i optimálního řešení modelu. To zaručí např. použití algoritmu popsaného v podsekci 5.3.2. Model bude mít opět maximalizační účelovou funkci ve tvaru zmax =
q+r m X n X X i=1 j=1 k=1
(q + r − k + 1) · xi,j,k .
(58)
Koeficient účelové funkce ci,j,k = (q + r − k + 1) zaručuje, že cena odváženého materiálu bude s každým dnem klesat o jednotku. Simplexový algoritmus v takto formulovaném modelu zajistí odvoz maximálního množství materiálu co nejdříve po zahájení přepravy, čímž nepřímo dojde ke zkrácení doby potřebné k přepravě. Omezující podmínky modelu budou opět několika typů, celkem jich bude model obsahovat m · q + n · (q + r) + m + n. Prvních m · q omezujících podmínek hlídá maximální denní odeslané množství materiálu. Omezující podmínku popisující itého dodavatele v k-tém dni, kdy materiál odesíláme, zapíšeme dle vzorce n X j=1
xi,j,k ≤ bi,?,k .
(59)
Dalších n·(q+r) omezujících podmínek zaručuje nepřekročení maximálního množství materiálu dodaného v jednom dni, pro j-tého odběratele v k-tém dni ji zapíšeme jako m X i=1
xi,j,K ≤ b?,j,k ,
(60)
kde K je doba odeslání materiálu, vypočítaná dle vzorce K = k − d(i, j).
(61)
5.3
Dynamická dopravní úloha s dílčími limity přepravovaného množství
61
Následuje sestavení m omezujících podmínek zaručujících, že za celé období nebude odesláno více materiálu, než má příslušný dodavatel k dispozici, tj. nepřekročení celkového limitu i-tého dodavatele zapíšeme jako q+r n X X j=1 k=1
xi,j,k ≤ Bi,? ,
(62)
kde Bi,? je celková kapacita i-tého dodavatele. Posledních n omezujících podmínek zaručuje, že v průběhu celého období nedojde k nepřekročení požadavků na dodaný materiál. Pro j-tého odběratele bude omezující podmínka zapsána ve tvaru q+r m X X i=1 k=1
xi,j,k ≤ B?,j .
(63)
Ačkoli výsledky jsou oproti algoritmu popsanému v podsekci 5.3.2 neporovnatelně lepší, ani v tomto modelu nelze ověřit, že nalezené řešení je optimální. Nevýhodou algoritmu je poměrně rychle rostoucí čas výpočtu při zvětšující se velikosti řešeného modelu. Popisovaná metoda byla nazvána slow. 5.3.4
Algoritmus nalézající optimální řešení
Z důvodu uvedeného v posledním odstavci podsekce 5.3.3 byl navržen poslední algoritmus. Sestavení matematického modelu se do značné míry shoduje s modelem popsaným v podsekci 5.3.3, z toho důvodu budou popsány jen rozdíly mezi oběma modely. Výhodou tohoto modelu je, že na něm lze otestovat optimalitu získaného řešení. Podobně jako v předchozím modelu je nutné odhadnout dobu přepravy. Je ale nutné, aby odhadovaná doba přepravy, pro kterou je model sestavován, byla větší nebo rovna optimální době přepravy. V opačném případě nebude mít model přípustné řešení. Pro odhad doby přepravy bude použita metoda fast, popsaná v podsekci 5.3.2. Ta tento požadavek garantuje. Omezující podmínky modelu definované ve vzorcích (59)–(63), budou použity také v současném modelu. Dále bude přidána nová omezující podmínka, která zaručuje přepravení daného množství materiálu, podle vzorce ( m ) q+r m X n X n X X X xi,j,k = min Bi,? , B?,j . (64) i=1 j=1 k=1
i=1
j=1
Model je tedy sestaven, s výjimkou účelové funkce. Cílem je minimalizovat dobu odeslání materiálu. Idea nalezení optimálního řešení a testování jeho optimality je následující: Model je sestaven pro q + r dnů, avšak materiál je odesílán prvních q dnů. Účelovou funkci, která bude maximalizační, sestavíme tak, že proměnné reprezentující
62
5
NÁVRH VLASTNí METODIKY
prvních q − 1 dnů budou mít koeficienty účelové funkce 1 a proměnné reprezentující q-tý až q + r-tý den koeficienty 0. Tuto úlohu vyřešíme. Pokud úloha má přípustné řešení a zároveň se hodnota účelové funkce rovná výrazu ( m ) n X X ∗ zmax = min Bi,? , B?,j , (65) i=1
j=1
pak počet dní přepravy odpovídající q dnům není optimem, protože existuje přípustné řešení, které odešle veškerý materiál v méně než q dnech (a to bylo právě nalezeno). V případě, že řešení je přípustné a zároveň platí nerovnice ( m ) n X X ∗ zmax < min Bi,? , B?,j , (66) i=1
j=1
pak počet dní přepravy odpovídající q dnům je optimem, protože neexistuje přípustné řešení, které by bylo schopno přepravit materiál v méně než q dnech. To proto, že koeficienty v účelové funkci mají hodnotu 1 u proměnných reprezentujících prvních q − 1 dní a součet množství převezeného materiálu je menší, než má být reálně převezeno. Pokud nalezené řešení není optimální, tj. platí výraz (65), provedeme následující úpravu modelu: koeficientům reprezentujícím q-tý až q + r-tý den nastavíme prohibitivní sazbu −M , a koeficentům pro q − 1-ní den koeficienty 0. Pro takto upravený model se dosažené řešení stane nepřípustným, proto jej znovu vyřešíme. Takto pokračujeme, dokud nenalezneme řešení, které splňuje výraz (66). Toto řešení je optimální, přičemž doba potřebná k odeslání veškerého materiálu je rovna indexu dne odeslání proměnných majících koeficient účelové funkce rovný nule. Pokud bychom chtěli minimalizovat dobu dodání místo doby odeslání, budeme postupovat analogicky, pouze změny v číslování koeficientů účelové funkce budeme provádět s ohledem na den dodání materiálu, namísto dne odeslání. Při vlastním výpočtu není nutné při snižování počtu kroků řešit pokaždé upravenou úlohu celou znovu. Stačí v právě řešené úloze změnit typ proměnných v q-tém dni na umělé a nastavit jim prohibitivní sazbu −M a proměnným v q−1. dni nastavit koeficienty účelové funkce rovny 0. Dále je nutné u proměnných, které jsou bazické, změnit toto nastavení i u vektoru koeficientů účelové funkce bazických proměnných, a takto modifikovanou úlohu dořešit. Tato modifikace umožní nezanedbatelné urychlení výpočtu, jak je popsáno ve vlastní práci. Je ale možná pouze v softwaru vlastní výroby, protože zde dochází ke změnám přímo uvnitř simplexového algoritmu. To žádný známý komerční software neumožňuje. Popisovaná metoda byla nazvána optimal.
6
VLASTNí PRÁCE
6
63
Vlastní práce
Stěžejní část vlastní práce spočívá v aplikaci metod navržených ve vlastní metodice, jejich otestování a praktické ukázce jejich využití. Tvorba softwarové podpory byla nezbytná pro ověření řešitelnosti navržených algoritmů. Vytvořené programy jsou k dispozici na přiloženém CD ve složce programy. Zdrojové kódy nejsou součástí disertační práce. Případní zájemci si o ně mohou požádat na e-mailové adrese
[email protected]. Aby bylo možné splnit definované cíle práce, bylo nutné vytvořit balík knihoven schopných řešit úlohy lineárního programování. Tyto knihovny budou využity při řešení speciálních typů dopravních úloh popsaných v kapitole 5. První vytvořenou knihovnou je datova struktura.pas. V ní byly definovány strukturované datové typy potřebné při řešení úloh lineárního programování simplexovou metodou. Dále byla vytvořena knihovna simplexka.pas využívající datovou strukturu z předcházející knihovny, do níž byly implementovány procedury a funkce, řešící dílčí kroky při optimalizaci úloh lineárního programování. Následovala knihovna export.pas, jejímž úkolem je převádět modely z implementovaného datového typu do zvoleného formátu, např. TEX, Excel, Lingo či jiného. Poslední knihovnou je knihovna testy.pas. Společně s knihovnou export.pas byla využívána výhradně pro hromadné testování správného řešení náhodně vygenerovaných modelů. V následujících podkapitolách budou tyto knihovny popsány podrobněji.
6.1
Knihovna datova struktura.pas
Před tvorbou libovolné knihovny je nutné vytvořit její datovou strukturu. Prvním krokem bylo vytvoření strukturovaného datového typu Tumela a definice jeho aritmetických operací. Při výpočtu se v simplexové tabulce vyskytuje v koeficientech účelové funkce umělých proměnných a v indexním řádku u indexních čísel. Vlastní datový typ je reprezentován dvěma proměnnými datového typu real48 – prohibitivní sazbou a reálnou hodnotou dané proměnné, viz řádky 2 a 3 zdrojového kódu. Z čistě programátorských důvodů byly do datového typu přidány ještě pomocné proměnné typ (řádek 4), reprezentující typ proměnné, basic (řádek 5) datového typu boolean nabývající hodnoty true či false podle toho, zda je daná proměnná bazická či nikoli. Poslední proměnnou je x (řádek 6) datového typu integer, kde je v případě bazických proměnných uchován index řádku s jedničkou a u nebazických proměnných index klíčového řádku. 1 2 3 4 5 6
Tumela = record M: real48; { prohibitivní sazba } r: real48; { skutečná hodnota } typ: Ttyppromenne; { typ proměnné - strukturní, doplňková a umělá } basic: boolean; { bazická nebo nebazická proměnná } x: integer; { řádek s 1 u bazických, resp. klíčový řádek u nebazických }
64
6
VLASTNí PRÁCE
7 8 9 10 11 12 13
{ definice operátorů } class operator Equal(A, B: Tumela): boolean; // = class operator Equal(A: Tumela; B: real): boolean; // = class operator Equal(A: real; B: Tumela): boolean; // = . .. end; Po definici proměnných v datovém typu Tumela následuje definice aritmetických a relačních operátorů. Velkou výhodou je možnost další práce přímo s aritmetickými či relačními operátory i pro datový typ Tumela. Takže např. pro sčítání tří proměnných a, b a c datového typu Tumela stačí nadefinovat operátor pro sčítání (Add) a dále již jejich součet běžně zapisovat jako a + b + c. Identicky budou nadefinovány i další potřebné operátory. Tím dojde ke značnému zpřehlednění zdrojového kódu, neboť při absenci této vlastnosti by bylo nutné pro každou operaci se strukturovaným datovým typem vytvořit vlastní funkci. Součet proměnných a, b a c by se potom zapisoval následovně: soucet(soucet(a,b),c).
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
class operator Tumela.Add(A, B: Tumela): Tumela; // + begin result.M := A.M + B.M; result.r := A.r + B.r; end; class operator Tumela.Add(A: Tumela; B: real): Tumela; // + begin result.M := A.M; result.r := A.r + B; end; class operator Tumela.Add(A: real; B: Tumela): Tumela; // + begin result.M := B.M; result.r := A + B.r; end; Při definování aritmetických a relačních vlastností operátorů bylo využito přetěžování a každý operátor byl definován ve třech verzích. V první verzi byly vstupními proměnnými dvě proměnné typu Tumela, ve druhé byla první proměnná datového typu Tumela a druhá reálného datového typu, ve třetí tomu bylo naopak. Tím došlo ke značnému zjednodušení zdrojového kódu programu, neboť bylo umožněno provádět operace s různými datovými typy. Takto byly definovány všechny relační operátory, tj. ≤, <, =, > a ≥. Z aritmetických operátorů byly definovány operace sčítání, odčítání a násobení. Ukázka zdrojového kódu operátoru součtu Add je k dispozici na řádcích 14–28. Ve vlastní knihovně se nachází v části implementation.
6.2
Knihovna simplexka.pas
65
Nyní bylo možné nadefinovat datový typ TLPproblem, obsahující veškeré informace o řešené úloze lineárního programování. Jeho zdrojový kód je k dispozici na řádcích 29–35. Protože je zdrojový kód podrobně okomentován, není nutné se o tomto datovém typu podrobněji rozepisovat. 29 30 31 32 33 34 35
TLPproblem = record c: Tucfce; { vektor koeficientů účelové funkce, typu Tumela } A: Tstrkoef; { matice strukturních koeficientů rozměru m × n } relace: Trelace; { vektor relací ≤, =, ≥ } B: Tpravestrany; { vektor pravých stran omezujících podmínek, typu real48 } typ: Ttypulohy; { typ úlohy: zmax , zmin } end; Datový typ TLPproblem je vhodný pro uložení vlastní obecné úlohy LP, nicméně pro její řešení vhodný není. Proto byl vytvořen datový typ TLPcanonicalform, reprezentující úlohu lineárního programování v kanonickém tvaru. V ní, na rozdíl od identické úlohy v obecném tvaru, již nejsou potřeba relační operátory. Dále je nově přidán vektor koeficientů účelové funkce bazických proměnných c b a vektor indexních čísel delta. Dále je zde přidána proměnná Z datového typu Tumela, obsahující hodnotu účelové funkce daného řešení, a booleovská proměnná pripustne informující, zda je dané řešení přípustné.
36 37 38 39 40 41 42 43 44 45
TLPcanonicalform = record c: Tucfce; { vektor koeficientů účelové funkce, typu Tumela } A: Tstrkoef; { matice strukturních koeficientů } c b: Tucfce; { vektor koeficientů úč. fce baz. proměnných, typu Tumela } B: Tpravestrany; { vektor pravých stran omezujících podmínek, typu real48 } delta: Tindexniradek; { vektor indexních čísel, typu Tumela } Z: Tumela; { hodnota účelové funkce na daném kroku } typ: Ttypulohy; { typ úlohy: zmax , zmin } pripustne: boolean; { test přípustnosti daného řešení } end; Posledním strukturovaným datovým typem v knihovně je Treseni obsahující informace o nalezeném řešení. V datovém typu Treseni se nachází booleovská proměnná pripustne, nabývající hodnoty true v případě, že obsažené řešení je přípustné, a false v opačném případě. Dále se zde vyskytuje celočíselná proměnná kroku obsahující počet kroků nutných k nalezení příslušného řešení. Následuje vektor x, což je jednorozměrné pole obsahující datový typ real48. V něm jsou uloženy hodnoty všech strukturních proměnných, včetně nulových.
6.2
Knihovna simplexka.pas
Přehled veškerých procedur a funkcí této knihovny je k dispozici na obrázku 7 na straně 66. Protože se algoritmus řešení úloh LP simplexovou metodou v podstatných
66
6
VLASTNí PRÁCE
aspektech neodlišuje od notoricky známého postupu, budou při popisu jednotlivých podprogramů knihovny simplexka.pas zmíněny pouze jejich vstupy a výstupy a nejdůležitější části zdrojového kódu, popisující podstatnou či problematickou část zdrojového kódu programu. Protože jsou níže uvedené podprogramy velmi často součástí jiných podprogramů, resp. jsou uvnitř cyklu či na jiných místech programu, nelze jednoznačně určit jejich „logické pořadíÿ. Proto jsou uváděny a popisovány tak, jak se vyskytují ve zdrojovém kódu programu. První definovanou funkcí je sumproduct, vracející skalární součin dvou vektorů reálných čísel. Pokud mají oba vektory rozdílný počet složek, funkce vrací nulu. Procedura delta má jeden vstupně/výstupní parametr obsahující příslušný krok řešení úlohy lineárního programování v kanonickém tvaru. Výstupem procedury je proměnná lpc datového typu TLPcanonicalform, včetně indexních čísel dané úlohy. unit simplexka.pas function sumproduct(A, B: array of real48): real48; procedure delta(var lpc: TLPcanonicalform); function kanonicky tvar(lp: TLPproblem): TLPcanonicalform; function kriterium optimality(lpc: TLPcanonicalform): boolean; function zmen bazi(lpc: TLPcanonicalform; pivot: Tsouradnice): TLPcanonicalform; function klicovy radek(lpc: TLPcanonicalform; sloupec: integer): Tsouradnice; function klicove policko necyklici(lpc: TLPcanonicalform): Tsouradnice; function klicove policko(lpc: TLPcanonicalform): Tsouradnice; function vyresit ulohu LP(lp: TLPproblem; var reseni: Treseni): boolean;
Obr. 7: Procedury a funkce knihovny simplexka.pas. Zdroj: vlastní práce.
Následuje funkce kanonicky tvar. Vstupním parametrem je úloha lineárního programování, výstupním identická úloha v kanonickém tvaru. Před vlastním převodem do kanonického tvaru je nutné správně určit počet všech proměnných v modelu (tj. strukturních, doplňkových a umělých). Algoritmus určení jejich počtu je uveden na řádcích 46–49 zdrojového kódu, celkový počet všech proměnných úlohy je obsažen v proměnné pom. 46 47
pom := length(lp.c) + length(lp.relace); for i := low(lp.relace) to high(lp.relace) do
6.2
48 49
Knihovna simplexka.pas
67
if lp.relace[i] = GE then inc(pom); Počet strukturních proměnných je neměnný a odpovídá délce vektoru koeficientů účelové funkce. Navíc každá omezující podmínka typu ≤, resp. = má jednu doplňkovou či umělou proměnnou, omezení typu ≥ dvě. Proto je na řádku 46 do proměnné pom přiřazen součet počtu proměnných a omezujících podmínek, zvýšený o počet omezení typu ≥, viz řádky 47–49. Po identifikaci rozměrů upravené úlohy dojde k nastavení velikosti polí a převedení úlohy z obecného tvaru do kanonického. Následně je volána funkce delta a jsou spočítána indexní čísla, přičemž dojde k vrácení úlohy v kanonickém tvaru. Úkolem funkce kriterium optimality je pouze rozhodnout, zda je nalezené řešení optimální či nikoli. Funkce vrací hodnotu true v případě, že je nalezené řešené optimální, jinak vrací hodnotu false. Funkce zmen bazi má dva parametry. Prvním je datový typ TLPcanonicalform obsahující příslušný krok úlohy LP. Druhým je Tsouradnice obsahující souřadnice klíčového políčka. U této funkce je třeba zmínit ošetření potenciálních chyb vzniklých při výpočtu. Příčinou problému jsou nenulová pole vyskytující se v bázi, vzniklá vlivem zaokrouhlování. Důsledkem neošetření této chyby jsou špatně nalezená optimální řešení, resp. nečekané zacyklení. Problém je ošetřen na řádku 53 a podrobně popsán v podsekci 6.2.3.
50 51 52 53 54 55 56
pom := -1; . .. for j := low(lpc.c) to high(lpc.c) do if abs((pom * lpc.A[pivot.i, j] + lpc.A[i, j])) < epsilon then lpc.A[i, j] := 0 else lpc.A[i, j] := pom * lpc.A[pivot.i, j] + lpc.A[i, j]; Po změně báze dle klíčového políčka je uvnitř funkce zmen bazi aktualizován indexní řádek voláním funkce delta a následně otestováno, zda je nově získané řešení přípustné. Vstupními parametry funkce klicovy radek jsou kanonický tvar úlohy LP a index klíčového sloupce. Funkce vrací souřadnice klíčového políčka v proměnné datového typu Tsouradnice. V případě, že v úloze existují dva či více minimálních podílů, vrací ten s nižším indexem. Pro stabilitu programu je velmi důležitá funkce klicove policko necyklici. Jde o aplikaci Blandova algoritmu, popsaného v podsekci 3.6.4. Je volána jen tehdy, pokud je při standardním výběru klíčového políčka celková změna účelové funkce nulová a zabraňuje zacyklení programu. Z toho důvodu je na řádcích 57–78 vypsán kompletní zdrojový kód této funkce. Funkce vybírá jako klíčový ten sloupec porušující test optimality, který má nejmenší index. Tím u degenerovaných úloh zabraňuje vzniku zacyklení. Pro určení klíčového řádku je volána funkce klicovy radek a takto
68
6
VLASTNí PRÁCE
získané souřadnice klíčového políčka jsou výstupem jak funkce klicovy radek, tak i funkce klicove policko necyklici. 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
function klicove policko necyklici(lpc: TLPcanonicalform): Tsouradnice; var j: integer; souradnice: Tsouradnice; begin { nastaví souřadnice mimo pole } souradnice.i := -1; souradnice.j := -1; { maximalizační úloha } if lpc.typ = MAXIM then begin for j := low(lpc.c) to high(lpc.c) do if souradnice.j = -1 then if (lpc.delta[j] < 0) and not(lpc.c[j].basic) then souradnice := klicovy radek(lpc, j) end else { minimalizační úloha – analogicky jako maximalizační } ... { vrací souřadnice } result := souradnice; end; U funkce klicove policko dochází nejprve k hledání toho klíčového sloupce, který nejvíce porušuje test optimality. Následně je na řádku 87 testována celková změna účelové funkce. Pokud je nulová (může dojít k zacyklení), je volána funkce klicove policko necyklici, viz řádek 88. Vývojový diagram je podrobně popsán na obrázku 6, strana 54. Ve skutečnosti však není testována nulová změna účelové funkce, nýbrž celková změna menší než ε. Je to ze stejného důvodu jako u funkce zmen bazi.
79 80 81 82 83 84 85 86 87 88
const epsilon = 0.000000001; { tolerance zaokrouhlovacích chyb } ... implementation ... function klicove policko(lpc: TLPcanonicalform): Tsouradnice; ... { při nulové změně účelové funkce vybírám podle necyklícího algoritmu } if abs((podil * lpc.delta[souradnice.j].r)) < epsilon then souradnice := klicove policko necyklici(lpc);
6.2
Knihovna simplexka.pas
69
Poslední funkcí je vyresit ulohu LP. Je zastřešující funkcí celé knihovny a spouští se se dvěma parametry. Její hlavička je zapsána i v části interface, tzn. je použitelná i mimo knihovnu. Funkce se skládá ze dvou částí: v první části dochází k hledání optimálního řešení, ve druhé k jeho výpisu. Jakým způsobem je hledáno optimální řešení, je zřejmé z řádků 89–95. Jde o cyklus, při němž je na začátku nalezeno klíčové políčko a následně podle něj změněna báze. Pro ukončení cyklu je podstatné nalezení optimálního řešení, resp. zjištění, že daná úloha je neohraničená či nemá optimální řešení. Na začátku hledání jsou obě souřadnice klíčového políčka nastaveny na hodnotu −1, přičemž dochází k jejich přepisování. V případě, že klíčový sloupec či řádek není nalezen, zůstává index klíčového řádku roven −1. To je podmínkou pro ukončení cyklu, viz řádek 91. 89 90 91 92 93 94 95
repeat pivot := klicove policko(lpc); if pivot.i = -1 then konec := true else lpc := zmen bazi(lpc, pivot); until konec; Funkce vrací hodnotu true v případě, že nalezené řešení je přípustné. Dále je v parametru reseni obsažen vektor optimálního řešení problému. 6.2.1
Export modelů do Linga
Protože Ústav statistiky a operačního výzkumu vlastní časově neomezenou verzi Extended Lingo 13 včetně možnosti řešení celočíselných a nelineárních modelů, byla do knihovny simplexka.pas implementována možnost exportu řešených modelů do jazyka programu Lingo. Ta bude využita zejména při testování knihovny a ověřování správnosti výsledků. Samotný export je řešen pomocí dvou funkcí. První, model2lingo, převede matematický model uložený v proměnné datového typu TLPproblem do textového řetězce datového typu string, druhá zapis model LINGO tento textový řetězec zapíše do souboru. Uvnitř funkce model2lingo byla vytvořena pomocná funkce real2string, která převádí jednotlivé koeficienty modelu z datového typu real48 na textový řetězec. Při převodu dochází k zaokrouhlení převáděné hodnoty na 8 desetinných míst a k nahrazení desetinné čárky desetinnou tečkou, jak vyžaduje program Lingo. Po spuštění funkce model2lingo nejprve dojde k vypsání typu modelu a koeficientů účelové funkce, následně dochází k výpisu jednotlivých omezujících podmínek. Celý model je vypsán do proměnné string, která tvoří výstup funkce. Úkolem funkce zapis model lingo je zapsat matematický model zadaný na vstupu do určeného souboru. Po spuštění je volána funkce model2lingo a její výstup zapsán
70
6
VLASTNí PRÁCE
do textového řetězce, který je následně uložen do zvoleného souboru. Ukázka modelu převedeného pomocí funkce model2lingo je na obrázku 8.
Obr. 8: Matematický model převedený do jazyka programu Lingo. Zdroj: vlastní práce.
Aby bylo možné použít převod modelů do jazyka programu Lingo i mimo vývojové prostředí Delphi, byl vytvořen dávkový soubor nazvaný lp2lingo.exe. Spouští se se dvěma parametry: vstupním parametrem je soubor s matematickým modelem, výstupním soubor, do kterého bude uložen identický model ve formátu programu Lingo. 6.2.2
Export modelů do TEXu
Důvod pro implementaci této funkce byl ryze praktický, umožnit rychlý zápis libovolného matematického modelu ve formátu pro TEX. Mimo disertační práci lze export do TEXu využít v pedagogické praxi, např. při přípravě přednášek a cvičení, resp. při sazbě skript. Za tímto účelem byla vytvořena konzolová aplikace lp2tex.exe spouštěná se dvěma parametry: vstupním souborem obsahujícím matematický model a výstupním souborem s tím samým modelem ve formátu pro TEX. Výhodou konzolové aplikace je její univerzální použitelnost a možnost dávkového zpracování souborů. Ukázka výstupu do TEXu je k dispozici v levé části obrázku 11 na straně 79. 6.2.3
Testování knihovny simplexka.pas
Před dalším použitím knihovny simplexka.pas v praxi bylo nutné provést její otestování. Byly náhodně vygenerovány různé typy modelů s rozdílným počtem proměnných. U každého takto testovaného modelu byl zkoumán počet iterací nutných k nalezení optimálního řešení (resp. zjištění neexistence přípustného řešení), čas výpočtu a hodnota účelové funkce. Vektor nalezeného řešení z důvodu možné existence více optimálních řešení testován nebyl. Dále byl každý model vyexportován do Linga a v něm také vyřešen, přičemž byly porovnány hodnoty účelové funkce řešení z knihovny simplexka.pas a z Linga. V případě jejich shody byl model považován za správně vyřešený. Generování modelů a jejich řešení probíhalo automaticky, pro
6.2
Knihovna simplexka.pas
71
tento účel byla vytvořena knihovna testy.pas. Pro každý typ testované úlohy byla vytvořena procedura, která tyto modely automaticky vygenerovala, vyřešila a řešení zapsala do předem určeného souboru. Pro určování klíčového políčka byl použit jak Blandův, tak i modifikovaný Blandův algoritmus a byly srovnány počty kroků potřebné k nalezení řešení. Dále byl ke každému vygenerovanému modelu vytvořen identický model pro Lingo, v němž došlo k verifikaci správnosti nalezeného řešení. Při testování bylo nejprve náhodně vygenerováno 100 přiřazovacích problémů16 o rozměrech 5 × 5, 10 × 10, . . . , 30 × 30. U každého z nich byl zjišťován počet kroků potřebný k nalezení optimálního řešení (s pomocí Blandova a Modifikovaného Blandova algoritmu), hodnota účelové funkce získaného řešení a čas, potřebný k jeho nalezení. Po dokončení testování došlo ke 100% shodě v nalezené hodnotě účelové funkce mezi výstupem knihovny simplexka.pas a Lingem. V závislosti na použitém způsobu volby klíčového políčka se však lišil počet kroků potřebných k nalezení optimálního řešení a tím i čas výpočtu. V drtivé většině případů byl počet kroků potřebných k nalezení optimálního řešení u modifikovaného Blandova algoritmu výrazně nižší než u klasického Blandova algoritmu, v průměru o 50 %. Nejprve byla otestována závislost mezi časem výpočtu a počtem kroků. Pro srovnatelnost údajů byly porovnávány stejně velké úlohy. Zde u všech typů testovaných úloh vycházel pro oba způsoby řešení korelační koeficient r > 0,999. Víceméně se jedná o funkční závislost, nevysvětlená část modelu je způsobena různě dlouhou dobou přístupu k datům na harddisku testovacího PC. Následně byl pro každý rozměr úloh zvlášť otestován rozdíl dvou středních hodnot v počtu kroků u Blandova a modifikovaného Blandova algoritmu. Cílem bylo otestovat, zda má počet kroků normální rozdělení a následně provést párový test. Byla testována hypotéza H0 : náhodná veličina představující počet kroků potřebný k nalezení optimálního řešení má normální rozdělení, oproti alternativní hypotéze H1 : výše uvedená náhodná veličina normální rozdělení nemá. Souhrnné údaje o výsledcích testů normality jsou uvedeny v tabulce 5. Pro testování normality byl zvolen Shapirův-Wilkův test, na hladině významnosti α = 0,05. Za normální je nadále považováno rozdělení, u kterého na 5% hladině významnosti nedojde k zamítnutí nulové hypotézy. Následně je ověřován předpoklad o shodě dvou středních hodnot, přičemž je stanovena jednostranná hypotéza H0 : počet kroků je u modifikovaného Blandova algoritmu větší nebo roven počtu kroků Blandova algoritmu, oproti alternativní hypotéze H1 : počet kroků je u modifikovaného Blandova algoritmu menší než u Blandova algoritmu. V případě normality rozdělení náhodné veličiny počtu kroků u obou algoritmů je pro testování použit dvouvýběrový t-test. V opačném případě je použit neparametrický Wilcoxonův test. Výsledky testů shody dvou středních hodnot jsou k dispozici v tabulce 6. 16
Důvodem pro testování na přiřazovacích problémech je fakt, že každý přiřazovací problém má přípustné a tudíž i optimální řešení a že tyto úlohy mají silný sklon k zacyklení. Také je možné tyto úlohy velmi jednoduše náhodně generovat.
72
6
VLASTNí PRÁCE
Tab. 5: Výsledky testování normality počtu kroků řešení u přiřazovacích problémů. Zdroj: vlastní práce. Rozměry 5×5 10 × 10 15 × 15 20 × 20 25 × 25 30 × 30
Algoritmus modif. Blandův Blandův modif. Blandův Blandův modif. Blandův Blandův modif. Blandův Blandův modif. Blandův Blandův modif. Blandův Blandův
Shapirův-Wilkův W -test W -stat. p-hodn. H0 : 0,976 0,067 nezamítám 0,983 0,228 nezamítám 0,984 0,284 nezamítám 0,977 0,071 nezamítám 0,970 0,021 zamítám 0,983 0,227 nezamítám 0,975 0,057 nezamítám 0,975 0,054 nezamítám 0,964 0,009 zamítám 0,967 0,013 zamítám 0,960 0,004 zamítám 0,984 0,287 nezamítám
Testování shody 2 středních hodnot párový t-test párový t-test Wilcoxonův test párový t-test Wilcoxonův test Wilcoxonův test
Tab. 6: Výsledky testování shody dvou středních hodnot pro počet kroků přiřazovacích problémů. Zdroj: vlastní práce.
Rozměry 5×5 10 × 10 15 × 15 20 × 20 25 × 25 30 × 30
párový t-test t-stat. p-hodn. H0 : −17,29 < 0,001 zamítám −14,73 < 0,001 zamítám −16,12 < 0,001 zamítám
Wilcoxonův test U -stat. p-hodn. H0 :
−8,634 < 0,001
zamítám
−8,656 < 0,001 −8,583 < 0,001
zamítám zamítám
Jak z tabulky 6 vyplývá, u všech testovaných úloh bez ohledu na jejich rozměr existuje statisticky vysoce významný rozdíl v počtu kroků potřebných k nalezení optimálního řešení. Protože byl proveden jednostranný test, lze tvrdit, že modifikovaný Blandův algoritmus potřebuje k nalezení optimálního řešení tohoto typu úloh méně kroků než Blandův algoritmus. Z testovaných modelů vycházel počet kroků v průměru poloviční. Vzhledem k tomu, že zde existuje funkční závislost mezi počtem kroků a dobou výpočtu algoritmu (r > 0,999), lze tvrdit, že tento typ úloh je modifikovaný Blandův algoritmus schopen vyřešit v polovičním čase. Po otestování přiřazovacích problémů bylo na místě si položit otázku, jakým způsobem se chová modifikovaný Blandův algoritmus u jiných typů úloh. Byly tedy nagenerovány další typy úloh, řešitelné simplexovým algoritmem. Dalším testovaným typem úloh byly dopravní úlohy. Zde již bylo generování poněkud složitější. Bylo náhodně vygenerováno a oběma popisovanými způsoby vyřešeno celkem 600 dopravních úloh. Rozměry úlohy, tj. počty dodavatelů a odběra-
6.2
73
Knihovna simplexka.pas
telů byly tentokrát také generovány náhodně. Parametry náhodně vygenerovaných dopravních úloh jsou uvedeny v tabulce 7. Tab. 7: Parametry náhodně generovaných dopravních úloh. Zdroj: vlastní práce.
min 2 2 1 10 10
Počet dodavatelů Počet odběratelů Koeficienty účelové funkce Kapacity dodavatelů Požadavky odběratelů
max 30 30 100 500 500
Všechny náhodně vygenerované úlohy byly oběma způsoby vyřešeny správně, řešení byla kontrolována Lingem. Opět, jako u předcházejícího typu úloh, zde existuje funční závislost mezi počtem kroků a časem řešení (r > 0,999). Co je však překvapivé, je srovnání počtu kroků. Zatímco u přiřazovacího problému se počet kroků modifikovaného Blandova algoritmu pohyboval kolem 50 % kroků Blandova algoritmu, na zde řešených modelech je to pouze 9,6 % počtu kroků! To je již velice výrazné zlepšení. Srovnání počtu kroků u obou metod v závislosti na počtu proměnných je k dispozici na obrázku 9. 2500 b
b b
2000 b b b
počet kroků
b
1500
b b
b b
b
1000
b b
b
b b b
b b
b b b
bb
b b b b bb b bb b b b b b b b b b b b bb b b b b b b b b b b b b b b b b b b b b b b b bb b b b b b b b b b b b b b b b b b b b b b b b bb b b b b b b b b b b b bb b b b b bb b b b b b b b b bb bb bb b b b b b b b b bb b b bb bb b bb bb bb b b bb b b bb b b b b b bb bb bb bb b bb b bb b b bbb bb b b b b bb b b b b b bb b bb bb b bbb b b b b bb bb b b b b b b b b b bb bb b b bb b b b b
0 b
100
b b b b bb b b b bb b b b b b bb bb bb b b b b b bb b b b b b
b
b
b b b bb b b b b bb b b
b b bb b bb bb b b b b b b bb b b b b b bb b b bb bb
b b b b b b b b b bb b b b b b b b b b bb b b b b b b b b b b b b b b b b b b bb b b b bb b b
b
bb b b b
b
b
b
b b
b b b bb b b b b bb b b b b b b
b bb b b
b b
b
b b b b b bb b b b b b b b b bb bb b bb b bb bb bb bb b
b b
b b
b
b
b b b bb b
b b bb
b
b b b
b b bb b b b b b b bb b bb b bbb b b b b b
b
b b b b bb b bb b b b bb b bb b bb b b b bb bb b b b b b
200
Blandův algoritmus
b
bb b b b
b b b b b
b b
b b b
b
b b
b b
b
b
b
bb
bb b
b
b b
bb
b
b b
b b b bb
300
b b b
b
b
b
bb b b
b bb
b
b b
b b
b
bb b b
b
b
b b b b b
b
b
b b
b
bb
b b
b b
b
b
b b
b
b b
b b
b
b
b b
b
b
b
b
b b
b b
b b
b b
b
b
bb
b b
b b
b b
b
b b b b
b b
b
b b
b b
b
b bb b b bb
b
b b b
b b b
b b
b b
b
b
bb
b
b b bb
b b b bb bb b b
bb bb
b b
b b
b
b b
b b
500
b
b
b b b bb b
b b
b b
b b
b b b
0
b
b b
bb b b b b bb b bb bb b bb b b bb bb b b bb b bb bb b b bb b b bb b b b b
b b b b
b bbb b b b b b b
bb b b b b b b b b bb bb bb bb bb b bb b bb
b b b bb b
bb
400 500 počet proměnných b
bb bb b
b
b bb bb bb bb b
bb
b
b
b b b bb
600
b
bb b
bb
bb bbb b
700
b
b bb
bb b
b
b bb b
b
800
b
900
modifikovaný Blandův algoritmus
Obr. 9: Srovnání počtu kroků Blandova a modifikovaného Blandova algoritmu při řešení dopravních úloh. Zdroj: vlastní práce.
Posledním testovaným typem úloh byly běžné úlohy lineárního programování. Důležitost otestování spočívá ve faktu, že u předcházejících typů úloh se v matici strukturních koeficientů vyskytovaly pouze jedničky či nuly. Důvodem pro testování
74
6
VLASTNí PRÁCE
byla jejich náchylnost k zacyklení. Zde se budou v matici strukturních koeficientů vyskytovat i jiné hodnoty než nuly či jedničky, takže bude otestována i přesnost výpočtů. Největším problémem bylo nagenerování úloh, které mají přípustné řešení. Tento problém byl vyřešen následovně: Předpokládejme, že máme k dispozici úlohu LP, která má všechny strukturní koeficienty nezáporné. Dále, pokud se jedná o maximalizační úlohu, má všechny omezení typu ≤ a pokud jde o úlohu minimalizační, jsou všechna omezení typu ≥. Pravé strany omezujících podmínek jsou pochopitelně nezáporné. Tato úloha má vždy přípustné řešení, přičemž v některých případech může být úloha neohraničená. Pro testování byly generovány právě tyto typy úloh. Podrobné parametry jsou popsány v tabulce 8. Dále je třeba zmínit, že pravděpodobnost vygenerování minimalizační úlohy je stanovena na 50 % a počet nulových hodnot v matici strukturních koeficientů byl stanoven na 55 %. Původně byl stanoven na 15 %, nicméně při této hustotě obsazení matice byly vygenerované úlohy v drtivé většině případů neohraničené, což znemožňovalo vlastní testování. Tab. 8: Parametry náhodně generovaných úloh LP. Zdroj: vlastní práce.
Počet proměnných Počet omezujících podmínek Hodnoty strukturních koeficientů Hodnoty koeficientů účelové funkce Hodnoty pravých stran omezujících podmínek
min 5 5 1 1 100
max 105 45 300 100 500
V průběhu testování došlo k odhalení závažného problému zapříčiněného zaokrouhlováním a způsobem ukládání čísel ve dvojkové soustavě. Při aritmetických operacích s proměnnými datového typu real48 docházelo k malým nepřesnostem, které způsobovaly, že při změně báze v jednotlivých iteracích nedošlo ke skutečnému vynulování některých polí matice strukturních koeficientů. Pole, která měla být nulová, měla hodnotu velmi blízkou nule. Při následném určování klíčového políčka proto byly také vybírány jako potenciální kandidáti. U některých větších úloh z tohoto důvodu docházelo i přes použití Blandova necyklícího algoritmu k zacyklení, u jiných k nenalezení optimálního řešení. K odstranění problému došlo až vynulováním těchto polí. Je realizováno ve funkci zmen bazi, kde je v průběhu výpočtu každá buňka matice strukturních koeficientů porovnávána s konstantou ε = 0,000000001. Pokud je absolutní hodnota v příslušném políčku menší než ε, je zapsána nula. Tato úprava je popsána na 53. řádku zdrojového kódu na straně 67. Během testů bylo náhodně vygenerováno celkem 110 úloh. Prvních 100 úloh odpovídá parametrům z tabulky 8, u úloh s pořadovými čísly 101–110 byly horní limity pro generování stanoveny u počtu proměnných na 500 a u počtu omezení na 200. Další zpracování úloh již bylo společné. Při testování správnosti nalezeného řešení došlo celkem u 4 úloh k nalezení rozdílné hodnoty účelové funkce (konkrétně u úloh s pořadovým číslem 6, 10, 35 a 82). To bylo způsobeno tím, že úloha je
6.2
75
Knihovna simplexka.pas
neohraničená, a proto nelze nalézt optimální řešení. Tudíž se nejedná o chybu, ale o vlastnost modelu. Všechny zbývající úlohy byly ohraničené a nalezené řešení se shodovalo s řešením získaným v Lingu. Při srovnání počtu kroků potřebného k nalezení optimálního řešení bylo u modifikovaného Blandova algoritmu potřeba cca. 36 % kroků původního Blandova algoritmu. Ukázka textového souboru s řešením náhodně vygenerovaných úloh LP je k dispozici na obrázku 10. Z_MIN Z_MAX Z_MAX Z_MAX Z_MAX
= = = = =
119,923967960 82,2058721669 184,451987349 487,816196929 812,744882061
kroků: kroků: kroků: kroků: kroků:
208 6 49 165 140
čas: čas: čas: čas: čas:
00.108 00.001 00.011 00.073 00.031
prom: prom: prom: prom: prom:
17 8 25 104 74
omezeni: omezeni: omezeni: omezeni: omezeni:
40 34 31 21 15
Obr. 10: Část textového souboru obsahujícího řešení náhodně vygenerovaných úloh LP.
Tyto výsledky bylo nutno ještě statisticky verifikovat. Pracovní hypotézy jsou stanoveny identicky jako při testování přiřazovacích problémů. Výsledky testů normality pro dopravní úlohy a obecné úlohy LP jsou uvedeny v tabulce 9, výsledky testování shody dvou středních hodnot v tabulce 10. Tab. 9: Testování normality rozdělení počtu kroků řešení u dopravních úloh a běžných úloh LP. Zdroj: vlastní práce.
Typ úlohy Algoritmus Dopravní modif. Blandův úloha Blandův modif. Blandův Úloha LP Blandův
Shapirův-Wilkův W -stat. p-hodn. 0,794 < 0,001 0,675 < 0,001 0,493 < 0,001 0,417 < 0,001
W -test H0 : zamítám zamítám zamítám zamítám
Test shody dvou středních hodnot Wilcoxonův test Wilcoxonův test
Jak je vidět, hypotéza H0 : počet kroků má normální rozdělení, byla ve všech 4 případech zamítnuta. Důvodem je fakt, že na rozdíl od předcházejících modelů se ve zde testovaných modelech nacházel různý počet proměnných, z čehož vyplýval různý počet kroků potřebných k nalezení optimálního řešení. Proto byl pro testování shody dvou středních hodnot použit neparametrický Wilcoxonův test. Tab. 10: Testování shody dvou středních hodnot počtu kroků řešení u dopravních úloh a běžných úloh LP. Zdroj: vlastní práce.
Typ úlohy Dopravní úloha Obecná úloha LP
Wilcoxonův test U -stat. p-hodn. H0 : −21,221 < 0,001 zamítám −9,017 < 0,001 zamítám
U obou typů testovaných modelů byla zamítnuta hypotéza H0 ve prospěch alternativní hypotézy H1 , tj. byl prokázán statisticky vysoce významný rozdíl v počtu kroků mezi modifikovaným Blandovým algoritmem a Blandovým algoritmem.
76
6
VLASTNí PRÁCE
Modifikovaný Blandův algoritmus je pro tyto typy úloh vhodnější než Blandův algoritmus. Všechny testované úlohy jsou k dispozici na přiloženém CD, ve složce testovaci priklady/simplexova metoda. Na základě výše uvedených výsledků lze shrnout, že u všech typů testovaných úloh byl prokázán statisticky vysoce významný rozdíl v počtu kroků ve srovnání obou algoritmů. Tedy, že je při hledání klíčového políčka výhodnější použít modifikovaný Blandův algoritmus, i když zcela nepochybně existují úlohy, u kterých je počet kroků Blandova algoritmu nižší než u modifikovaného Blandova algoritmu. Jak však bylo prokázáno, jde o výjimku, nikoli pravidlo. Důvodem pro modifikaci Blandova algoritmu byla snaha o zrychlení výpočtu. Protože má modifikovaný Blandovův algoritmus statisticky významně nižší počet kroků potřebných k nalezení řešení, v dalších aplikacích bylo klíčové políčko určováno výhradně tímto způsobem. Jeho algoritmizace je navíc jednodušší než např. Charnesova perturbační metoda popisovaná v teoretické části.
6.3
Optimalizace krmných směsí
6.3
77
Optimalizace krmných směsí
Ačkoli tato část není přímo definována v cíli práce, je na místě zde zmínit, že knihovna simplexka.pas je po drobné modifikaci používána ve výrobním podniku pro optimalizaci krmných směsí. Pro podnik zabývající se výrobou (mícháním) krmných směsí je minimalizace nákladů při jejich výrobě životně důležitým faktorem. Proto se při rozhodování, které suroviny a v jakém množství budou do krmiva namíchány, běžně využívá optimalizace. Charakter řešeného problému umožňuje sestavit matematický model popisovaného problému, který je řešitelný pomocí metod lineárního programování. Tato speciální úloha lineárního programování se nazývá směsný problém a je popsaný v sekci 3.8. S ohledem na výše uvedené vlastnosti řešeného problému a předpokládané zkušenosti s danou problematikou byl Ústav statistiky a operačního výzkumu zkontaktován externí firmou vyvíjející podnikové informační systémy s požadavkem, zda je reálná implementace optimalizačního algoritmu řešícího směšovací problém do informačního systému. Po úvodních konzultacích, kdy byl upřesňován požadovaný výstup, bylo dohodnuto, že část informačního systému přímo se týkající optimalizace bude vytvořena na Ústavu statistiky a operačního výzkumu Provozně ekonomické fakulty Mendelovy univerzity. Konkrétní název firmy vyvíjející informační systém a podniku, který si tento informační systém objednal, nebude z konkurenčních důvodů zmíněn. Informační systém zmiňovaného podniku je vyvíjen v Microsoft Dynamics NAV, spíše známého pod jménem Navision. Vzhledem k tomu, že platforma Navision není vhodná pro náročné výpočty, bylo dohodnuto alternativní řešení, kde celý proces optimalizace bude rozdělen do dvou částí. Zpracování dat, sestavení modelu a interpretace výsledků bude zajištěna přímo v rámci informačního systému podniku a vlastní výpočty pomocí simplexové metody budou provedeny pomocí dávkově spustitelného *.exe souboru, který bude uložen v přesně určeném adresáři v rámci informačního systému. Toto řešení je výhodné i z důvodu, že vlastní program pro optimalizaci krmných směsí mohl být vytvořen v programovacím jazyce Delphi stejně jako ostatní části disertační práce. 6.3.1
Vlastní program pro optimalizaci krmných směsí
Vlastním programem spouštěným přímo informačním systémem je program (konzolová aplikace) vytvořený v Delphi. Při výpočtech je spouštěn se zadanými parametry, kterými jsou vstupní soubor obsahující matematický model v požadovaném formátu (tento model je výstupem informačního systému) a soubor s optimálním řešením úlohy LP (ten bude naopak výstupem konzolové aplikace a vstupem do informačního systému). Vlastní program může být spouštěn parametricky z příkazové řádky, resp. přímo externími programy. To je velmi důležitý požadavek zejména proto, že informační systém program spouští automaticky pokaždé, když potřebuje vyřešit matematický model (tj. nalézt optimální poměr vstupů při míchání krmné směsi) bez nutnosti jakéhokoli dalšího zásahu uživatelů.
78
6
VLASTNí PRÁCE
Program je vytvořen tak, aby byl dávkově spustitelný se dvěma parametry: krmiva.exe vstup výstup, kde krmiva.exe je název souboru obsahujícího vlastní program, vstup je název souboru s matematickým modelem krmné směsi (případně včetně cesty k souboru) a výstup je název souboru, kam se ukládá optimální řešení (opět je možné zadat název souboru včetně cesty). Po spuštění programu dojde k načtení modelu, jeho vyřešení a zapsání optimálního řešení úlohy do souboru uvedeného v proměnné výstup. Zde je třeba upozornit na dvě skutečnosti: v případě, že již existuje výstupní soubor se stejným jménem (který je například řešením některé z předcházejících úloh), je automaticky přepsán novým souborem, a dále, pokud nemáme přístupová práva do složky (složek) souboru s řešením, optimální řešení modelu nebude uloženo. K ověření přípustnosti nalezeného řešení slouží návratová hodnota (takzvaný exitcode) programu. Jestliže optimální řešení nalezeno bylo, vrací program po svém ukončení hodnotu exitcode = 0, pokud optimální řešení nalezeno nebylo (například z důvodu, že řešená úloha nemá přípustné řešení), vrací exitcode = 1. Je potom již na pracovnících vyvíjejících informační systém, aby ověřili, která z omezení nesplňují požadavky a zdali tato nesplnění jsou závažného charakteru či nikoli. (Kdy např. nesplnění některého z omezení v řádu setin procent lze v některých případech ignorovat a považovat za splněné.) 6.3.2
Vstupní data a jejich formát
Vzhledem k rozdělení procesu optimalizace do dvou částí (vlastní informační systém a program optimalizující model) bylo nutné vyřešit způsob jejich komunikace. Bylo dohodnuto, že sestavený matematický model bude uložen informačním systémem přímo do zvoleného adresáře. Z něj bude vyvíjenou aplikací načten a vyřešen, přičemž řešení modelu bude, taktéž v dohodnutém formátu, uloženo do určené složky, načteno informačním systémem a dále zpracováváno. Za korektní sestavení matematického modelu je zodpovědná osoba, která má na starosti míchání krmiv. To provede přímo v informačním systému. Program tento model vyřeší a vrátí výsledné řešení v dohodnutém formátu zpět do informačního systému. Vlastní formát pro ukládání matematických modelů vychází ze dvou požadavků. Prvním je textový formát dat a druhým jeho jednoduchost a možnost tvorby či editace modelu bez dodatečných požadavků na speciální software. Jaký je tedy formát dat? První řádek má jen informační význam a není dále zpracováván. Může tedy obsahovat jakýkoli text. Z druhého řádku se do modelu načítá typ úlohy. Ačkoli je na místě argument, že v rámci směšovacího problému budou řešeny pouze minimalizační typy úloh, byla s ohledem na fakt, že byl modifikován program obecně řešící libovolné úlohy lineárního programování, tato alternativa ponechána. U maximalizačních typů úloh obsahuje druhý řádek textový řetězec Z max, u minimalizačních řetězec Z min, přičemž není nutné rozlišovat mezi malými a velkými písmeny. Třetí řádek v pořadí obsahuje koeficienty účelové funkce. Ty jsou odděleny tabulátory (v ASCII kódu znak #9) a ukončeny
6.3
79
Optimalizace krmných směsí
znakem pro konec řádku (protože program je vytvořen v prostředí Windows, jde o dvojici symbolů CR-LF, v ASCII kódu zastoupená znaky #13#10). Následuje 4. řádek informující o faktu, že bude následovat načítání vlastních omezujících podmínek (pro vlastní model nemá žádný význam a stejně jako první řádek je i tento pouze načten a již není dále zpracováván). Od 5. řádku až do konce souboru se na každém řádku nachází jedna vlastní omezující podmínka ve tvaru strukturní koeficienty, relace, pravá strana omezující podmínky. Oddělovačem je stejně jako v případě účelové funkce znak tabulátor. V tomto místě je vhodné upozornit na případy, kdy je zvolený strukturní koeficient či koeficient účelové funkce nulový. S ohledem na jednoduchý přenos modelu do, resp. z MS Excelu je možné (nikoli však nutné) namísto nulových hodnot uvádět u příslušných koeficientů prázdné řetězce oddělené tabulátory. Nulovou hodnotu koeficientu pak poznáme jako dva tabulátory vedle sebe, viz např. 3. omezující podmínka modelu zobrazeného na obrázku 11. Ukázka matematického modelu v obecném tvaru a identický model v popisovaném formátu je k dispozici na obrázku 11. Výhodou tohoto formátu je především jeho univerzálnost. Je velmi jednoduché vzít jakýkoli model a v libovolném textovém editoru či tabulkovém procesoru jej rychle a s relativně malou pracností upravit do popisovaného formátu. Protože je program pro optimalizaci krmných směsí určen do českého prostředí, je oddělovačem desetinných míst desetinná čárka (namísto desetinné tečky charakteristické pro programy určené do anglického prostředí).
zmax =
10x1 − 57x2
− 9x3 − 24x4
0,5x1 − 5,5x2 − 2,5x3 + 9x4 0,5x1 − 1,5x2 − 0,5x3 + x4 x1 x1 , x2 , x3 , x4
≤ ≤ ≤ ≥
0 0 1 0
[Účelová funkce] ␔ Z MAX ␔ 10 ␚ -57 ␚ -9 ␚ -24 [Omezující podmínky] ␔ 0,5 ␚ -5,5 ␚ -2,5 ␚ 9 ␚ 0,5 ␚ -1,5 ␚ -0,5 ␚ 1 ␚ 1 ␚ ␚ ␚ ␚ ␔
␔ <= ␚ 0 ␔ <= ␚ 0 ␔ <= ␚ 1 ␔
Obr. 11: Matematický model a jeho zápis ve vstupním formátu programu. Zdroj: vlastní práce.
Ve vstupním formátu modelu se nikde nenachází informace o rozměrech modelu, tj. počtu strukturních proměnných a omezujících podmínek. Tato informace je nezbytná pro korektní načtení modelu, ale je zjišťována nepřímo. Počet strukturních proměnných je zjišťován na základě počtu tabulátorů v 1. omezující podmínce (tj. z 5. neprázdného řádku souboru) před prvním výskytem některého ze znaků <, =, >, počet omezujících podmínek na základě celkového počtu neprázdných řádků v souboru, snížených o čtyři. Při načítání modelu je jakýkoli prázdný řádek ignorován. Ačkoli popisovaný formát není absolutně imunní vůči špatnému načtení modelu při nekorektním formátu dat, byl po konzultacích s pracovníky vyvíjejícími informační systém shledán jako dostatečně odolný, neboť modely budou sestavovány přímo v informačním systému. Nicméně riziko nekorektního načtení existuje u modelů sestavovaných ručně.
80 6.3.3
6
VLASTNí PRÁCE
Výstupní data
S ohledem na fakt, že získané optimální řešení bude dále zpracováváno informačním systémem, bylo nutné dohodnout formát výstupu z programu pro optimalizaci krmných směsí (a vstupu do vyvíjeného informačního systému). Opět byl kladen důraz na jednoduchost. Výstupem programu je textový soubor s hodnotami optimálního řešení všech strukturních proměnných (včetně nulových), vypsaných po řádcích s přesností na 8 desetinných míst. Oddělovačem desetinných míst je opět desetinná čárka, matematický formát čísel není povolen. 6.3.4
Modifikace knihovny simplexka.pas
Původní knihovna simplexka.pas byla pro řešení směšovacích problémů použitelná, nicméně bylo nutné ji modifikovat tak, aby byla schopna importovat a exportovat modely ve formátech popsaných v částech 6.3.2 a 6.3.3. Procedury a funkce, které bylo nutné nově vytvořit, jsou k dispozici na obrázku 12. Jejich úkolem je vyřešit korektní načtení matematického modelu, tisk vektoru nalezeného řešení a jeho zápis do určeného souboru. Dále jsou zde uvedeny pomocné funkce řešící dílčí problémy při načítání matematického modelu. unit simplexka.pas
function nacti ulohu(soubor: string): TLPproblem; function ToUpper(s: string): string; procedure nacti ucfci(s: string; var c: Tucfce); procedure nacti omezeni(s: string; var A: Tpravestrany; var relace: Trel; var B: real48); function to relace(s: string): Trel; function tiskni reseni(reseni: Treseni): string; procedure zapis reseni(soubor: string; reseni: Treseni);
Obr. 12: Nové funkce a procedury modifikované knihovny simplexka.pas. Zdroj: vlastní práce.
Jediným vstupním parametrem funkce nacti ulohu je textový řetězec string v proměnné soubor, obsahující název a případně i cestu k souboru s matematickým modelem. Výstupním parametrem funkce je strukturovaný datový typ TLPproblem, obsahující matematický model. Uvnitř funkce nacti ulohu jsou ještě definovány
6.3
Optimalizace krmných směsí
81
funkce ToUpper a dvě procedury nacti ucfci a nacti omezeni. Procedura ToUpper se použije při načítání typu účelové funkce. Textový řetězec se převede na velká písmena a následně porovná s textovým řetězcem Z MAX, viz řádek 96 zdrojového kódu. Pokud se textové řetězce rovnají, je typ úlohy nastaven jako maximalizační, v opačném případě program považuje úlohu za minimalizační. 96 97 98 99
if ToUpper(s) = ’Z MAX’ then lp.typ := MAXIM else lp.typ := MINIM; { cokoli jiného než ’Z MAX’ považuje za ’Z MIN’ } Načítání koeficientů účelové funkce a vlastních omezujících podmínek spočívá v rozdělení načítaného řádku do pole textových řetězců. Oddělovacím znakem při rozdělování je tabulátor. Následně jsou textové řetězce pomocí funkce strtofloat převedeny na desetinná čísla a uloženy do příslušného pole proměnné, která je datového typu TLPproblem. V hlavičce funkce nacti omezeni je ještě definována funkce to relace. Jejím úkolem je rozhodnout, jaký relační operátor bude mít právě načítaná omezující podmínka. Pokud se v načítaném textovém řetězci nachází znak = a zároveň nenachází znaky <, resp. >, potom považuje omezující podmínku za rovnici. Jestliže se v textovém řetězci vyskytuje znak >, bez ohledu na výskyt dalších znaků považuje omezení za nerovnici typu ≥, ve všech zbývajících případech za nerovnici typu ≤. Vlastní načítání probíhá ve dvou krocích. Nejprve jsou zjištěny rozměry řešené úlohy. Určení počtu proměnných je popsáno na řádcích 100–107. Nejprve je do proměnné s datového typu string načten 5. neprázdný řádek souboru s modelem. Následuje procházení textového řetězce obsaženého v proměnné s znak po znaku, až do nalezení některého ze symbolů <, =, >, viz podmínka v cyklu while na řádku 101. Zároveň je při každém výskytu znaku tabulátor (podmínka if, řádek 104) zvýšeno počítadlo proměnných prom na řádku 105.
100 101 102 103 104 105 106 107
{ počet proměnných = počtu tabulátorů před znakem < nebo = nebo > } while not((s[i] = ’=’) or (s[i] = ’<’) or (s[i] = ’>’) or (i = length(s)) ) do begin if s[i] = #9 then prom := prom + 1; i := i + 1; end; Počet omezujících podmínek je určen počtem neprázdných řádků v souboru snížených o 4, z nichž jsou řádky 2 informativní a 2 řádky s typem a koeficienty účelové funkce, viz obrázek 11. Na základě informace o rozměrech úlohy jsou nastaveny rozměry dynamických datových struktur a do nich potom načítány jednotlivé koeficienty. Při jejich načítání dochází k převodu z textového formátu dat na číselný.
82
108 109 110 111 112 113 114 115 116 117
6
VLASTNí PRÁCE
function tiskni reseni(reseni: Treseni): string; var i: integer; s: string; begin s := ”; for i := low(reseni.x) to high(reseni.x) do s := s + FormatFloat(’0.########’, reseni.x[i]) + #13#10; result := s; end; Funkce tiskni reseni, jejíž zdrojový je kód uvedený na řádcích 108–117, má za úkol zapsat řešení do textového řetězce typu string, který je výstupem této funkce. Jediným vstupním parametrem je proměnná reseni strukturovaného datového typu Treseni, obsahujícího jednorozměrné dynamické pole datového typu real48. Při výpisu proměnných dochází k procházení celého pole, viz cyklus for na řádku 114. Při každém průchodu cyklem dochází k převodu čísla z datového typu real48 na textový řetězec v požadovaném formátu, jeho přiřetězení k proměnné s a přidání znaku pro konec řádku, jak je vidět na řádku 115 zdrojového kódu. Převod na datový typ string je zajišťován funkcí FormatFloat, jejímž prvním parametrem je maska pro formátování čísel a druhým hodnota, která má být převedena na text. Výstup funkce je po ukončení cyklu for k dispozici v proměnné s. Poslední nepopisovanou funkcí v knihovně simplexka.pas je funkce zapis reseni. Jejími vstupními proměnnými jsou soubor (do kterého má být řešení zapsáno) a reseni. Uvnitř funkce zapis reseni je nejprve volána funkce tiskni reseni, jejíž výstup je uložen do souboru specifikovaného v proměnné soubor. 6.3.5
Program krmiva.pas
Zdrojový kód hlavní aplikace popisují řádky 118–145. Je krátký, protože všechny funkce, potřebné v hlavním programu, jsou k dispozici v knihovně simplexka.pas, popsané v kapitole 6.2. Po spuštění jsou načteny parametry – název a adresa vstupního souboru je uložena do proměnné input, výstupního do proměnné output na řádcích 130 a 131 zdrojového kódu. Na řádku 133 je ze vstupního souboru do proměnné lp, která je strukturovaného datového typu TLPproblem, načten matematický model obsahující kompletní úlohu lineárního programování. Na řádku 135 je spuštěna funkce vyresit ulohu LP. Má dva parametry: prvním je matematický model obsažený v proměnné lp, druhým vektor řešení úlohy, což je jednorozměrné dynamické pole datového typu real48. Návratová hodnota funkce je booleovského typu: vrací true v případě, že pro vstupní model bylo nalezeno optimální řešení, resp. false, pokud nalezené řešení není přípustné. Zároveň je podle hodnoty funkce vyresit ulohu LP přiřazen exitcode programu. Pokud bylo nalezeno optimální řešení modelu, má exitcode hodnotu nula. V opačném případě vrací exitcode hodnotu jedna. Poslední funkcí je zápis optimálního řešení do určeného souboru, realizovaný procedurou zapis reseni.
6.3
Optimalizace krmných směsí
83
Zápis má dva parametry: vektor hodnot strukturních proměnných nalezeného řešení a název souboru (případně i s adresou), do kterého bude nalezené řešení zapsáno. Protože se jedná o konzolovou aplikaci, je kód programu zapsán v chráněném bloku try – end mezi řádky 128–144 zdrojového kódu. Dojde-li při běhu programu k chybě, je vyvolána výjimka a vypsáno chybové hlášení, viz řádky 141–143. Toto ošetření potenciálních problémů přispívá k větší stabilitě programu. 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
program krmiva; {$APPTYPE CONSOLE} uses SysUtils, simplexka in ’simplexka.pas’; var input, output: string; { vstupní a výstupní soubor } lp: TLPproblem; { model LP } reseni: Treseni; { řešení modelu LP } begin try { z parametrů načte vstupní a výstupní soubor } input := ParamStr(1); output := ParamStr(2); { do proměnné LP načte model } lp := nacti ulohu(input); { vyřeší úlohu a vrací, zda jde o přípustné či nepřípustné řešení } if vyresit ulohu LP(lp, reseni) then exitcode := 0 else exitcode := 1; { zapíše řešení do souboru } zapis reseni(output, reseni); except on E: Exception do Writeln(E.ClassName, ’: ’, E.Message); end; end.
6.3.6
Hledání optimálního řešení při míchání krmných směsí
Jako ukázkový příklad pro hledání optimálního řešení při míchání krmných směsí byl zvolen příklad s 21 proměnnými a 34 omezujícími podmínkami. Matematický model řešeného problému je k dispozici v příloze A, identický model ve vstupním formátu pro aplikaci v příloze B.
84
6
VLASTNí PRÁCE
Jednotlivé hledané proměnné představují množství surovin, které budou použity při míchání krmné směsi. Údaje jsou uvedeny v procentech, jak vyplývá z poslední omezující podmínky, která garantuje, že součet procent použitých surovin dá hodnotu 100. Koeficienty účelové funkce představují ceny vstupních surovin. Omezující podmínky představují požadované množství látek, které se v krmné směsi musí vyskytovat. Dle typu omezující podmínky je to buď v minimálním, maximálním, pevně daném množství, resp. v daném intervalu. S ohledem na firemní tajemství není autorovi disertační práce známo, které suroviny se skrývají pod kterými proměnnými, ani která látka je limitována kterou omezující podmínkou. Dokonce mu nejsou známy ani koeficienty účelové funkce. Z toho důvodu není možné model podrobněji popsat. Avšak tato nevědomost, při předpokladu správně sestaveného modelu, není pro nalezení optimálního řešení modelu nezbytná. 0,41824672 ␔ 0,15237203 ␔ 0␔ 0,09040182 ␔ 0,11578147 ␔ 17,5 ␔ 5,09896047 ␔ 12 ␔ 12 ␔ 0␔ 12 ␔ 12 ␔ 0,4772 ␔ 0,0007875 ␔ 12 ␔ 12 ␔ 0,125 ␔ 0,26 ␔ 1,005 ␔ 1,25625 ␔ 1,5 ␔ Obr. 13: Optimální řešení úlohy ve výstupním formátu. Zdroj: vlastní práce.
Pro nalezení optimálního řešení bylo třeba 39 kroků, přičemž čas řešení byl v podstatě neměřitelný. Také proto, že počet proměnných je skutečně malý a jde o typ úlohy, která je poměrně jednoduše řešitelná. Optimální řešení úlohy je k dispozici na obrázku 13. Hodnota účelové funkce zmin = 18 041,035. Vzhledem k absenci podrobnějších informací o úloze není možné řešení dále komentovat.
6.3
Optimalizace krmných směsí
6.3.7
85
Praktické využití programu
Tento program je používán firmou zabývající se mícháním krmných směsí. Přestože je součástí informačního systému tohoto podniku, jeho zaměstnanci s ním přímo do styku nepřijdou, ten zprostředkovává výhradně informační systém. Dle informací zainteresovaných pracovníků podniku je denně hledáno optimální složení pro 20–30 různých typů krmných směsí. U každé z nich je nutné, aby byl program minimálně jednou spuštěn. O důležitosti programu pro podnik svědčí i jeho důkladné otestování koncovým uživatelem. Než byl firmou přijat, byly v něm vyřešeny desítky praktických problémů, které se v provozu vyskytují. Výsledky byly porovnávány s výsledky získanými jejich starým programem pro optimalizaci krmných směsí a dále byly autorem ověřovány v Lingu. Protože došlo ke 100% shodě v nalezených výsledcích, byl program firmou akceptován.
86
6.4
6
VLASTNí PRÁCE
Dynamická dopravní úloha s celkovým přepravovaným množstvím
Podstata problému již byla popsána v sekci 5.2. Pro vlastní řešení byla vytvořena knihovna dynamicka dopravni uloha.pas, přičemž bylo nutné dodefinovat pro tento typ úloh i datovou strukturu tak, aby tyto úlohy byly snadno algoritmizovatelné. Pro tento typ modelu bude v následujícím textu použita zkratka DTP. Její název vznikl z počátečních písmen sousloví Dynamic Transportation Problem, popisujícího charakteristickou vlastnost modelu. Protože se jedná o speciální případ úlohy lineárního programování, budou řešené úlohy DTP převedeny na běžné úlohy LP a vyřešeny. Následně budou vytvořeny procedury a funkce, které dané řešení rozepíší dle požadavků. 6.4.1
Nově definované datové struktury
Z důvodu přehlednosti zdrojového kódu bylo nutné definovat ke stávajícím datovým typům i některé nové datové typy. Byly definovány přímo v knihovně dynamicka dopravni uloha.pas. Jde o dva hlavní datové typy a několik dalších, které jsou použity uvnitř jednoho z těchto dvou hlavních. Prvním je TDTPproblem obsahující zadání matematického modelu, druhým datový typ Tglobal, který obsahuje kompletní informace o převozech v průběhu celé přepravy (tj. nalezené řešení). Vlastní datový typ TDTPproblem je kompletně popsán na řádcích 146–163. Na řádku 146 je matice dob trvání přepravy. Je to kombinace všech dodavatelů s odběrateli, reprezentovaná dvourozměrným polem datového typu integer. Pokud při řešení nějakého konkrétního reálného problému nejsou k dispozici celočíselné doby přepravy, lze celou matici bez újmy na obecnosti vynásobit vhodnou konstantou a dále zaokrouhlit na celá čísla, čímž dojde ke splnění podmínky celočíselnosti dob přepravy. Zároveň je ale nutné adekvátně upravit počet časových jednotek a jejich limity. Dodávané (řádek 147) a požadované (řádek 148) množství tvoří dvourozměrné matice reprezentující dodavatele v prvním a odběratele v druhém případě, v kombinaci s časovými jednotkami. Zde se již jedná o dvourozměrná pole obsahující reálné hodnoty, reprezentované datovým typem real48. Je také třeba připomenout, že kapacity, resp. požadavky se mohou v jednotlivých časových jednotkách lišit. Na řádcích 150–155 je definován datový typ popisující rozměry vlastního modelu. Je zde postupně určen počet dodavatelů, odběratelů a časových jednotek. Poslední položkou je zahájení – ve které časové jednotce došlo k zahájení přepravy. Pokud je např. počet časových jednotek 7 (reprezentující dny jednoho týdne) a hodnota položky zahájení je 3, znamená to, že přeprava byla zahájena 3. den týdne, tj. ve středu. 146 147 148 149
Tdoba dodani = array of array of integer; Tdodavane mnozstvi = array of array of real48; Tpozadovane mnozstvi = array of array of real48; { datová struktura dynamické dopravní úlohy }
6.4
150 151 152 153 154 155 156 157 158 159 160 161 162 163
Dynamická dopravní úloha s celkovým přepravovaným množstvím
87
TDTProzmery = record dodavatelu: integer; odberatelu: integer; casovych jednotek: integer; { pocet dni, po kterem opakuji } zahajeni: integer; { den zahajeni prepravy } end; { vlastní úloha, která bude později převedena na typ LP } TDTPproblem = record rozmery: TDTProzmery; prepravovane mnozstvi: real48; { celkové množství určené k přepravě } doba dodani: Tdoba dodani; dodavane mnozstvi: Tdodavane mnozstvi; pozadovane mnozstvi: Tpozadovane mnozstvi; end; Vlastní datová struktura TDTPproblem je popsána na řádcích 157–163. Obsahuje informaci o rozměrech úlohy, která je datového typu TDTProzmery (řádek 158), dále o celkovém množství, které má být přepraveno (ř. 159), dobu dodání (řádek 160), a nakonec dodávané a požadované množství v každé časové jednotce. Opět se jedná o dvourozměrná pole celočíselných hodnot. U dodávaného množství jsou rozměry určovány počtem dodavatelů v kombinaci s časovými jednotkami, u požadovaného množství jsou to odběratelé v kombinaci s časovými jednotkami.
164 165 166 167 168 169 170 171 172 173
{ rozpis jednotlivych přeprav } Trozpis = record preprava: array of array of array of real48; { dodavatel, odberatel, den } zbyva: array of real48; { kolik jeste zbyva prepravit materialu } end; { kompletní tabulka s rozepsanou přepravou } Tglobal = record odvezeno: Trozpis; privezeno: Trozpis; end; Pro uchování řešení problému DTP byla vytvořena datová struktura Tglobal17 (na řádcích 170–173), obsahující kompletní informace o odeslaném a přivezeném materiálu, uložené v datovém typu Trozpis. Ten je definován na řádcích 165–168, přičemž obsahuje trojrozměrné pole reálných hodnot, jehož rozměry odpovídají počtu dodavatelů, odběratelů a celkovému počtu časových jednotek nutných k přepravení vešketého materiálu18 . V případě, že se jedná o odeslané množství, reprezentuje pro17
Název Global vychází z faktu, že v proměnné bude obsaženo kompletní řešení daného problému. V komentáři na řádku 166 je sice uveden den, nicméně problém je vyřešen obecně pro libovolný počet časových jednotek – hodin, minut, či jakýkoli jiný. Komentář vznikal v průběhu programování modelu s ohledem autorovu na snadnější orientaci ve zdrojovém kódu. 18
88
6
VLASTNí PRÁCE
měnná den den odeslání, pokud jde o dodané množství, je v proměnné den uložen den dodání. Následuje jednorozměrný vektor reálných hodnot zbyva. Jeho rozměr odpovídá celkovému počtu časových jednotek (dní) přepravy v datovém typu preprava. U odvezeného materiálu reprezentuje množství, které zbývá odvézt, u přivezeného materiálu jde o množství, které zbývá přivézt. Z toho vyplývá, že ve stejné časové jednotce se hodnoty odeslaného a přivezeného materiálu mohou lišit, rozdíl je zapříčiněn materiálem na cestě. Údaje jsou vztaženy ke konci každé časové jednotky. Dále je nutné zmínit, že z důvodu přehlednějšího pojmenovávání proměnných byly provedeny drobné změny v knihovně datova struktura.pas. Provedené úpravy jsou popsány ve zdrojovém kódu na řádcích 174–187. 174 175 176 177 178 179 180 181 182 183 184 185 186 187
Tpromenna = record dodavatel: integer; { index dodavatele } odberatel: integer; { index odběratele } odeslani: integer; { index dne odeslání } dodani: integer; { index dne dodání } mnozstvi: real48; { přepravované množství materiálu } end; { vektor řešení všech proměnných, i těch nulových } Treseni = array of Tpromenna; { úloha LP } TLPproblem = record x: Treseni; { vektor proměnných včetně informace odkud, kam, . . . } . .. end; Jedinou podstatnou změnou je přidání vektoru proměnných x datového typu Treseni do modelu LP, který je datového typu TLPproblem. Každá proměnná, definovaná na řádcích 174–180, obsahuje informaci o dodavateli, odbětateli, odeslání, dodání a o skutečně přepravovaném množství materiálu. Do proměnné TLPproblem je potom na řádku 185 přidán vektor těchto proměnných x, který po vyřešení modelu bude kromě výše zmíněných informací obsahovat i optimální řešení modelu pro jeden časový úsek. 6.4.2
Procedury a funkce knihovny dynamicka dopravni uloha.pas
Seznam všech procedur a funkcí v knihovně je uveden na obrázku 14. Některé z funkcí jsou pomocné, tzn. nebudou moci být použity mimo knihovnu. Všechny funkce, které lze použít i mimo knihovnu, začínají prefixem dtp. V první řadě je třeba jmenovat pomocné funkce den a dow. Jejich úkolem je vrátit českou, resp. anglickou zkratku názvu dne v týdnu pro příslušný den přepravy. Mají dva vstupní parametry i a start. Parametr i odpovídá pořadovému číslu dne přepravy, parametr start dni v týdnu, ve kterém byla přeprava zahájena. Funkce den vrací textový řetězec obsahující den v týdnu, např. po, ut, . . . , ne resp. funkce dow
6.4
Dynamická dopravní úloha s celkovým přepravovaným množstvím
89
unit dynamicka dopravni uloha.pas function dtp import(adresa: string): TDTPproblem; procedure nacti pole(s: string; var pole: arrayINT); overload; procedure nacti pole(s: string; var pole: arrayR48); overload; function dtp2lp(dtp: TDTPproblem): TLPproblem; function dtp2lp optimal(dtp: TDTPproblem): TLPproblem; function dtp rozepis do tabulky(dtp: TDTPproblem): Tglobal; function maxden(A: Tdoba dodani): integer; function dtp2model(dtp: TDTPproblem): string; function dtp2lingo(dtp: TDTPproblem): string; function promenna(x: Tpromenna; pocetdni: integer): string; function dtp tiskni promenne(dtp: TDTPproblem): string; function dtp tiskni jizdy(dtp: TDTPproblem): string; function dtp tiskni DO(dtp: TDTPproblem; kdo: integer): string;
Obr. 14: Procedury a funkce knihovny dynamicka dopravni uloha.pas. Zdroj: vlastní práce.
anglické názvy dní v týdnu, např. mo, tu, . . . , su. Tyto funkce budou dále využity při výpisu řešení. Z důvodu úspory prostoru nejsou tyto funkce uvedeny v přehledu funkcí na obrázku 14. Velmi důležitou funkcí je dtp import. Jejím úkolem je naimportovat úlohu do datové struktury TDTPproblem, aby mohla být vyřešena. Jediným vstupním parametrem je adresa s odkazem na soubor obsahující daný model. Struktura vstupního souboru s modelem je pevně daná a je popsána v podsekci 6.4.3. Uvnitř funkce v části type byly definovány dva nové datové typy, kterými jsou jednorozměrná pole arrayINT s celočíselnými, resp. arrayR48 s reálnými hodnotami. Tyto datové typy byly použity v nově definované proceduře nacti pole. Má dva parametry: prvním je textový řetězec obsahující čísla oddělená tabulátory a druhým pole číselného datového typu. Procedura převede textový řetězec obsažený v proměnné s do pole číselných hodnot a vrací ho v proměnné pole.
90
6
VLASTNí PRÁCE
Vlastní funce dtp import začíná načtením rozměrů úlohy DTP. Podle nich jsou potom načítány další části. Z tohoto důvodu je důležité, aby rozměry úlohy ve všech směrech odpovídaly, jinak by došlo k chybě při načítání19 . Následně jsou načítány časy přepravy mezi dodavateli a odběrateli. Jak již bylo zmíněno výše, jedná se o celočíselné hodnoty. Po nich následuje načítání limitů dodávaného a následně i požadovaného množství pro každou časovou jednotku. Po úspěšném načtení funkce vrací tuto úlohu v proměnné datového typu TDTPproblem20 . Úkolem funkce dtp2lp je převést úlohu DTP na běžnou úlohu lineárního programování. Jak již bylo zmíněno v sekci 5.2, bude sestaven model LP pro jeden časový úsek. Vstupní proměnnou je datový typ TDTPproblem, výstupní TLPproblem. Hned na začátku jsou určeny rozměry modelu – počet proměnných odpovídá součinu počtu dodavatelů, odběratelů a časových jednotek jednoho časového úseku. Počet omezujících podmínek je roven součtu počtu dodavatelů a odběratelů vynásobených počtem časových jednotek jednoho časového úseku. Podle skutečného počtu proměnných a omezujících podmínek jsou nastaveny rozměry polí pro vektory koeficientů účelové funkce, hledaných proměnných, pravých stran omezení a relací a dále je nastaven rozměr matice strukturních koeficientů. Následuje nastavení indexů dodavatelů, odběratelů a času u všech proměnných a omezujících podmínek tak, aby mohl být jednoduše sestaven model LP. Pro tento účel byly v modelu definovány 2 pomocné proměnné nazvané omezeni a promenne jako vektory datového typu Tpromenna, obsahující příslušné indexy. Pak jsou nastaveny relace omezujících podmínek (všechny jsou typu „≤ÿ a následuje sestavení matice strukturních koeficientů a pravé strany pro odběratele a potom identicky i pro dodavatele. 188 189 190 191 192 193 194
if omezeni[i].dodavatel = -1 then for j := low(promenne) to high(promenne) do if ((omezeni[i].dodani = promenne[j].dodani) and (omezeni[i].odberatel = promenne[j].odberatel)) then lp.A[i, j] := 1 else lp.A[i, j] := 0; Matice je sestavována podle indexů pomocných proměnných, zdrojový kód sestavování matice týkající se dodavatelů je na řádcích 188–194. Funkce dtp2model je pouze pomocná. Má jeden vstupní parametr typu TDTPproblem (tím je model DTP) a dále výstupní parametr typu string. Jejím úkolem je pro daný DTP model vytisknout matici s ekvivalentním modelem LP, kde budou jednotlivé buňky odděleny tabulátory. Smyslem této funkce je možnost exportu modelu LP popisujícího DTP do Excelu, kde může být dále zpracováván či např. 19
Pokud by např. počet dodavatelů neodpovídal počtu řádků s dobou přepravy od dodavatelů k odběratelům, nedošlo by k načtení úlohy. 20 V případě neúspěšného načtení jsou vracena místo požadovaných informací prázdná pole.
6.4
Dynamická dopravní úloha s celkovým přepravovaným množstvím
91
vyřešen v Řešiteli. Uvnitř podprogramu dtp2model je volána funkce dtp2lp, která převede model na model LP. Dále je tento model vypisován, nicméně jsou brány v potaz jeho charakteristické vlastnosti jako modelu DTP. Další podpůrnou funkcí je dtp2lingo. Ta byla využita zejména při testování programu. Jejím vstupem je opět model DTP v parametru datového typu TDTPproblem, výstupem ekvivalentní model zapsaný v jazyce programu Lingo. Stejně jako v případě funkce dtp2model, i zde jsou při sestavování modelu brána v úvahu specifika úlohy DTP. Pro pojmenovávání proměnných byla vytvořena funkce promenna, která je součástí funkce dtp2lingo. Dle parametrů modelu sestaví názvy proměnných pro Lingo, které musí být jedinečné a s povolenými znaky. Vstupními parametry jsou x datového typu Tpromenna, a pocetdni, který určuje počet časových jednotek daného modelu (podle toho, zda je model definován v týdenním, denním či jiném režimu). Výstupem je textový řetězec s jedinečným názvem proměnné dle dále popsaných pravidel. Názvy proměnných jsou anglické zkratky. V případě, že proměnná pocetdni je rovna 7, funkce předpokládá, že časový úsek odpovídá jednomu týdnu a proměnné pojmenovává takto: dodavatel je označen písmenem S (Source) a jeho indexem, začínajícím číslem 1. Dále je k dodavateli uvedena i anglická zkratka dne odeslání. Následuje znak podrtžítko, po něm přichází na řadu odběratel označený písmenem D (Destination), jeho index začínající číslem 1 a anglická zkratka názvu dne doručení. Takže např. z názvu proměnné S2sa D4tu lze vyčíst, že se jedná o přepravu od 2. dodavatele k 4. odběrateli, přičemž zásilka byla odeslána v sobotu a doručena v úterý (následujícího týdne). Pokud se jedná o zjednodušený model s jednou časovou jednotkou (např. týdenní režim, kdy se během týdne nemění kapacity/požadavky), jsou názvy proměnných sestaveny pouze z písmen S, D a jejich indexů, např. S1 D3 znamenající přepravu od 1. dodavatele ke 3. odběrateli. Ve všech ostatních případech jsou názvy proměnných ve tvaru dodavatel a jeho index, znak x, časová jednotka odeslání, podtržítko, odběratel a jeho index, znak x, časová jednotka dodání. Takže např. S2x5 D4x9 znamená, že zásilka byla odeslána od 2. dodavatele v 5. časové jednotce a ke 4. odběrateli dorazila v 9. časové jednotce příslušného časového úseku.21 . Vlastní sestavování modelu v jazyce programu Lingo probíhá v těle funkce dtp2lingo, přičemž při zpracovávání každé proměnné je volána funkce promenna, vracející její název. Pro přehlednější výpis modelu byla přidána pravidla, že u proměnných s koeficientem ±1 se vypisuje pouze název této proměnné a pokud je 1. nenulový koeficient v řádku kladný, nevypisuje se znaménko +. Jinak z programátorského hlediska jde o použití jednoduchého cyklu pro výpis účelové funkce a dvojitého cyklu pro výpis omezujících podmínek. Výstupem funkce je textový řetězec obsahující identický model v jazyce programu Lingo. Převedením úlohy DTP pomocí funkce dtp2lp na úlohu LP a jejím vyřešením získáme maximální hodnotu přepravy za jeden časový úsek. Nicméně, pokud existuje více kombinací přeprav garantujících identickou hodnotu účelové funkce za jeden 21
Termín časová jednotka je používán záměrně, protože se nemusí vždy jednat o modely, kde jsou časovými jednotkami dny v týdnu a časovým úsekem jeden týden.
92
6
VLASTNí PRÁCE
časový úsek, je výhodnější zvolit ty s kratší dobou přepravy mezi dodavatelem a odběratelem. Jde tedy o vícekriteriální optimalizaci, kde v prvním kroku nalezneme maximální přepravované množství materiálu a ve druhém kroku pro toto množství hledáme jízdy s nejkratší dobou přepravy. Podrobněji je princip popsán v sekci 5.2. Tento krok má na starosti funkce dtp2lp optimal. Ta nejprve převede úlohu DTP na úlohu LP a s pomocí funkce vyresit ulohu LP ji vyřeší. Následně zjistí hodnotu účelové funkce a přidá novou omezující podmínku, garantující, že v novém řešení se hodnota účelové funkce nezmění. Následuje změna typu úlohy na minimalizační, nastavení koeficientů účelové funkce na dobu přepravy mezi dodavatelem a odběratelem a vyřešení úlohy. Optimální řešení je vráceno ve vektoru x datového typu TLPproblem. Jednou z nejdůležitějších funkcí je dtp rozepis do tabulky. Jejím úkolem je rozepsat jízdy z jednoho časového úseku na celou dobu přepravy. Vstupní proměnnou je stejně jako u ostatních funkcí dtp datového typu TDTPproblem. Výstupem je tabulka jízd uložená v datovém typu Tglobal. Uvnitř funkce se nachází pomocná funkce maxden, jejímž úkolem je vrátit nejdelší dobu přepravy mezi dodavateli a odběrateli. Po spuštění funkce je nejprve model dtp převeden na model lp, následně je vyřešen (pomocí funkcí definovaných v knihovně simplexka.pas) a v proměnné reseni uložen vektor řešení kladných proměnných. Na základě celkové přepravy za jeden časový úsek (hodnota účelové funkce právě vyřešeného modelu) je určena velikost tabulky, konkrétně rozměr týkající se počtu dní přepravy. Následně jsou podle rozměrů nastaveny velikosti dynamických polí proměnné tabulka datového typu Tglobal. Pro jednodušší rozpis jízd je definována nová proměnná reseni odeslani se třemi rozměry, reprezentujícími dodavatele, odběratele a časovou jednotku odeslání. Do této trojrozměrné matice budou následně nakopírovány hodnoty proměnných optimálního řešení tak, aby indexy jednotlivých rozměrů odpovídaly indexům dodavatelů, odběratelů a času odeslání. Po této části následuje rozpis jednotlivých jízd. Vzhledem k tomu, že se jedná o jádro funkce a jde o netriviální část zdrojového kódu, je celý rozpis jízd k dispozici na řádcích 195–215. 195 196 197 198 199 200 201 202 203 204 205 206 207
repeat for i := 0 to dtp.rozmery.dodavatelu - 1 do for j := 0 to dtp.rozmery.odberatelu - 1 do if reseni odeslani[i, j, dow] <= zbyva then begin tabulka.odvezeno.preprava[i, j, den] := reseni odeslani[i, j, dow]; zbyva := zbyva - tabulka.odvezeno.preprava[i, j, den]; tabulka.odvezeno.zbyva[den] := zbyva; tabulka.privezeno.preprava[i, j, den + dtp.doba dodani[i, j]] := reseni odeslani[i, j, dow]; end else begin
6.4
208 209 210 211 212 213 214 215
Dynamická dopravní úloha s celkovým přepravovaným množstvím
93
tabulka.odvezeno.preprava[i, j, den] := zbyva; tabulka.privezeno.preprava[i, j, den + dtp.doba dodani[i, j]] := zbyva; tabulka.odvezeno.zbyva[den] := 0; zbyva := 0; end; den := den + 1; dow := (dow + 1) mod days; until zbyva <= 0; Vlastní rozpis jízd probíhá uvnitř cyklu repeat ukončeného splněním podmínky nulového zbývajícího množství materiálu určeného k přepravě, viz řádek 215. Uvnitř cyklu repeat se nachází dvojitý cyklus určený počtem dodavatelů a odběratelů. Proměnná den reprezentuje pořadové číslo dne v rámci celé doby přepravy, proměnná dow příslušnou časovou jednotku. V každém dni přepravy je pro každého dodavatele a odběratele otestováno, zda přepravované množství je menší než zbývající množství určené k přepravě, viz řádek 198, či nikoli na řádku 206. Potom je přiřazeno množství určené k odvezení a sníženo zbývající celkové množství materiálu k přepravení. Následuje zvýšení pořadového čísla dne přepravy na řádku 213 a změna časové jednotky, viz řádek 214. Po ukončení cyklu obsahuje proměnná tabulka kompletní seznam odvezeného a přivezeného materiálu. Posledním krokem funkce je dopočítání množství materiálu, který na konci každého dne přepravy zbývá převézt. To, vzhledem k různé době přepravy, nebylo možné v cyklu repeat spočítat. První funkcí, která tiskne výsledky, je dtp tiskni promenne. Vstupem je model DTP, výstupem všechny kladné proměnné modelu popisujícího jeden časový úsek. Ukázka výpisu proměnných je na obrázku 15. Jak je vidět z prvního řádku, ve čtvrtek bylo od prvního dodavatele odesláno 20 jednotek materiálu, který ke 4. odběrateli dorazil v pátek. D D D D
1 2 2 3
(ct) (pa) (ne) (po)
␚ ␚ ␚ ␚
O O O O
4 1 3 1
(pa) (so) (st) (st)
␚ ␚ ␚ ␚
20␔ 40␔ 60␔ 50␔
Obr. 15: Ukázka výstupu funkce dtp tiskni promenne. Značka „ ␚ ÿ symbolizuje tabulátor, „␔ÿ konec řádku. Zdroj: vlastní práce.
Co se týká vlastní funkce dtp tiskni promenne, za zmínku stojí dvě skutečnosti. První skutečností je, že úloha DTP je nejprve převedena na LP, vyřešena a teprve potom je vypisováno její řešení. Druhým faktem je, že pokud se počet časových jednotek rovná hodnotě 7, program opět chápe proměnné jako dny v týdnu (viz např. obrázek 15), zatímco při jiném počtu časových jednotek jednoho časového úseku vypisuje pouze jejich indexy, začínající hodnotou 1 (na rozdíl od zdrojového kódu, kde s ohledem na modulární aritmetiku začíná číslování nulou). Funkce dtp tiskni jizdy vytiskne seznam všech jízd jak z pohledu dodavatelů, tak z pohledu odběratelů.
94
6
VLASTNí PRÁCE
Tab. 11: Část seznamu jízd jako ukázka výstupu funkce dtp tiskni jizdy. Zdroj: vlastní práce. Odkud Kam D1 O4 D2 O1 D2 O2 ... ... Zbývá odvézt:
... ... ... ... ... ...
Den 48 (po)
Den 49 (ut) 20 10
Den 50 (st)
Den 51 (ct)
60 ... 90
... 0
... 0
... 0
Odkud Kam D1 O4 D2 O1 D2 O2 ... ... Zbývá přivézt:
... ... ... ... ... ...
Den 48 (po)
Den 49 (ut)
Den 50 (st) 20 10
Den 51 (ct)
... 500
... 280
... 130
60 ... 0
Vstupem je model DTP, výstupem seznam všech jízd všech dodavatelů a odběratelů během celé doby přepravy. Stejně jako v předchozí funkci, i zde dochází již jen k výpisu jednotlivých jízd, neboť všechny podstatné kroky týkající se výpočtu a rozpisu přeprav, obsahují dříve popisované funkce, které jsou zde pouze volány. Ukázka výstupu funkce je k dispozici v tabulce 11.22 Tabulka je rozdělena na dvě části. Horní část tabulky se týká všech převozů z pohledu dodavatelů, tj. kdy byl ten který materiál odeslán. Dolní část tabulky zase popisuje převozy z pohledu odběratelů, včetně dne dodání. Protože se jedná o výpis pouze části dodavatelů, celkové součty nekorespondují se zbytkem tabulky, nicméně v případě kompletního výpisu by se tyto hodnoty shodovaly. Co by se však neshodovalo ani v kompletní tabulce, je množství materiálu, které zbývá přivézt, resp. odvézt. Tento rozdíl je způsoben materiálem na cestě. Poslední funkcí knihovny dynamicka dopravni uloha.pas je dtp tiskni DO23 . Jejím úkolem je vytisknout seznam všech jízd vybraného dodavatele či odběratele. Aby nebylo nutné vytvářet v knihovně dvě téměř identické funkce, má 2 vstupní parametry. Prvním je model DTP obsažený v proměnné dtp, druhým proměnná kdo typu integer. Ta může nabývat celočíselných nenulových hodnot. V případě, že nabývá záporné hodnoty, bude se tisknout dodavatel s indexem odpovídajícím absolutní hodnotě proměnné kdo. V případě kladné hodnoty proměnné tiskne všechny přepravy odběratele s tímto indexem. Stejně jako v předchozích funkcích, pokud je počet časových jednotek modelu DTP roven sedmi, je to chápáno jako běžný týden a při výpisu jsou používány zkratky dní v týdnu. V opačném případě jsou vypisována 22
Výstupem funkce dtp tiskni jizdy je pouze text oddělený tabulátory. Takto formátovanou tabulku získáme překopírováním tohoto textu např. do Excelu. 23 DO v názvu symbolizuje Dodavatele, resp. Odberatele, který se bude tisknout.
6.4
95
Dynamická dopravní úloha s celkovým přepravovaným množstvím
pořadová čísla časových jednotek. Ukázka výpisu funkce je na obrázku 16. Jak je vidět, jde o část výpisu přeprav z pohledu 1. odběratele. Odběratel ␔ dodavatel D1 ␚ 3 D2 ␚ 4 D3 ␚ 4
1␔ ␚ den dodání ␚ den v týdnu ␚ pa ␚ 10 ␚ 10␔ ␚ so ␚ 20 ␚ 30␔ ␚ so ␚ 100 ␚ 130␔
␚ množství
␚ celkem ␔
Obr. 16: Ukázka výstupu funkce dtp tiskni DO. Zdroj: vlastní práce.
6.4.3
Struktura vstupních souborů
Vzhledem ke specifikům úlohy DTP bylo nutné definovat vlastní vstupní formát úlohy. Ten je rozdělen celkově do 5 částí. Každá část začíná hlavičkou, ve které se může vyskytovat jakýkoli text a která se při načítání přeskočí, aniž by byla dále zpracovávána. Po ní následují data, oddělená tabulátory a případně i řádky. Ukázka vstupního formátu dat je k dispozici na obrázku 17. V první části jsou popsány rozměry modelu. Jako první se načítá počet dodavatelů, odběratelů a časových jednotek. Volitelným parametrem je parametr zahájení. V případě, že se v modelu nevyskytuje, je přeprava zahájena v první časové jednotce. Na základě rozměrů jsou načítány další části modelu. Je tedy nezbytně nutné, aby skutečné rozměry korespondovaly s údaji o rozměrech modelu. V opačném případě nebude model načten. Ve druhé části dochází k načítání celkového množství k přepravě. Protože v tomto modelu nejsou definovány kapacity, resp. požadavky jednotlivých stran přepravy, další informace nejsou zapotřebí. Ve třetí části se nachází doba přepravy mezi jednotlivými dodavateli, resp. odběrateli. Počet řádků odpovídá počtu dodavatelů, počet hodnot v každém řádku počtu odběratelů. Čtvrtou část tvoří maximální limity dodavatelů v jednotlivých časových jednotkách. V páté části jsou informace o maximálních limitech odběratelů. Počet řádků ve čtvrté i páté části odpovídá počtu časových jednotek. Vstupní formát souboru byl záměrně vytvořen v textové podobě tak, aby si kdokoli v případě potřeby mohl jednoduše vytvořit nový, popřípadě editovat již existující model. 6.4.4
Konzolová aplikace DTP.exe
S ohledem na výhody dávkového zpracování byla vytvořena konzolová aplikace DTP.exe, umožňující řešení modelů s parametry, resp. dávkové řešení více modelů. V ní byly využity výše popsané funkce knihovny dynamicka dopravni uloha.pas. Ovládání programů je pomocí parametrů.
96
6
VLASTNí PRÁCE
[ Dodavatelů, odběratelů, časových jednotek, zahájení ]␔ 3 ␚ 4 ␚ 2 ␚ 1␔ [ Přepravované množství ]␔ 10000␔ [ Doby dodání ]␔ 3 ␚ 2 ␚ 1 ␚ 1␔ 1 ␚ 3 ␚ 3 ␚ 1␔ 2 ␚ 3 ␚ 2 ␚ 1␔ [ Dodávané množství x časová jednotka ]␔ 80 ␚ 60 ␚ 0␔ 80 ␚ 60 ␚ 100␔ [ Požadované množství x časová jednotka ]␔ 50 ␚ 120 ␚ 70 ␚ 60␔ 50 ␚ 120 ␚ 0 ␚ 60␔ Obr. 17: Struktura vstupních souborů. Zdroj: vlastní práce.
Pro výpisy jednotlivých částí modelu bylo definováno 5 parametrů (-m, -p, -j, -d a -o), začínajících pomlčkou. Jejich přehled a činnosti jsou uvedeny v tabulce 12. Tab. 12: Seznam volitelných parametrů programu DTP.exe. Zdroj: vlastní práce.
-m . . . -p . . . -j . . . -di . . . -d* . . . -oj . . . -o* . . .
vytiskne vytiskne vytiskne vytiskne vytiskne vytiskne vytiskne
matematický model pro jeden časový úsek, seznam všech nenulových proměnných pro jeden časový úsek, tabulku přeprav mezi všemi dodavateli a odběrateli, seznam přeprav i-tého dodavatele, i je kladné celé číslo, seznam přeprav všech dodavatelů, seznam jízd j-tého odběratele, j je kladné celé číslo, seznam jízd všech odběratelů.
První parametr je povinný a obsahuje vstupní soubor, ze kterého je model načítán. Pokud druhý parametr nezačíná pomlčkou, považuje se za výstupní soubor, do kterého bude uloženo řešení modelu. V opačném případě je řešení modelu uloženo do schránky. Následují parametry výpisu řešení modelu. Na jejich počtu ani pořadí nezáleží. V případě, že některý z parametrů překročí rozměry modelu, je ignorován (např. pokud jsou v modelu celkem 3 dodavatelé a chceme vypsat jízdy 4. dodavatele). Např. při spuštění programu DTP.exe s těmito parametry: DTP.exe model1.dtp -j -d1 -d3 -o* bude načten model ze souboru model1.dtp a do schránky bude uložena tabulka všech jízd, seznam jízd 1. a 3. dodavatele a seznam jízd všech odběratelů.
6.4
97
Dynamická dopravní úloha s celkovým přepravovaným množstvím
6.4.5
Model přepravy s jednou časovou jednotkou
Na tomto příkladě bude prezentována ukázka řešení zjednodušené verze modelu DTP s jednou časovou jednotkou. V praxi se může jednat o jakoukoli situaci, kdy dodavatelé i odběratelé mají v jednotlivých časových jednotkách neměnné požadavky. Tím je počet časových jednotek redukován na jednu. V tomto typu modelu bude popsána analogie s modelem dopravní úlohy, nicméně jsou zde skutečnosti, které znemožňují obecné řešení tohoto typu modelu jako klasickou dopravní úlohu. Mějme k dispozici 2 000 tun materiálu, který je nutné převézt od dodavatelů k odběratelům. K dispozici jsou celkem 3 dodavatelé a 4 odběratelé, přičemž jak doba přepravy ve dnech, tak i maximální denní limity odeslaného, resp. přijatého materiálu v tunách jsou uvedeny v tabulce 13. Je třeba určit plán rozvozu tak, aby čas, potřebný k převezení veškerého materiálu od dodavatelů k odběratelům, byl minimální. Přepravními prostředky nejsme omezeni. Tab. 13: Denní limity a doby přepravy mezi dodavateli a odběrateli. Zdroj: vlastní práce. Dod. 1 Dod. 2 Dod. 3 Max. denní pož.
Odb. 1 3 1 2 60 t
Odb. 2 2 4 3 90 t
Odb 3 1 5 2 110 t
Odb 4 1 2 1 20 t
Max. denní kap. 40 t 30 t 110 t
Při řešení modelu bude proveden názorný postup řešení. Ačkoli program DTP.exe je schopen vrátit již vyřešený seznam jízd, bude řešení modelu z metodických důvodů popsáno krok za krokem. Nejprve byl sestaven matematický model přepravy pro jeden časový úsek s jednou časovou jednotkou, v tomto případě jedním dnem. Je uveden v tabulce 14. I když se jedná o dopravní úlohu, protože nás zajímá maximální denní převoz, jde o model maximalizační, neboť maximalizací denně převáženého materiálu minimalizujeme dobu potřebnou k jeho přepravě. Z tohoto důvodu je také možné mít všechny omezující podmínky ve tvaru „≤ÿ.
D1 O2
D1 O3
D1 O 4
D2 O 1
D2 O 2
D2 O3
D2 O4
D3 O1
D3 O2
D3 O3
D3 O4
MAX =
D1 O1
Tab. 14: Matematický model maximalizující přepravu pro jeden časový úsek. Zdroj: vlastní práce.
1 1
1
1
1
1 1
1
1
1
1 1
1
1
1
1
1 1
1
1
1
1 1
1 1
1 1
1
1
1
1
1 1
1
1
1
≤ ≤ ≤ ≤ ≤ ≤ ≤
60 90 110 20 40 30 110
98
6
VLASTNí PRÁCE
Maximální denně převážené množství je tedy 180 tun materiálu. I když již bylo nalezeno optimální řešení pro jeden časový úsek, není ještě známa celková doba trvání přepravy. Zjišťovat ji je nyní předčasné. Nejprve je třeba z množiny všech řešení, která garantují přepravené množství materiálu ve výši 180 tun za den, vybrat jízdy s nejkratší dobou trvání přepravy. Do modelu bude přidána omezující podmínka garantující přepravu 180 tun denně: xD1 O1 + xD2 O2 + . . . + xD3 O4 = 180 [tun materiálu denně], a dále bude změněn typ úlohy na minimalizační, přičemž koeficienty účelové funkce budou odpovídat době přepravy mezi příslušným dodavatelem a odběratelem: zmin = 3xD1 O1 + 2xD2 O2 + . . . + xD3 O4 . Vyřešením tohoto modelu získáváme optimální řešení přepravy pro jeden časový úsek, v tomto případě jeden den. Nalezené řešení je uvedeno v tabulce 15. Celkovou dobu trvání přepravy zjistíme až rozepsáním celé přepravy tak, aby součet odeslaného, resp. součet dodaného materiálu byl roven 2 000 t. Opět bude využit program DTP.exe, tentokrát bude spuštěn s parametrem -j. Tab. 15: Optimální řešení modelu pro jeden časový úsek. Zdroj: vlastní práce. Odkud Kam D1 O3 D2 O1 D3 O1 D3 O3 D3 O4 Celkem
Množství 40 t 30 t 30 t 60 t 20 t 180 t
Doba přepravy 1 den 1 den 2 dny 2 dny 1 den
Přehledný rozpis jízd z pohledu dodavatelů je uveden v tabulce 16, z pohledu odběratelů v tabulce 17. Protože se v modelu vyskytuje jen jedna časová jednotka, po zahájení se přeprava v jednotlivých dnech nemění, proto jsou u dodavatelů dny č. 2–11, resp. u odběratelů dny č. 3–12 beze změny. Tab. 16: Seznam materiálu odvezeného od dodavatelů. Zdroj: vlastní práce. Odkud Kam D1 O3 D2 O1 D3 O1 D3 O3 D3 O4 Odesláno: Zbývá odvézt:
den 1 40 30 30 60 20 180 1 820
dny 2–11 40 30 30 60 20 180
den 12 20
20 0
6.4
99
Dynamická dopravní úloha s celkovým přepravovaným množstvím
Tab. 17: Seznam materiálu dodaného odběratelům. Zdroj: vlastní práce. Odkud Kam D1 O3 D2 O1 D3 O1 D3 O3 D3 O4 Dodáno: Zbývá přivézt:
den 1
0 2 000
den 2 40 30
20 90 1 910
den 3–12 40 30 30 60 20 180
den 13 20 30 60 110 0
Za pozornost stojí rovněž rozdílný náběh přepravy z pohledu dodavatelů a odběratelů. Množství odesílaného materiálu je od prvního dne až do 11. dne identické, ve 12. dni je odesíláno množství zbývající do 2 000 tun. U dodaného množství materiálu je situace odlišná, a to z důvodu různě dlouhé doby trvání přepravy. Protože nejdelší doba (nenulové) přepravy jsou 2 dny, bude množství dodaného materiálu na své maximální výši až od 3. dne dál. Podobná situace je i při ukončení přepravy. Zatímco u dodavatelů je přeprava ukončena v podstatě v jednom okamžiku, u odběratelů ještě „dobíháÿ, maximálně však 2 dny, a to v závislosti na době dodání.24 Popisovaná situace je zřejmá z obrázku 18. 180 160 množství materiálu v t
140 120 100 80 60 40 20 0 1
2
3
4
odeslaný materiál
5
6 7 8 den přepravy
9
10
11
12
13
dodaný materiál
Obr. 18: Graf přepravovaného množství materiálu v jednotlivých dnech. Zdroj: vlastní práce. 24
Teoreticky by mohla přeprava dobíhat až 5 dní v případě, že by bylo přepravováno nenulové množství materiálu mezi 2. dodavatelem a 3. odběratelem.
100
6
VLASTNí PRÁCE
Závěrem lze tedy konstatovat, že pro kompletní odeslání materiálu je třeba 12 dní (časových jednotek), zatímco pro dodání je zapotřebí 13 dní ode dne zahájení přepravy. Popisovaný model s jednou časovou jednotkou je speciálním případem modelu s více časovými jednotkami. U tohoto modelu je možné jej řešit i s pomocí modelu dopravních úloh. Jde ale o výjimku, u modelů s dvěma a více časovými úseky to již možné není. 6.4.6
Přeprava kalamitního dřeva
Příčinou vzniku výše popisovaného modelu byla vichřice Kyrill. Po ní vznikly v lesích na Šumavě polomy, které bylo nutné v pokud možno co nejkratší době odstranit a kalamitní dřevo odvézt ke zpracování. Podklady pro řešení modelu byly získány z [5], metodika řešení je vlastní. Celkem bylo třeba přepravit po železnici 200 tisíc tun kalamitního dřeva. Pro odvoz byla určena 3 místa svozu: Velešín, Nové Hrady a Kájov. Přeprava byla realizována přes České Budějovice, odkud bylo dřevo přepravováno dále do míst zpracování, kterých bylo celkem 5: Jihlava, Havlíčkův Brod, Retz, Ptení a Paskov. Při přepravě byly použity vagony s nosností 50 tun, jejich množství nebylo omezeno. Z toho vyplývá, že na kompletní odvezení dřeva bude potřeba přibližně 4 000 vagonů. Tab. 18: Informace o kapacitách míst svozu. Zdroj: Bulantová [5].
Dodavatel Velešín Nové Hrady Kájov
Pracovní dny po–pá po–ne po–ne
Vagonů Vagonů Dní přepravy denně týdně do ČB 10 50 0 25 175 0 40 280 0
Každé z míst svozu (místa svozu budou také značena jako dodavatelé) mělo vlastní týdenní pracovní dobu a denní limity dřeva, které bylo schopno odeslat. Totéž platí i pro místa zpracování (budou značeny jako odběratelé). Důležitým faktorem pro přepravu je doba jejího trvání. Protože je nenulová, může dojít k situaci, že dřevo bude dodáno mimo pracovní dobu a dojde k jeho nežádoucí kumulaci u odběratelů. Tomu bylo nutné při přepravě předejít. Protože den zahájení přepravy nebyl určen, bylo rozhodnuto, že bude přeprava zahájena v pondělí. Podrobné informace o místech svozu jsou uvedeny v tabulce 18. Jak je vidět, zatímco Velešín má pracovní dobu od pondělí do pátku, ve zbývajících dvou místech svozu se pracuje nepřetržitě. Na konci každého dne je dřevo odvezeno do Českých Budějovic. Vzhledem k relativně malé vzdálenosti mezi místy svozu je dřevo přepraveno ještě týž den, proto je v posledním slouci tabulky uvedena nulová doba přepravy.
6.4
Dynamická dopravní úloha s celkovým přepravovaným množstvím
101
Tab. 19: Informace o kapacitách míst zpracování. Zdroj: Bulantová [5].
Pracovní Odběratel dny Jihlava po–pá Havl. Brod po–ne Retz po–ne Ptení po–pá Paskov po–so
Vagonů Vagonů Dní přepravy denně týdně z ČB 10 50 3 20 140 3 20 140 4 10 50 4 20 120 4
Informace o místech zpracování jsou uvedeny v tabulce 19. Z pěti míst zpracování mají dvě nepřetržitou pracovní dobu, dvě pětidenní a jedno šestidenní. Doba přepravy z Českých Budějovic do místa zpracování se pohybuje mezi 3–4 dny. Pro vyřešení modelu byla použita aplikace dtp.exe. Nejprve byl vytvořen soubor s matematickým modelem, který byl následně vyřešen. I když byl model vyřešen najednou a kompletně, bude řešení rozepsáno po etapách tak, jak je popisováno v metodice. Prvním krokem je sestavení modelu pro jeden časový úsek, v tomto případě týden. Vzhledem k tomu, že existují 3 dodavatelé, 5 odběratelů a 7 dní v týdnu, bude model obsahovat celkem 3 · 5 · 7 = 105 strukturních proměnných. Každá z definovaných proměnných tedy popisuje počet přepravovaných vagonů dřeva od i-tého dodavatele k j-tému odběrateli, odeslané v k-tém dni v týdnu. Počet omezujících podmínek bude odpovídat výrazu (3 + 5) · 7 = 56. Jak již bylo zmíněno v kapitole 5.2, účelová funkce modelu je maximalizační, protože maximalizací přepraveného množství dřeva během jednoho týdne minimalizujeme celkovou dobu přepravy. Koeficienty účelové funkce mají u všech proměnných hodnotu 1. Dále platí, že vagon odeslaný na konci týdne bude k odběrateli dopraven v dalším týdnu, což je třeba vzít v potaz při sestavování omezujících podmínek odběratelů. Vyřešením modelu získáme přepravu v běžném týdnu, tedy v týdnu, kdy nedošlo k zahájení ani ukončení přepravy. Součet všech proměnných modelu dává hodnotu 460. To znamená, že v běžném týdnu bude jak odesláno, tak i přijato celkem 460 vagonů, tj. 23 000 t kalamitního dřeva. S ohledem na minimalizaci přepravní doby bude proveden další krok, vícekriteriální optimalizace s pomocí lexikografické metody. Prvotním kriteriem byla maximalizace přepraveného množství dřeva v běžném týdnu, což odpovídá množství 460 vagonů. Dalším krokem je nalezení takového řešení, které ze všech řešení, garantujících přepravení 460 vagonů týdně, vybere to s minimální dobou přepravy od dodavatelů k odběratelům. Stávající model bude upraven. Nejprve bude přidána další omezující podmínka garantující přepravení 460 vagonů týdně a následně bude typ účelové funkce převeden na minimalizační a její koeficienty budou odpovídat počtu dnů přepravy mezi příslušným dodavatelem a odběratelem. Takto upravený model bude vyřešen a dále rozepsán.
102
6
VLASTNí PRÁCE
Rozpis řešení popisovaného modelu je k dispozici v tabulce 20 na straně 103. Tím byl získán týdenní plán přepravy. Ten je platný pro jakýkoli týden s výjimkou období zahajování přepravy, kdy s ohledem na dobu přepravy nebudou odpovídat dodané počty vagonů, a na období ukončení, kdy nemusí odpovídat ani odeslané, ani dodané počty vagonů.
6.4
103
Dynamická dopravní úloha s celkovým přepravovaným množstvím
Tab. 20: Týdenní plán počtu odeslaných a přijatých vagonů. Zdroj: vlastní práce. pondělí Velešín N. Hrady Kájov
úterý Velešín N. Hrady Kájov
JI
10
PT 10
20
10 10
HB
RZ
10
20
15 5
JI
čtvrtek Velešín N. Hrady Kájov
JI
pátek Velešín N. Hrady Kájov
neděle Velešín N. Hrady Kájov
RZ
JI
středa Velešín N. Hrady Kájov
sobota Velešín N. Hrady Kájov
HB
HB 15 5
RZ 10 10
PT
PT
HB
RZ
PT 10
20
5 15
JI
HB
RZ
PT
20
10 10
10
10
PS 10 5
PS 10 10
PS
PS 10 10
PS 10 5
JI
HB
RZ
PT
PS 5
20
10 10
10
10
JI
10
HB
RZ
PT
PS
10
5
20
10 10
odesl. 10 25 40
pondělí Jihlava Havl. Brod Retz Ptení Paskov
VE
NH
10
5 10 10
úterý Jihlava Havl. Brod Retz Ptení Paskov
VE
NH
10
10 10 5
odesl. 10 25 5
středa Jihlava Havl. Brod Retz Ptení Paskov
VE
NH
odesl. 10 25 35
čtvrtek Jihlava Havl. Brod Retz Ptení Paskov
VE
odesl. 10 25 40
pátek Jihlava Havl. Brod Retz Ptení Paskov
VE
NH
10
10 10 5
sobota Jihlava Havl. Brod Retz Ptení Paskov
VE
10
10
neděle Jihlava Havl. Brod Retz Ptení Paskov
VE
NH
odesl. 10 25 35
odesl. 0 25 40
odesl. 0 25 40
KJ 10 20 15
dod. 10 20 20 10 20
KJ 10 20 10
dod. 10 20 20 10 15
KJ 10 20 10
dod. 10 20 20 10 5
KJ 10 20 10
dod. 10 20 20 10 5
KJ 10 20 10
dod. 10 20 20 10 15
NH
KJ
15 15
5 5
dod. 0 20 20 0 20
10 10 5 NH
10 10 5
KJ 20
10
10
dod. 0 20 20 0 0
104
6
VLASTNí PRÁCE
Nyní je možné již získat plán celkové přepravy a počet dní, ve kterých bude přeprava realizována. Rozepisování se opět děje automaticky, kdy program dtp.exe rozepisuje podle dní počty vypravených a přijatých vagonů podle jednotlivých dodavatelů a odběratelů, dokud nějaké vagony zbývají. Tím je získán kompletní optimalizovaný plán celkové přepravy, který je k dispozici v příloze C. Přehled počtu odeslaných a přijatých vagonů během jednotlivých dní přepravy představuje obrázek 19. Je rozdělen na tři části. První část představuje zahájení přepravy a je znázorněna zelenou barvou. Jde v podstatě o první týden, kdy bylo dřevo přepravováno. Druhá část zahrnuje 2.–8. týden přepravy a je označena oranžovou barvou. V grafu je zobrazena jako jeden týden, protože se mezi 2.–8. týdnem nemění. Poslední část označená červenou barvou popisuje ukončení přepravy, jde o 9. a začátek 10. týdne. V každé části přepravy jsou počty odeslaných vagonů znázorněny světlejším a počty přijatých vagonů tmavším odstínem příslušné barvy. 80
počet odeslaných vagonů
70 60 50 40 30 20 10 0
po út st čt pá so ne po út st čt pá so ne po út st čt pá so ne po út den přepravy odeslané vagony zahájení přepravy, 1. týden přeprava ve 2.–8. týdnu ukončení přepravy, 9.–10. týden
přijaté vagony zahájení přepravy, 1. týden přeprava ve 2.–8. týdnu ukončení přepravy, 9.–10. týden
Obr. 19: Počty přepravených vagonů v průběhu jednotlivých dní přepravy. Zdroj: vlastní práce.
Celkový přehled počtu přepravených vagonů dřeva mezi místy svozu a místy zpracování je k dispozici v tabulce 21. Data byla získána tak, že byly jednoduše sečteny počty vagonů mezi příslušnými dodavateli a odběrateli v průběhu transportu. V tabulce je vidět, že mezi některými dodavateli a odběrateli přeprava nebyla vůbec realizována, celkem se jedná o 6 kombinací, kde je nulový počet přepravených vagonů.
6.4
105
Dynamická dopravní úloha s celkovým přepravovaným množstvím
Tab. 21: Počty odeslaných a přijatých vagonů během transportu dřeva. Zdroj: vlastní práce.
Jihlava Velešín Nové Hrady Kájov Přijato
Havl. Brod
Retz Ptení Paskov 90 360 135 610 430 350 1 085 510 1 220 1 210 430 710
430 430
Odesláno 450 1 525 2 025 4 000
Jak je vidět v rozpisu jednotlivých dní v příloze C, celková doba přepravy od naložení prvního vagonu po vyložení posledního vagonu bude trvat celkem 65 dní. Z toho nakládka dřeva bude trvat 61 dní a další nejvýše 4 dny bude dřevo dopravováno do míst zpracování. 80 b
b
b
70
b b
počet odeslaných vagonů
b
b b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
60 50 b
40 b
b
b
b
b
b b
b
b
b
b
b
b b
b
b
b
b
b
b b
b
b
b
b
b
b b
b
b
b
b
b
b b
b
b
b
b
b
b b
b
b
b
b
b
b b
b
b
b
b
b
b b
b
b
b
30 b b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
20 10
b
b
b
0
b
b
b
b
b
b b
1
b
b
b
8
b
b
b
b
b
b
b
b
b
b
b
b b
15
b
Velešín
b
b
b
b
b b
22 b
b
b
b
b
b
b
b
b
29 36 den přepravy b
b
Nové Hrady
b
b
b
b
Kájov
b
b
b
b
b
b
b
b
b
b
b
b
b
b b
43
b
b
b
b
b b
50
b
bb b
57
bb
bb
bb
64
b b
celkem odesláno
Obr. 20: Počty odeslaných vagonů během přepravy. Zdroj: vlastní práce.
Poslední dva obrázky č. 20 na straně 105 a 21 na straně 106 rozepisují počty odeslaných, resp. přijatých vagonů dřeva v průběhu přepravy z pohledu jednotlivých účastníků, přičemž fialovou barvou jsou označeny souhrnné údaje, které korespondují s údaji na obrázku 19. Na těchto dvou obrázcích je zřetelně vidět výkyvy v průběhu týdne, které jsou způsobeny různou týdenní pracovní dobou účastníků přepravy.
106
6
b
80
b
b b
b
b b
b
b b
b
b b
b
b b
VLASTNí PRÁCE
b
b b
b
b b
b
b b
b
70 počet přijatých vagonů
b
b b
b
60
b b
b
b b
b
b b
b
b b
b
b b
b
b b
b
b
b b
50 b
40
b b
b b
b b
b b
b
30
b
20
b
bb
bb
bb
bb
bb
b
b
10
bb
bb
bb
1
bb
bb
b
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
b
bb
bb
b
bb
bb
8
b
bb
b
b
0
bb
b
bb
bb
bb
bb
Jihlava
bb
bb
bb
bb
b
b
bb
bb
b
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb
b
H. Brod
bb
bb
bb
22
bb
bb
bb
bb
b
bb
bb
bb
b
bb
bb
bb
b
bb
bb
bb
b
bb
bb
bb
bb
bb
bb
bb
b
b
bb
b b
Retz
bb
bb
b
bb
bb
b
bb
bb
bb
bb
bb
29 36 den dodání
b
b
bb
b
bb
15
bb
b
b
b b
bb
b
bb
bb
bb
bb
bb
b
b
bb
bb
Ptení
bb
bb
bb
bb
bb
bb
bb
b
bb
bb b
bb
b
bb
50
bb
bb
bb
Paskov
bb
bb
b
b
bb
Obr. 21: Počty přivezených vagonů během přepravy. Zdroj: vlastní práce.
bb
bb
bb b
bb
bb
bb
57
b
bb b
b b
bb
b
bb
bb
b b
bb b
bb
43
bb
b
celkem
bb
b
b
64
6.5
Dynamická dopravní úloha s dílčími limity přepravovaného množství
6.5
107
Dynamická dopravní úloha s dílčími limity přepravovaného množství
Tento typ dopravní úlohy se liší od dopravní úlohy popsané v sekci 6.4 v tom, že každá ze stran přepravy má stanoveno celkové množství nabízeného či požadovaného materiálu určeného k přepravě. V ostatních vlastnostech se modely neliší. Ačkoli jsou si modely velmi podobné, nelze použít způsob řešení popsaný v sekci 6.4, a to právě z důvodu limitů množství materiálu jednotlivých dodavatelů a odběratelů. V této části budou popsány změny ve srovnání s předcházejícím modelem DTP. Zkratka DTPN, která bude nadále používána, popisuje dynamickou dopravní úlohu s dílčími limity přepravovaného množství. Při vývoji konzolové aplikace jsou použity již dříve popsané knihovny datova struktura.pas a simplexka.pas. 6.5.1
Datová struktura modelu
V modelu je využito datové struktury z knihovny datova struktura.pas. Dále je vytvořena nová knihovna datova struktura DTPN.pas popisující strukturované datové typy použité při řešení tohoto typu úlohy. Většina strukturovaných datových typů z této knihovny se oproti datovým typům modelu DTP liší jen v detailech, které budou nyní popsány. První změnou je na řádcích 217–220 nově definovaný datový typ Tmnozstvi, obsahující dva vektory reálných čísel nazvané dodavatele (ř. 218) a odberatele (ř. 219). Jde o celkové limity přepravovaného množství materiálu pro jednotlivé účastníky přepravy. Ten je použit jako součást strukturovaného datového typu TDTP N problem, definovaného na řádcích 222–228, který obsahuje kompletní údaje o řešení úlohy typu DTPN. Datové typy rozmery, doba dodani, dodavane mnozstvi a pozadovane mnozstvi se neliší od stejných datových typů popsaných v podsekci 6.4.1. 216 217 218 219 220 221 222 223 224 225 226 227 228
{ celkové limity jednotlivých dodavatelů, resp. odběratelů } Tmnozstvi = record dodavatele: arrayR48; odberatele: arrayR48; end; { úloha DTPN } TDTP N problem = record rozmery: TDTPNrozmery; limity: Tmnozstvi; { pole kapacit/pozadavku, 2 vektory } doba dodani: Tdoba dodani; dodavane mnozstvi: Tdodavane mnozstvi; pozadovane mnozstvi: Tpozadovane mnozstvi; end;
108
6
VLASTNí PRÁCE
Při hledání přípustného řešení úlohy DTPN je při hlídání limitů pravých stran matematických modelů využito datového typu Tlimity, definovaného na řádcích 234– 241. Jak na straně dodavatelů, tak i odběratelů jsou definovány 3 datové typy omezující maximální denní limity, zbývající přepravované množství materiálu příslušného dodavatele a součet zbývajícího materiálu k odvezení, resp. dodání, týkající se všech dodavatelů či odběratelů. U dodavatelů jsou první dva limity vektory obsahující reálná čísla, posledním je skalár datového typu real48. To proto, že při sestavování modelu se musí hlídat pouze množství odeslané příslušný den, zbývající limit dodavatele a zbývající množství všech dodavatelů. U odběratelů je u prvního limitu situace odlišná. Protože dodaný materiál mohl být odeslán v různých dnech, bylo nutné tuto skutečnost vzít v úvahu. Proto jsou maximální denní limity na řádku 233 datového typu Tmatice, kde první rozměr odpovídá počtu odběratelů a druhý počtu časových jednotek. Buňky matice jsou typu Tcell, definované na řádcích 229–232, kde je uchována informace o převáženém množství datového typu real48 a dále booleovská hodnota informující, zda je příslušná omezující podmínka definována či ne. Další dvě položky jsou již stejné u dodavatelů. 229 230 231 232 233 234 235 236 237 238 239 240 241
Tcell = record mnozstvi: real48; prevoz: boolean; { bude-li definováno omezení, TRUE=ano, FALSE=ne } end; Tmatice = array of array of Tcell; Tlimity = record dodavatele: array of real48; { vektor, pro 1 den } dodavatelSUMA: array of real48; { zbyvající kapacity každého dodavatele } dodavateleCELKEM: real48; { celkem zbývá odvézt } odberatele: Tmatice; { matice odběratelé x dny dodání } odberatelSUMA: array of real48; { zbyvající požadavky každého odběratele } odberateleCELKEM: real48; { celkem už dovezeno } end; Pro uložení nalezeného řešení modelu byla definována datová struktura Trozpis, na řádcích 243–248. Jde o trojrozměrnou matici, kde prvním rozměrem jsou dodavatelé, druhým odběratelé a třetím den. V případě odesílaného materiálu půjde o den odeslání, pro dodaný materiál den dodání. Nově definovaná položka zbyva DO na řádku 245 představuje množství materiálu, které zbývá odvést od jednotlivých dodavatelů, resp. přivézt k jednotlivým odběratelům na konci každého dne. Tady jde o dvojrozměrný vektor reálných hodnot, kdy první rozměr reprezentuje index dodavatele, resp. odběratele a druhý den odeslání, resp. dodání materiálu. Poslední položkou datového typu Trozpis je jednorozměrný vektor reálných hodnot zbyva na řádku 247, který reprezentuje celkové zbývající množství materiálu k přepravě na konci každého dne.
6.5
242 243 244 245 246 247 248 249 250 251 252 253
Dynamická dopravní úloha s dílčími limity přepravovaného množství
109
{ rozpis jednotlivých odeslání / dodání } Trozpis = record preprava: array of array of array of real48; { dodavatel, odběratel, den } zbyva DO: array of array of real48; { kolik zbývá odvézt/přivézt jednotlivým dodavatelům/odběratelům } zbyva: array of real48; { kolik ještě zbývá přepravit materiálu } end; { kompletní tabulka } Tglobal = record odvezeno: Trozpis; privezeno: Trozpis; end; Datový typ Tglobal (řádky 250–253) obsahuje dvě položky: odvezeno a privezeno. První z nich je odesílané, druhou dodávané množství materiálu za celou dobu přepravy. Obě položky jsou datového typu Trozpis, popsaného na řádcích 243–248. V ostatních strukturovaných datových typech se tento typ modelu již neliší od modelu DTP. 6.5.2
Knihovna unit DTPN fast.pas
Úkolem knihovny dtpn fast.pas je nalézt přípustné řešení úlohy DTPN, přičemž při hledání je kladen důraz na rychlost nalezení získaného řešení. S odkazem na hledání „pouzeÿ přípustného řešení je třeba vysvětlit smysl existence této knihovny. Především, získané přípustné řešení je nezbytné pro sestavení modelu při hledání optimálního řešení. Dále jsou zde definovány výstupní funkce tisknoucí řešení modelu dle parametrů bez ohledu na to, zda jde o řešení optimální či pouze přípustné. Proto také tyto funkce budou využity v knihovně unit DTPN slow.pas, hledající optimální řešení problému, a v konzolové aplikaci DTPN.exe. První funkcí knihovny25 je lp2string. Jediným vstupním parametrem je úloha LP datového typu TLPproblem, výstupem textový řetězec s matematickým modelem v rozepsaném tvaru, odděleným tabulátory. To umožňuje výstup této funkce vložit přímo do Excelu. Jde spíše o pomocnou funkci bez většího významu při řešení. Po ní následuje funkce dtpn import. Jejím úkolem je správně načíst úlohu typu DTPN. Při jejím popisu se lze odkázat na funkci DTP import z kapitoly 6.4.2, se kterou je shodná, s výjimkou přepravovaného množství materiálu. Zde jsou místo jednoho reálného čísla načítány dva vektory reálných čísel typu real48: prvním z nich jsou jednotlivé celkové kapacity dodavatelů, druhým jednotlivé celkové požadavky odběratelů. Nejdůležitější funkcí knihovny je vyresit ulohu DTPN fast. Jejím vstupním parametrem je úloha DTPN strukturovaného datového typu TDTP N problem. Jejími 25
V knihovně se vyskytují ještě funkce max, min, dow, den a maxden, které již byly popsány v předcházejících částech a jejichž smyslem je řešit dílčí část některé z následně popisovaných procedur či funkcí.
110
6
VLASTNí PRÁCE
unit dtpn fast.pas function lp2string(lp: TLPproblem): string; function dtpn import(adresa: string): TDTP N problem; procedure nacti pole(s: string; var pole: arrayINT); overload; procedure nacti pole(s: string; var pole: arrayR48); overload; function vyresit ulohu DTPN fast(dtpn: TDTP N problem; var tabulka: Tglobal; var reseni: Treseni): string; function nastav limity(dtpn: TDTP N problem): Tlimity; function sestav LP(dtpn: TDTP N problem; limity: Tlimity): TLPproblem; procedure aktualizuj limity(dtpn: TDTP N problem; reseni: Treseni; den: integer; var limity: Tlimity); procedure pridej vektor reseni(den: integer; ReseniDen: Treseni; var reseniAll: Treseni); function dtpn tiskni jizdy(tabulka: Tglobal; dtp: TDTP N problem): string; function dtpn tiskni DO(tabulka: Tglobal; dtp: TDTP N problem; kdo: integer): string; function dtpn tiskni promenne(reseni: Treseni; dtp: TDTP N problem): string;
Obr. 22: Přehled procedur a funkcí knihovny unit dtpn fast.pas. Zdroj: vlastní práce.
výstupy jsou tabulka jízd datového typu Tglobal a seznam všech kladných proměnných vyřešeného modelu datového typu Treseni. Tyto dvě výstupní proměnné jsou uvedeny v parametrech. Dále funkce vrací čas, který potřebovala k nalezení přípustného řešení, formátovaný jako textový řetězec string. Metodika algoritmu je popsána v podsekci 5.3.2. Před popisem algoritmu je vhodné nejprve popsat podprogramy, které využívá. Prvním z nich je nastav limity. Vstupem je úloha DTPN, výstupem limity pro zahájení přepravy pro prvních k dní, kde k je maximální doba přepravy mezi libovolným z dodavatelů a odběratelů. Všechny informace potřebné k nastavení velikosti polí a limitů pro jednotlivé dny jsou načteny z úlohy DTPN, která je vstupem do funkce. U dodavatelů jsou nastaveny limity pro příslušný den, celkové limity a jejich součet. Pro odběratele jsou nastaveny limity pro následujících k dní. Funkce nastav limity je použita pouze při zahájení výpočtu, nicméně je nezbytná. Další funkcí je funkce sestav LP. Má dva vstupní parametry: úlohu DTPN a limity pro každou časovou jednotku jednoho časového úseku. Na základě těchto
6.5
Dynamická dopravní úloha s dílčími limity přepravovaného množství
111
informací je sestaven matematický model, který respektuje požadavky zadání úlohy. Ten je vrácen v proměnné typu TLPproblem. Velmi důležitou je procedura aktualizuj limity. Ta, na základě optimálního řešení modelu, sníží stávající limity o hodnoty hledaných proměnných řešeného modelu. Vstupními parametry jsou úloha DTPN, vektor řešení stávajícího modelu a pořadové číslo dne přepravy. Vstupně-výstupním parametrem jsou limity, které do procedury vstupují tak, jak byly nastaveny v předcházející iteraci, a z procedury vystupují jako aktuální. Poslední funkcí je pridej vektor reseni. Vstupy do funkce jsou pořadové číslo dne přepravy a vektor optimálního řešení příslušného dne přepravy. Výstupem je vektor všech kladných proměnných všech stávajících dnů přepravy. 254 255 256 257 258 259 260 261 262 263
limity := nastav limity(dtpn); i := 0; repeat aktualizuj limity(dtpn, vektor, i, limity); lp := sestav LP(dtpn, limity); vyresit ulohu LP(lp); vektor := lp.x; pridej vektor reseni(i, vektor, vektorAll); i := i + 1; until ((limity.dodavateleCELKEM = 0) or (limity.odberateleCELKEM = 0)); Algoritmus hledání řešení je popsán na řádcích 254–263 zdrojového kódu. Při zahájení výpočtu jsou nejprve nastaveny limity na řádku 254 a pořadové číslo dne přepravy je nastaveno na nulu, viz řádek 255. Mezi řádky 256–263 se nachází cyklus repeat, ukončený splněním první z podmínek vyčerpání celkového limitu dodavatelů, resp. odběratelů. Uvnitř cyklu dojde nejprve k aktualizaci limitů na základě řešení nalezeného v předcházejícím kroku. Při prvním průchodu cyklem je vektor řešení prázdným polem, takže výstupem funkce je stejná proměnná limity, jaká do funkce vstupovala. Při dalších voláních funkce se již hodnota proměnné limity na vstupu a výstupu nerovná. Na řádku 258 následuje sestavení úlohy LP a na následujícím řádku její vyřešení. Optimální řešení modelu se nachází ve vektoru x proměnné lp, nicméně toto řešení je na řádku 260 přiřazeno proměnné vektor. Následuje přidání vektoru optimálního řešení příslušného dne k řešení všech stávajících dní, viz řádek 261 a na dalším řádku zvýšení počítadla dní. Ukončení cyklu neznamená ukončení programu. Proměnná reseni obsahuje seznam všech nenulových proměnných. Ty budou nyní nakopírovány do proměnné tabulka datového typu Tglobal tak, aby mohla být vstupem do dalších funkcí. Dalšími funkcemi knihovny jsou výstupní funkce dtpn tiskni jizdy, dtpn tiskni DO a dtpn tiskni promenne. Při jejich tvorbě funkcí se vycházelo z podobných funkcí pro úlohy typu DTP popsaných v kapitole 6.4.1. Výstupy funkcí jsou stejné, s výjimkou zbývajících kapacit, resp. požadavků jednotlivých dodavatelů či odběratelů. V úloze DTP tyto limity nebyly stanoveny, proto v ní na rozdíl od úlohy DTPN chybí.
112
6
6.5.3
VLASTNí PRÁCE
Knihovna unit DTPN slow.pas
Tato knihovna vychází z algoritmu popsaného ve vlastní metodice v podsekci 5.3.3 na straně 58. Vlastní knihovna unit dtpn slow.pas mimo funkcí v ní definovaných využívá také knihovnu unit dtpn fast.pas, zejména pro import modelů a také pro odhad počtu dní potřebných k transportu. unit dtpn slow.pas function dtpn2lp(dtpn: TDTP N problem; pocetdni: integer): TLPproblem; function dtpn2model(dtpn: TDTP N problem; pocetdni: integer): string; function dtpn2lingo(dtpn: TDTP N problem; pocetdni: integer): string; function promenna(x: Tpromenna; pocetdni: integer): string; function vyresit ulohu DTPN slow(dtpn: TDTP N problem; var tabulka: Tglobal; var reseni: Treseni): string;
Obr. 23: Přehled procedur a funkcí knihovny unit dtpn slow.pas. Zdroj: vlastní práce.
První funkcí knihovny je dtpn2lp. Vstupními proměnnými jsou úloha DTPN a počet dní, pro který má být model sestaven. Výstupem je ekvivalentní model lineárního programování, který bude vyřešen. Pomocnými funkcemi knihovny jsou dtpn2lingo a dtpn2model. U obou je vstupem model DTPN a počet dní, pro který má být model sestaven. Pokud počet dní není uveden, sestaví se model pro odhadovanou dobu přepravy. Výstupem funkce je model DTPN jako úloha LP v textovém formátu, odděleném tabulátory. U funkce dtpn2model jsou názvy proměnných uvedeny pouze v hlavičce, ve vlastním modelu jsou jen koeficienty. U funkce dtpn2lingo je nutné použít názvu proměnných. K tomu slouží pomocná funkce promenna, která ve shodě s Lingem názvy proměnných tvoří ve tvaru S, index dodavatele, symbol x, den odeslání, podtržítko, D, index odběratele, symbol x, den dodání. Následně je sestaven model s názvy proměnných v tomto formátu. Obě funkce mají ještě jednu vlastnost. Pokud je počet dní, pro který má být model sestaven, větší než maximální odhadovaná doba přepravy, bude sestaven pouze model s maximální odhadovanou dobou přepravy. 264 265 266 267 268 269
{ rychlá verze, odhadnu maximální dobu přepravy } vyresit ulohu DTPN fast(dtpn,tabulkapom,reseni); { rozměr modelu } dodavatelu := dtpn.rozmery.dodavatelu; odberatelu := dtpn.rozmery.odberatelu; pocetdni:=length(tabulkapom.privezeno.zbyva);
6.5
270 271 272 273
Dynamická dopravní úloha s dílčími limity přepravovaného množství
113
{ pomalá verze, která dává optimální řešení } lp:=dtpn2lp(dtpn,pocetdni); vyresit ulohu LP(lp); reseni:=lp.x; Nejdůležitější funkcí knihovny je vyresit ulohu DTPN slow. Meritus funkce je popsán na řádcích 265–273 zdrojového kódu. Nejprve je na řádku 265 rychlým algoritmem nalezeno přípustné řešení. Následuje nastavení rozměrů modelu na řádcích 267–269. Pak je sestavena úloha LP s již odhadnutým počtem dní (řádek 271), která je vyřešena (ř. 272) a řešení modelu lp.x na řádku 273 přiřazeno do proměnné reseni. Po nalezení optimálního řešení problému dochází ve funkci již jen k nastavení velikosti polí a doplňování hodnot do výstupních proměnných tabulka typu Tglobal a reseni typu Treseni. Funkce vrací po ukončení kromě těchto dvou proměnných ještě čas potřebný k nalezení optimálního řešení. 6.5.4
Knihovna unit DTPN optimal.pas
unit DTPN optimal.pas function vyresit dtpn(dtpn: TDTP N problem; var LP: TLPproblem): string; function prepravovane mnozstvi(dtpn: TDTP N problem): real48; procedure vyresit ulohu(var lpc: TLPcanonicalform); procedure uprav ulohu(var lpc: TLPcanonicalform; lp: TLPproblem; pocetdni: integer); function hodnota Z(lpc: TLPcanonicalform): real48; procedure uprav ulohu LP(var lp: TLPproblem; prevoz: real48); function vyresit ulohu DTPN optimal(dtpn: TDTP N problem; var tabulka: Tglobal; var reseni: Treseni): string;
Obr. 24: Přehled procedur a funkcí knihovny unit dtpn optimal.pas. Zdroj: vlastní práce.
Algoritmy realizované v této knihovně vychází z metodiky popsané v podsekci 5.3.4, uvedené na straně 61, přičemž pro danou úlohu bude nalezeno optimální řešení. V knihovně jsou mimo jiné použity podprogramy, definované v knihovně unit DTPN fast.pas. Nejdůležitější funkcí knihovny je funkce vyresit dtpn, která nalezne optimální řešení problému. Vstupem do funkce je model datového typu TDTP N problem, výstupem vyřešená úloha LP a čas v textovém formátu, potřebný
114
6
VLASTNí PRÁCE
k vyřešení jednotlivých kroků úlohy, kdy v každém kroku je přípustné řešení úlohy zkráceno o jeden den. Uvnitř funkce je definováno 5 podprogramů, jak je vidět na obrázku 24. Funkce prepravovane mnozstvi vrací menší hodnotu ze součtu kapacit dodavatelů a požadavků odběratelů. Bude využita při testování, zda již byl veškerý materiál přepraven. Vstupem a zároveň výstupem procedury vyresit ulohu je úloha LP v kanonickém tvaru. Jejím úkolem je nalézt optimální řešení úlohy. Byla definována proto, že v knihovně unit simplexka.pas je vstupem do této funkce běžná úloha LP, přičemž zde s ohledem na úpravy během výpočtu potřebujeme úlohu LP v kanonickém tvaru. Procerura uprav ulohu je nejdůležitější procedurou. Má 3 parametry: úlohu LP v kanonickém tvaru, tutéž úlohu v obecném tvaru a počet dní. Zde dochází ke snížení počtu dní přepravy, ve kterých je úloha přípustná. Úloha LP v obecném tvaru vstupuje do procedury z důvodu, že jsou v ní uvedeny informace o dni přepravy, zatímco v kanonickém tvaru téže úlohy tyto informace uvedeny nejsou. V této proceduře dochází k zajímavé situaci: zatímco vstupem je optimální řešení modelu, výstupem je nepřípustné řešení modelu s přepravou kratší o jeden den, který bude následně znovu vyřešen. 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
lp := dtpn2lp(dtpn, pocetdni); uprav ulohu LP(lp, prevoz); lpc := kanonicky tvar(lp); repeat vyresit ulohu(lpc); Zmax := hodnota Z(lpc); if Zmax = prevoz then { neoptimalni reseni } begin pocetdni := pocetdni - 1; { snizim pocet dni pro mozne reseni } uprav ulohu(lpc, lp, pocetdni); { aktualizuji ulohu } end; if ((Zmax < prevoz) and (lpc.pripustne)) then { optimalni reseni } begin for j := low(lp.x) to high(lp.x) do if (lpc.c[j].basic) then lp.x[j].mnozstvi := lpc.B[lpc.c[j].x] { bazicke = pravym stranam } else lp.x[j].mnozstvi := 0; { nebazicke promenne jsou rovny 0 } end; until Zmax < prevoz; Posledními dvěma podprogramy je funkce hodnota Z a procedura uprav ulohu. První z nich počítá hodnotu účelové funkce, která je následně použita pro test optimality. Druhý podprogram je spuštěn pouze jednou, hned po převodu úlohy na LP,
6.5
Dynamická dopravní úloha s dílčími limity přepravovaného množství
115
kdy přidává omezující podmínku garantující přepravené množství materiálu, a na základě indexu dne mění koeficienty účelové funkce na hodnoty 1, resp. 0. Nejdůležitější část algoritmů funkce vyresit dtpn je uvedena na řádcích 274–293. Zde dochází nejprve k vyřešení úlohy (řádek 278) a potom k testování, zda je či není nalezené řešení optimální, na řádcích 280 a 285 zdrojového kódu. Program cyklí tak dlouho, dokud není optimální řešení nalezeno. Úkolem funkce vyresit ulohu DTPN optimal je vyřešit a rozepsat příslušnou úlohu DTPN. Pro vlastní řešení je volána funkce vyresit dtpn. Po získání optimálního řešení je dané řešení rozepsáno do tabulky datového typu Tglobal a vektor optimálního řešení je vrácen v proměnné datového typu Treseni. 6.5.5
Konzolová aplikace dtpn.exe
Stejně jako u aplikace DTP.exe i zde je aplikace ovládána pomocí parametrů. První parametr udává soubor s modelem, který bude načten, a je povinný. Všechny ostatní parametry jsou nepovinné a nezáleží na pořadí jejich uvedení! Jejich přesný popis je uveden v tabulce 22. Tab. 22: Seznam volitelných parametrů programu DTPN.exe. Zdroj: vlastní práce.
-slow ... -optimal . . . -m ... -mx ... -l ... -lx ... -p ... -j ... -di ... -d* ... -oj ... -o* ...
pro výpočet použije algoritmus popsaný v podsekci 6.5.3, je hledáno optimální řešení modelu podle algoritmů z podsekce 6.5.4, vytiskne matematický model celé doby přepravy, vytiskne matematický model pro prvních x dní přepravy, vytiskne model pro Lingo pro celou dobu přepravy, vytiskne model pro Lingo pro prvních x dní přepravy, vytiskne seznam nenulových proměnných modelu, vytiskne tabulku jízd mezi všemi dodavateli a odběrateli, vytiskne seznam jízd i-tého dodavatele, i je kladné celé číslo, vytiskne seznam jízd všech dodavatelů, vytiskne seznam jízd j-tého odběratele, j je kladné celé číslo, vytiskne seznam jízd všech odběratelů.
Parametry aplikace se víceméně shodují s těmi v podsekci 6.4.4, proto budou dále rozepsány jen ty, které jsou nové, resp. u kterých došlo ke změnám. Úplně novými jsou parametry -slow a -optimal. V případě uvedení jednoho z nich je kladen důraz na kvalitu nalezeného řešení, pokud ani jeden z parametrů uveden není, je hledáno přípustné řešení modelu metodou fast, při kterém je kladen důraz na pokud možno minimální dobu výpočtu. Parametr -m sestaví matematický model. Je-li uveden bez přípony, vytiskne model s odhadovaným počtem dní převozu dle nalezeného řešení funkce vyresit ulohu DTPN fast. V případě, že je v příponě uveden počet dní, je sestaven model pro uvedený počet dní odvozu. Pokud je ale počet dní uvedený v parametru větší než odhadovaná doba přepravy, je sestaven model s odhadovanou dobou přepravy.
116
6
VLASTNí PRÁCE
Parametr -l sestaví model, který lze následně vyřešit v Lingu. Opět je možné použít pouze parametr -l, resp. přidat počet dní, pro který má být model sestaven. Význam je stejný jako u parametru -m. 6.5.6
Meření času výpočtů
Při návrhu algoritmů je dobré znát i dobu výpočtu, která je potřebná k nalezení řešení, zejména pro porovnání jejich rychlostí. 294 295 296 297 298 299 300 301 302 303
function x(parametry: Tparametry): string; var . .. cas: TDateTime; begin cas:=now; { zdrojový kód } . .. result:=FormatDateTime(’hh:mm:ss.zzz’, now-cas); end; Proto bylo do některých funkcí také implementováno měření doby jejich běhu. Ukázka funkce, která má tuto vlastnost implementovánu, je na řádcích 294–303 zdrojového kódu. Funkce, stejně jako její parametry je fiktivní, proto je nazvaná x. Při zahájení funkce je systémový čas uložen do proměnné cas datového typu TDateTime. Při ukončení běhu je vrácen rozdíl mezi aktuálním časem a časem zahájení běhu funkce, formátovaný jako textový řetězec, viz řádek 302 zdrojového kódu. Měření času bylo implementováno pouze v testovacích verzích aplikace, v její finální verzi, která je k dispozici na přiloženém CD, již čas měřen není. 6.5.7
Srovnání algoritmů
Pro srovnání výše popisovaných algoritmů bylo provedeno jejich otestování a vzájemné porovnání. Bylo náhodně vygenerováno 360 modelů o rozměrech od 2 do 7 jak dodavatelů, tak odběratelů. To znamená celkem 36 modelů různých velikostí, přičemž každá velikost byla zastoupena právě desetkrát. Jako optimalizační kriterium byla zvolena minimalizace doby odesílání materiálu. Tyto modely byly postupně vyřešeny, přičemž pro další zpracování bylo uloženo jak nalezené řešení, tak i časy výpočtů. Nagenerované modely včetně jejich řešení získané všemi 3 popisovanými algoritmy jsou k dispozici v přiloženém CD ve složce testovaci priklady/dtpn. Při dalším srovnání budou pro jednotlivé metody používány zkratky fast, slow a optimal, přičemž zkratkou fast se rozumí algoritmus popsaný v podsekci 5.3.2, slow v podsekci 5.3.3 a optimal v podsekci 5.3.4. Při posuzování kvality získaného řešení „vyhrálÿ algoritmus optimal, neboť ve 100 % řešených případů vracel optimální řešení. U algoritmu slow to bylo v 84 %
6.5
117
Dynamická dopravní úloha s dílčími limity přepravovaného množství
případů a u algoritmu fast ve 44 % případů. Zde je třeba podotknout, že z 16 % případů, kdy algoritmus slow vracel neoptimální řešení, byla většina řešení velmi blízká optimálnímu, což u algoritmu fast nelze tvrdit. Situace je viditelná i na průměrném získaném řešení. Považujeme-li hodnotu účelové funkce optimálního řešení za 100 %, potom průměrné řešení získané pomocí algoritmu optimal bylo 100 %. U algoritmu slow byla hodnota účelové funkce 101 %, což je řešení velmi blízké optimálnímu. V případě, že netrváme přímo na optimálním řešení, je většinou bez problémů použitelná. Průměrná hodnota účelové funkce u řešení získaného metodou fast je 115 %, což je již výrazná odchylka od optima. Největšího rozdílu v nalezených řešeních bylo dosaženo v příkladu 2. série o 3 dodavatelích a 2 odběratelích, kdy optimální řešení mělo hodnotu 125 dní přepravy, řešení získané metodou slow 159 dní přepravy a řešení získané metodou fast dokonce 219 dní! Variabilita řešení je zřejmá i na směrodatné odchylce poměru získaného a optimálního řešení, která u algoritmu slow činí pouhá 3 % a u algoritmu fast celých 32 %. Sloupcový graf, popisující kvalitu nalezeného řešení v procentech řešení optimálního, je k dispozici na obrázku 25. 100 90
relativní četnost v %
80 70 60 50 40 30 20 10 0 = 100 ≤ 105 ≤ 110 ≤ 115 ≤ 120 ≤ 125 ≤ 130 ≤ 135 ≤ 140 ≤ 145 ≤ 150 150 + nalezené řešení v % optimálního algoritmus optimal
algoritmus slow
algoritmus fast
Obr. 25: Porovnání kvality nalezeného řešení podle jednotlivých algoritmů. Zdroj: vlastní práce.
Z hlediska času, potřebného k nalezení řešení, je situace opačná. Zde je na první pohled vítězem algoritmus fast, jak je vidět na obrázku 27, ovšem s nezanedbatelným rizikem značného odchýlení se od optimálního řešení. Ve všech řešených modelech se čas výpočtu algoritmem fast pohyboval nejvýše kolem jedné vteřiny, proto jej lze považovat za velmi rychlý. Časy, získané metodami slow a optimal, jsou přibližně srovnatelné, přičemž algoritmus optimal je na řešených modelech asi o 7 % rychlejší. U něj, na rozdíl od
118
6
VLASTNí PRÁCE
algoritmu slow, navíc máme garantováno optimální řešení! Proto je na místě zvážit další reálnou využitelnost algoritmu slow. Pro všechny tři algoritmy byla hledána regresní funkce, která by nejlépe popsala závislost času výpočtu na počtu proměnných u řešeného modelu. Pro nalezení závislostí jednotlivých algoritmů byl zvolen lineární regresní model, konkrétně v dvojité logaritmické funkční formě. To proto, že s rostoucím počtem proměnných roste čas potřebný k nalezení řešení exponenciálně, a po jeho zlogaritmování dostaneme lineární model. Nalezené závislosti zlogaritmovaných proměnných, včetně regresních funkcí, jsou k dispozici na obrázku 26. U všech tří modelů se koeficient determinace pohyboval kolem hodnoty 0,9, což poukazuje na poměrně velkou část variability popsanou modelem, a tedy na jeho vhodnosti. Očekávané doby výpočtů získáme po odlogaritmování, pro algoritmus slow a optimal jsou k dispozici na obrázku 27. Vzhledem k vývoji funkční hodnoty času v porovnání s rostoucím počtem proměnných u algoritmu fast bylo přidání trendové funkce zbytečné. 10 8 b b b b b b b b b bb bb b b bb b b b b b b b bb b b b bb b b b b b b b b b b b bbb b b b b b b b b bb b b bb b b b b bb b bb b b b b b b b b bb b b b b b
6
b b
b b
b b b b b
b
b b
b bb b bb b bb bb b b b b b bb b bb b b b b b b b b bb bb b b b b b bb b b b b b bb b b b b b b b bb b b b b b b b b b b b bb b b b b b b b b b bb b b b b b b b b bb b b b b b b b b b bb b b b b b b b bb b b b b
y = ln(čas)
b
2
b b
b b b b b
0 b
b b
b b
b
b b
bb
bb b b b b b b b b bb b b b b b bb b b b b b b b b b b bb b b b b b b
bb
b b
b
b b
b
b b
b
bb
b
b b bb b bb b bb b b b b b b b bb b b
bb
b
b
b
b
b
b b
bb
b b bb bb b b b b bb bb b bb b b b b b bb b bb b b b b b b bb b b b bb b b b b b b b b b b b b b bb b b bb b bb b b b b b b b b b b bb b b b b bb b b b bb b b b bb b b b b bb b bb b b b b b b b b bb b b b b b b b b bb b b b b b b b b b b b b b b bb b b b b b b b b b b bb b b b bb b b b b b bb b b b b b b b b b b b b b b b bb b b b b b b b b bb b bb b bb b b b bb b b b b b bb b b b b b b b bb b
b
b
4
b
b
b
b
b
b
b
b
b
b
b
b bb
b b
b
b
b
b
b b
b
b
b
b b
bb b
b b b b b
b
b b
b
b b
b b
bb b b bb b bb b bb b b b b b b b b b b b
b b bb b
b b
b
b b b
b b
b
b b
b b b b
b
b
b b b b
b b b b
b b
b
b b b b b bb b b b b b b b b b bb b bb b b b b bb b b b b b b b b bb b b b b b b b b bb b b b b bb bb b b
b b b b
b
b b b
b b
b
b b
b
−2 −4
b
b
b b bb b
b
b b b
bb b
bb
bb
b
b
b b
bb
b
b bb
bb b
b
bb bb b
bb b b
b
b
b b b b
bb b
bbb
b
b
b
b
b
b
b b
b b b
bb b
b bb bbb
bbb
bbb
b bb
bb b
b
b bbb
bbb
b bb b
bb b
b
b
b b
bb
b
b bb
bb b
bb
b
bb bb
b b
b b
bb bbb bb
bb
b bb
b
bb
bb bbb
bb bbb
b
b bb b
−8
bb b
b
bb
b bb
b
bb
bb
bb bb b bbb bb b bbb bb b
bb
bb
bb
b b b
b bb b b bb
b
b b
b b
bbb
bb bb bbb bb b b b
b
−6
−10
bb b
b bb b b
b
b b b b bb b b
0 b
1
2
slow y = −14 + 2,46x
3 b
4 5 6 x = ln(proměnných) optimal y = −11,4 + 2,15x
b
7
8
9
10
fast y = −12,4 + 1,89x
Obr. 26: Závislost doby výpočtu na počtu proměnných v logaritmickém vyjádření. Zdroj: vlastní práce.
6.5
119
Dynamická dopravní úloha s dílčími limity přepravovaného množství
Jak se tedy chovají jednotlivé algoritmy v souvislosti s počty proměnných? U algoritmu slow a optimal v případě, že se počet proměnných změní o procento, zvýší se čas výpočtu o 2,46, resp. 2,15 procent. U algoritmu fast je to 1,89 procent. U něj je však třeba podotknout, že se to s ohledem na způsob hledání řešení týká jen počtu dodavatelů a odběratelů. Výsledný čas potom bude násoben počtem dní. To je také důvodem, proč je o tolik rychlejší, než zbývající dva algoritmy. Za zmínku stojí ještě čas, potřebný k nalezení prvního řešení v algoritmu optimal (tj. „optimálníhoÿ řešení pro výchozí počet dní) ve srovnání s dalšími kroky, kdy snižuji počet dní. Díky tomu, že dochází k úpravě již vyřešené úlohy, a nikoli řešení celé úlohy znovu pro počet dní snížený o jednotku, podařilo se snížit čas dalších kroků na zlomky času, který by jinak byl potřeba. Pokud vezmeme čas potřebný k nalezení optimálního řešení jako 100 %, potom pro nalezení prvního řešení bylo v průměru potřeba 97 % času čelého výpočtu a pro nalezení všech ostatních řešení již jen zbývající 3 % času výpočtu, při směrodatných odchylkách 7,8 %! V nejhorším případě bylo na první krok potřeba 56 % času a na zbývajících 25 kroků výpočtu 44 % času. V mnoha případech byl čas dohledání optima neměřitelný! Tato úprava by ovšem nebyla možná bez vytvoření vlastního softwaru pro řešení popisované úlohy, neboť dochází k modifikaci úlohy přímo v průběhu jejího řešení. Konkrétní časy řešení a výše popisovaná srovnání jsou uvedeny v přílohách D, E a F. 8000 b
7000 b
čas výpočtu (s)
6000 5000 b
4000
b b
b b b
3000 b
b
b
b
1000
b b bb b b b b b b b b b b b b b b b bb b b b bb b b b b bb b b b b b bb bb b bb b b b bb b bb b b bb bb bb b b b b b b b b b b b bb b b b b b b b b b bb b b b b b b b b b b b b b b bb b b b b b b b b b b b b bb b b b b b b b b b b b b b b b b b b b b b b bb bb b b bb b b b b b b b b b b b b bb b b b b b bb b b b b b b bb b bb b b bb b bb b b bb b b b bb bb bb b b bb bb b bb b b bb b b b b bb bb bb bbb bb b b bb b bb bb bb bb b bb bb bb bb bb b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b
b
b
0 0
bb
b
1000
b
b b
b b
b b
b b b
b
b
b b bb b b bb b b b b b b b bb bb b b b b b b b b b bb b b b b b b b b b b b b b b b bb b b b b b b b b b b bb b b b b b
b
b b b
b bb
b
b b
b
b
b
b b
b
b
b b
b b b b
b bb b bb b
bb
b b bb
b
b
b b
b b b
b b bb
b b
b b
b
b b
bb bb
bb
bb b
b bb
b
2000
b
b
b b
b b
b b bb
b bb b
b
b
b
b
b b
b
b
b
b
b
b
b
b
2000 3000 4000 5000 6000 7000 počet proměnných = dodavatelů × odběratelů × počet dní
algoritmus slow
b
algoritmus optimal
b
algoritmus fast
Obr. 27: Porovnání časů výpočtů jednotlivých algoritmů. Zdroj: vlastní práce.
b
8000
120 6.5.8
6
VLASTNí PRÁCE
Přeprava sklízeného ovoce
Ovoce je hromadně vykupováno v 5 výkupnách. Z nich je třeba jej urychleně dopravit do jednoho ze 3 zpracovatelských podniků. V tabulce 23 je dána doba přepravy mezi jednotlivými výkupy a zpracovatelskými podniky, a to ve dnech. Dále jsou v tabulce uvedeny maximální denní a celkové limity pro jednotlivé výkupy a zpracovatelské podniky. Úloha je nevyvážená, celková kapacita výkupen je nižší, než celkové požadavky zpracovatelských podniků. Přeprava probíhá každý den v týdnu, bez omezení přepravní kapacity na cestě. Denní limity jednotlivých stran přepravy se mohou s ohledem na den v týdnu měnit. Přeprava byla zahájena ve čtvrtek. Nalezněte přepravní plán, minimalizující dobu potřebnou k přepravě ovoce z výkupů do zpracovatelských podniků. Tab. 23: Základní údaje o úloze. Doba přepravy je ve dnech, množství v tunách. Zdroj: vlastní práce. V1 V2 V3 V4 V5 po út st čt pá so ne celkem
ZP1 5 3 2 5 3 120 120 120 120 120 120 120 5000
ZP2 3 1 4 4 4 70 70 0 70 70 40 0 3500
ZP3 4 3 5 4 1 90 90 90 90 90 0 0 2800
po 50 0 90 70 60
út 50 40 90 70 60
st 30 40 90 0 60
čt 50 40 90 70 60
pá 50 40 90 70 60
so 30 40 50 70 30
ne 0 40 0 70 30
celkem 1500 900 3000 2500 2100
Pro vyřešení bude použita konzolová aplikace dtpn.exe. Při řešení dojde k podrobnému komentování jednotlivých kroků výpočtu. Pro nalezení optimálního řešení je třeba spustit aplikaci dtpn.exe s parametrem -optimal. Model byl zkušebně vyřešen jak pomocí algoritmu popsaném v podsekci 5.3.3, tak i s pomocí algoritmu z podsekce 5.3.4. Počet dní transportu se v obou případech shodoval, proto bylo použito řešení získané metodou z podsekce 5.3.3. V případě, že je aplikace spuštěna bez tohoto parametru, je preferována rychlost výpočtu oproti kvalitě získaného řešení a je použit algoritmus popsaný v podsekci 5.3.2. Po spuštění je volána funkce vyresit ulohu DTPN optimal, která nalezne optimální řešení modelu. Jejím prvním krokem je horní odhad počtu dní potřebných k transportu, tak, aby mohl být následně sestaven matematický model. To zajistí funkce vyresit ulohu DTPN fast. Získání tohoto orientačního řešení je otázkou velmi krátkého času v řádu zlomků vteřiny. Na základě výsledku bude určen třetí rozměr modelu – počet dní, pro který bude mate-
6.5
121
Dynamická dopravní úloha s dílčími limity přepravovaného množství
matický model sestaven. Transport byl uskutečněn během 59 dní. Vzhledem k tomu, že se jedná o přípustné řešení úlohy, v žádném případě nemůže transport trvat déle. Nyní je spuštěna funkce dtpn2lp, která matematický model sestaví. Celkem se v něm bude vyskytovat 5 dodavatelů, 3 odběratelé a 59 dní, kdy bude ovoce odesíláno z výkupen, plus 5 dní potřebných na dodání již odeslaného ovoce do zpracovatelských podniků. Rozměry modelu jsou tedy 5 · 3 · (59 + 5) = 960 proměnných a 59 · 5 + (59 + 5) · 3 + 5 + 3 = 495 omezujících podmínek. Po sestavení modelu následuje přidání 496. omezující podmínky dle vzorce (64) ze strany 61 a změna koeficientů účelové funkce na hodnoty 1 pro proměnné reprezentující prvních q − 1 dní a na 0 pro proměnné reprezentující q-tý den odvozu. Tato úloha je potom řešena podle algoritmu popsaného v podsekci 5.3.4 tak dlouho, dokud není splněno kriterium optimality dle vzorce (66) na straně 62. Optimální řešení modelu je následně rozepsáno to tabulky datového typu Tglobal a jsou dopočítány dílčí sumy po jednotlivých dnech jak pro dodavatele, tak pro odběratele. Následně je podle parametrů vypsáno řešení. Parametry jsou podrobně popsány v podsekci 6.5.5, přičemž jejich počet je libovolný. 350
množství ovoce v t
300 250 200 150 100 50 0 1
8
15
množství odeslaného ovoce
22 29 den přepravy
36
43
50
množství dodaného ovoce
Obr. 28: Graf přepravovaného množství ovoce v jednotlivých dnech. Zdroj: vlastní práce.
Vyřešením modelu bylo zjištěno, že za stávajících podmínek lze veškeré ovoce přepravit z výkupen do zpracovatelských podniků během 50 dní. K expedování ovoce z výkupen bude docházet celkem 46 dní, přičemž od 47. do 50. dne již žádné ovoce nebude odesíláno, nýbrž bude pouze na cestě k odběratelům. Celkové množství odeslaného a dodaného zboží v jednotlivých dnech je možno zjistit z obrázku 28. Zde, na rozdíl od dynamické dopravní úlohy bez limitů, není možné úlohu vyřešit pro jeden časový úsek a následně ji rozepsat do celé doby přepravy. Příčinou jsou dílčí
122
6
VLASTNí PRÁCE
limity jednotlivých stran přepravy. To je vidět i na obrázku 28, kde sice pravidelně dochází ke snížení přepraveného množství zboží na konci týdne, nicméně přeprava ve stejných dnech různých týdnů se od sebe odlišuje. Tab. 24: Přehled množství odesílaného ovoce při zahájení a ukončení . Zdroj: vlastní práce. Odkud Kam Den 1 (čt) Den 2 (pá) Den 3 (so) Den 4 (ne) Den 5 (po) Den 6 (út) .. . Den 40 (po) Den 41 (út) Den 42 (st) Den 43 (čt) Den 44 (pá) Den 45 (so) Den 46 (ne) Odesláno
D1 O1 O2 O3 50 30 20 30 20 30 50 .. .
D2 O1 O2 O3 40 40 40 40 10
30 .. .
30 20 20
700 540 260
600 180 120
D3 O1 O2 O3 90 90 50 90 90 .. . 20 70 10 40 20 70 70
D4 O1 O2 50 20 40 30 20 70 30 40 .. .
O3 20 10 40 50
70 20
D5 O1 O2 O3 30 30 60 30 10 20 60 10 50 .. . 60 40
70
990 690 1320
30 1320 340 840
30 1390 450 260
Vzhledem k tomu, že přeprava probíhá během 50 dní, je zbytečné podrobně rozepisovat celý její průběh. Proto bude v tabulkách 24 a 25 zobrazeno pouze zahájení a ukončení přepravy. Pro lepší orientaci v přepraveném množství jsou k dispozici ještě obrázky 29 a 30, ve kterých jsou přehledně zobrazena celkově odeslaná množství ovoce. Princip hledání optimálního řešení využívá faktu, že cena ovoce odeslaného během prvních q − 1 dní má cenu odpovídající jeho hmotnosti, zatímco ovoce odeslané v q-tém dni má nulovou cenu, ale odesláno být musí. Úloha je maximalizační a algoritmus se proto snaží veškeré ovoce odeslat v jiném než posledním možném, tj. q-tém dni. Postupným snižováním q dochází ke snižování počtu dní potřebných k přepravě až do doby, kdy již není možné odeslat veškeré ovoce během q − 1 dní. V tomto momentu máme nalezeno optimální řešení. Protože byl model nevyvážený, nedošlo k uspokojení 2. výkupny, která bude mít nevyužitou výrobní kapacitu ve výši 1 300 tun ovoce. Tuto situaci při sestavování modelu není třeba nijak ošetřovat. Stačí, když u všech omezujících podmínek popisujících celkové odeslané, resp. dodané množství ovoce, bude znaménko „≤ÿ. Tím je zaručena přípustnost získaného řešení (neboť i ostatní omezující podmínky jsou nerovnicemi typu „≤ÿ). Podobně by tomu bylo i v situaci, kdy by nabídka ovoce převyšovala poptávku po ovoci. I zde by model nalezl takové řešení, které by ovoce rozvezlo v co nejkratším termínu, přičemž jeden či více dodavatelů by nedodali celou svou nabídku. Ani zde by nebylo třeba tuto situaci ošetřovat.
6.5
123
Dynamická dopravní úloha s dílčími limity přepravovaného množství
350
množství odeslaného ovoce v t
b
b b
b
b
b
b
b
b b
300 b
b b
b b
b
b
b b
b
b b
b
250 b
b
b
b b
b b
200 b b
150 b
b b b
100
b b
b b
b b
b b
b
50
b
b b
b
b
b
b
b
b b
b
b
b
b
b
b
b
b
b b
b
b
b
b b
b
b
b
b
b
b
b b
b
b
b
b
b
b
b
b
b
b
bb b
b
b
b
b
bb b
b
b b
b b
b
b
b
b
b
b
b b
b
b
b
b
b
b
b
b
b b
b b
b
b
b
b
b
b
b b
b
b
b
b
b
b
b
b
b b
b b
b b
b b
b
b
b
b
b
b
b b
b
b
b
b
b
b
b b
b
b b
b
b
b b
b
b
b
b b
b
b
b
b
b
b
b
b
b b
b
b
b
b b b
b b
bb b
b
b
b b
b b
b b b
b
b
b b
0 b
b
1
b
b
b
8
b
D1
b b
b b
15 b
b
b
D2
b b
b
b b
b b
b b
22 29 den přepravy b
b
b
b b
D3
b
D4
b b
b b
36 b
b
b
b
b
bb
b
bb
bb
43
bb
bb
50
b b
D5 b
celkem odesláno
Obr. 29: Graf odesílaného množství ovoce v jednotlivých dnech. Zdroj: vlastní práce.
Závěrem lze tedy konstatovat, že při dodržení přepravního plánu bude k odeslání ovoce potřeba 46 dní a k jeho dodání celkem 50 dní. Kompletní rozpis jízd, ze kterého je možné vyčíst seznamy jízd jednotlivých dodavatelů a odběratelů, je pro úplnost uveden v příloze G.
124
6
VLASTNí PRÁCE
Tab. 25: Přehled množství dodaného ovoce při zahájení a ukončení přepravy. Zdroj: vlastní práce. Kam Odkud Den 1 (ct) Den 2 (pa) Den 3 (so) Den 4 (ne) Den 5 (po) Den 6 (ut) Den 7 (st) Den 8 (ct) .. .
O1 D3 D4
D1 D2
D5
D1
O3 D3 D4 D5
D1 D2
40 40
90 90 50 40
30 60 30 10
50 20 30
90 90 .. .
Den 43 (ct) Den 44 (pa) Den 45 (so) Den 46 (ne) Den 47 (po) Den 48 (ut) Den 49 (st) Den 50 (ct) Dodáno
O2 D2 D3 D4 D5
30
30 40 30
50 20
40
20 10 40 50
30 40 .. .
10 20
50 20
20
60 40
30
.. . 50 40 70
10 30 70 40
20 60 50 40
20
20 70 70
70
30 30 540 180 690 340 450
700 600 990 1320 1390
260 120 1320 840 260
350
množství dodaného ovoce v t
300 b b
b
b b
b
b
b b
b
b
b b
b
b
b b
b
b
b b
b
b
250 b b b b b b b
200 b b b b b
150 b b
bb b
b
b
b
bb b
b
b
b
b
b
bb b
b
b
b
b
b
bb b
b
b
b
b
b
bb b
b
b
b
b
b
bb b
b
b
b
b
b
100 b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b b
b
50
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
b
bb b
bb
b
bb
bb
b
bb
0
b
b
b
1
b
b
b
b
b
8
b
15 b
b
O1
b
b
b
b
b
22 29 den přepravy b
b
O2
b
b
b
b
36
b
b b
b
b
43
b b
O3 b
celkem dodáno
Obr. 30: Graf dodaného množství ovoce v jednotlivých dnech. Zdroj: vlastní práce.
b
bb
b
50
7
7
DISKUZE
125
Diskuze
Potřeba přepravy nejrůznějších věcí sahá do lidského dávnověku. Od nepaměti byly z nejrůznějších důvodů přepravovány komodity či jiné zboží napříč celým tehdy známým světem. Nejinak je tomu dnes. Dá se říci, že potřeba přepravy nabyla na významu a pro nezanedbatelnou část populace je její bezchybné fungování otázkou bytí či nebytí. S neustále vzrůstajícími cenami pohonných hmot vyvstává problém racionalizace přepravy. Co si však představit pod pojmem racionalizace? Na problematiku přepravy se dá nazírat podle nejrůznějších kriterií. Co je z objektivních důvodů pro jednoho nezbytné kriterium, je pro dalšího nepodstatné. Z toho důvodu bylo popsáno mnoho problémů, které bylo potřeba vyřešit. Některé z nich mají to štěstí, že pro ně existuje matematický aparát, který je schopen je vyřešit za „rozumnouÿ dobu. Jiné, např. problém obchodního cestujícího, toto „štěstíÿ nemají a algoritmus, schopný nalézt optimální řešení v rozumném čase prozatím přes enormní úsilí není znám. Proto by také při návrhu algoritmů měla být brána v potaz i jejich časová složitost, a v případě, že existuje možnost volby z vícero metod, zvolit tu s nejnižší časovou složitostí. Běžné modely dopravních úloh patří do kategorie modelů lineárního programování, i když se jedná o jejich speciální případ. To je obrovskou výhodou s ohledem na výše zmiňovaný čas potřebný k jejich vyřešení. Avšak modely, jak jsou známy a popsány, jsou kriteriálně zaměřeny na minimalizaci nákladů na dopravu, přičemž kriterium minimalizující dobu potřebnou k přepravě v těchto modelech úplně chybí. Tak jak jsou klasické dopravní úlohy definovány, nejsou pro minimalizaci časové náročnosti použitelné. Avšak praxe ukázala, že existují případy, kdy je třeba tyto netypické modely dopravních úloh řešit. Vzhledem k tomu, že autorovi nebyla známa metodika jejich řešení, bylo nutné ji navrhnout. Při návrhu metodiky řešení modelů byla definována prioritní snaha řešit modely optimálně, suboptimální řešení bylo shledáno nedostatečné a připadalo by v úvahu jen tehdy, pokud by nalezení řešení optimálního bylo s ohledem na složitost algoritmu neúměrně časově náročné. A z důvodu dříve zmiňovaných vlastností simplexové metody byly preferovány úlohy lineárního programování. Až v případě, že by se to nepodařilo, by byly hledány jiné metody vedoucí k nalezení (sub)optimálního řešení. Protože byla snaha vyřešit sestavené modely pokud možno s pomocí metod lineárního programování, byly v praktické části nejprve vytvořeny knihovny se simplexovou metodou schopné vyřešit úlohy lineárního programování. Pro tvorbu byl zvolen jazyk Delphi. Aby byly tyto knihovny funkční a v praxi použitelné, bylo nutné se vyvarovat „tradičníchÿ problémů, které mohou vzniknout, jako je např. zacyklení. To byl poměrně očekávaný problém. Méně očekávaným problémem byla problematika zaokrouhlování při výpočtech. Při počítačových výpočtech dochází k převodu čísel z dekadické do dvojkové soustavy. Při tomto převodu může v desetinné části dojít k nepřesnostem. Tyto nepřesnosti, společně se zaokrouhlovací chybou, způsobovaly neočekávané chování programu, kdy docházelo k výběru pivota z políček, která
126
7
DISKUZE
měla být nulová, resp. i přes použití necyklícího algoritmu docházelo k zacyklení. Tyto problémy odstranila až tolerance zaokrouhlovacích chyb, kdy číslo menší než zvolená přesnost bylo považováno za nulové. Při porovnávání dvou čísel byla tato tolerance, vzniklá možnou chybou při převodu do dvojkové soustavy či zaokrouhlováním, brána také v potaz. Těmito kroky došlo k úplné eliminaci tohoto nežádoucího efektu, aniž by došlo k poznatelnému snížení přesnosti výsledků nalezeného řešení. Při tvorbě knihovny se simplexovým algoritmem došlo k modifikaci Blandova algoritmu, který vylučuje možnost zacyklení. V podstatě se jednalo o kombinaci běžně používaného způsobu výběru pivota, v kombinaci s Blandovým algoritmem. V případě, že pivot zvolený běžným způsobem garantoval kladnou změnu účelové βi > 0, k zacyklení nemohlo dojít, a proto byl ponechán vybraný. funkce, tj. ∆j · αir βi Pokud celková změna účelové funkce byla nulová, tj. ∆j · = 0, k zacyklení doαir jít mohlo, a proto bylo klíčové políčko zvoleno podle Blandova algoritmu. Počet kroků a čas výpočtu obou metod byl testován na různých typech úloh. Šlo o obecné úlohy LP, o modely „klasickýchÿ dopravních úloh a přiřazovací problémy. Pro testování bylo náhodně vygenerováno větší množství úloh různých rozměrů (konkrétně 600 modelů přiřazovacího problému a dopravních úloh a 110 obecných modelů LP). Každá úloha byla vyřešena jak Blandovým, tak i modifikovaným Blandovým algoritmem, přičemž po jejím vyřešení byl uložen počet kroků potřebných k nalezení optimálního řešení a čas výpočtu. Nejprve byla testována závislost mezi počtem kroků a časem výpočtu. Zde se jedná o téměř funkční závislost, kdy koeficient korelace r > 0,99. Nevysvětlenou část závislosti lze připsat na vrub stavu počítače, ve kterém se nacházel při spuštění algoritmu. Proto byl nadále považován vztah mezi počtem kroků a dobou výpočtu za funkční závislost. Dalším cílem bylo ověřit, že modifikovaný Blandův algoritmus je prokazatelně rychlejší než Blandův algoritmus. K testování byl použit jednostranný test o shodě dvou středních hodnot. Předtím ale byla doba řešení otestovaná na normalitu rozdělení. V případě, že se nepodařilo vyvrátit normalitu rozdělení, byl použit parametrický test, v opačném případě test neparametrický. Co se týká normality rozdělení, v některých případech se nepodařilo zamítnout hypotézu o normalitě rozdělení času výpočtu, v jiných ano. Každopádně u všech testovaných souborů se podařilo zamítnout hypotézu o shodě dvou středních hodnot s p-hodnotou menší než 0,001, z čehož vyplývá, že modifikovaný Blandův algoritmus je statisticky významně rychlejší než Blandův algoritmus. Z tohoto důvodu byl pro další výpočty používán již jen modifikovaný Blandův algoritmus. S ohledem na kontrolu správnosti řešení byla vytvořena konzolová aplikace lp2lingo.exe, která dokáže převést model LP do formátu jazyka Lingo. Protože se jedná o konzoli, existuje zde možnost hromadného zpracování modelů. Tyto modely pak stačí jen otevřít v programu Lingo a stiskem jediného tlačítka vyřešit. Dalším z výstupů, který byl vytvořen, byla možnost automatické sazby příslušného modelu LP do formátu pro TEX. Opět se jedná o konzolovou aplikaci, přičemž
7
DISKUZE
127
tato možnost byla vytvořena zejména z důvodu jednodušší sazby modelů v disertační práci. Ačkoli se u obou výše zmiňovaných konzolových aplikací nejedná o stěžejní část disertační práce, obě mohou najít samostatné uplatnění, např. při zpracování závěrečných prací, resp. sazbě skript aj. Jedním z vedlejších efektů řešení modelů dopravních úloh byla konzolová aplikace, řešící směšovací problém. Zde se jednalo o konkrétní požadavek firmy, která vyvíjí informační systém pro podník zabývající se výrobou krmných směsí. Na autora disertační práce se obrátila především proto, že nebyla schopna samostatně implementovat funkční simplexový algoritmus. Úkolem této konzolové aplikace bylo nalézt takovou kombinaci vstupních surovin, která by při splnění omezení daných modelem minimalizovala celkovou cenu vstupních surovin. Pro vlastní optimalizaci byly využity knihovny řešící simplexovou metodou modely lineárního programování. Po dohodě s pracovníky vyvíjejícími informační systém bylo nutné původní knihovnu upravit tak, aby vyhovovala jejich požadavkům, zejména co se týká formátu vstupních a výstupních dat. Po důkladném otestování byl program v dané podobě akceptován a v tuto chvíli je ve firmě denně používán. Dalším krokem byl návrh a řešení dopravních úloh minimalizujících čas přepravy. Zde byly řešeny celkem dva typy úloh. U první z nich, pracovně nazvané DTP, bylo určeno celkové množství materiálu k přepravě, doba přepravy a limity během jednotlivých dní. Druhá, nazvaná DTPN, se od první liší ve skutečnosti, že jednotliví dodavatelé, resp. odběratelé, mají určené vlastní celkové kapacity, resp. požadavky na materiál. Cílem obou metod bylo minimalizovat dobu přepravy. Řešení úlohy DTP je poměrně jednoznačné. Vzhledem k tomu, že není určeno, jaké celkové množství materiálu má být od jednotlivých dodavatelů odvezeno, resp. k jednotlivým odběratelům přivezeno, stačilo nalézt optimální řešení přepravy pro jeden časový úsek (týden) a ten rozepsat na celou dobu přepravy. Výhodou tohoto přístupu je poměrně malý model, kdy počet proměnných odpovídá násobku počtu dodavatelů, odběratelů a časových jednotek jednoho časového úseku. Malý model pozitivně ovlivnil i čas potřebný jeho k vyřešení. Jako kriteriální funkce je zvolena maximalizace přepraveného množství materiálu. Po nalezení optimálního řešení je následně proveden druhý krok, kdy je ze všech optimálních řešení modelu, garantující přepravené množství materiálu v daném časovém úseku, vybráno to, u něhož je nejmenší časová náročnost přepravy (tj. minimální skalární součin doby přepravy a přepravovaného množství materiálu). V podstatě je provedena vícekriteriální optimalizace, kdy hlavním kriteriem je maximální přepravené množství materiálu v jednom časovém úseku a vedlejším kriteriem, v případě existence více optimálních řešení, je minimální časová náročnost přepravy mezi dodavateli a odběrateli. Pro navržený algoritmus byla vytvořena vlastní knihovna, která dokázala načíst model DTP v přesně definovaném formátu, sestavit ekvivalentní model pro jeden časový úsek a tento model následně vyřešit a rozepsat vyřešený model do celkové doby přepravy. Knihovna obsahuje upravenou datovou strukturu použitou pro řešení
128
7
DISKUZE
a dále obsahuje jednotlivé funkce a procedury. Úkolem každé z nich je spočítat některý z kroků algoritmu a vrátit mezivýsledek. Konkrétní činnosti jsou popsány ve vlastní práci v sekci 6.4. Dále byla vytvořena konzolová aplikace dtp.exe, která řeší popisovaný typ úlohy. Její ovládání je pomocí parametrů. Po jejím spuštění dojde nejprve k načtení modelu z uvedené adresy a jeho vyřešení. Následně, dle zadaných parametrů, je vypsán výsledek. Lze vypsat buď tabulku všech jízd během celého období, proměnné týkající se libovolného dodavatele či odběratele, či seznam kladných proměnných pro jeden časový úsek (týden). Také je možné vytisknout model LP jako text, oddělený tabulátory (vhodné pro Excel) anebo ekvivalentní model pro Lingo, pro kontrolu získaného řešení. Poslední částí, týkající se modelu DTP, byly ukázky dvou příkladů. V každém z nich bylo popsáno sestavení modelů včetně zadaných specifik a jejich vyřešení pro jeden časový úsek a rozepsání tohoto řešení do celého období. Nalezená řešení byla podrobně okomentována. První z nich se týkal přepravy materiálu, kde v rámci jednoho časového úseku byla pouze jedna časová jednotka. Druhý se týkal přepravy kalamitního dřeva. Dalším typem vyřešeného dopravního problému byl model s limity na stranách dodavatelů a odběratelů, pracovně nazývaný DTPN. Protože každá ze stran přepravy má rozdílné kapacity, resp. požadavky, nešel aplikovat princip použitý u modelu DTP. Resp. šel, ale negarantoval by optimální řešení. Proto musel být navržen jiný způsob řešení. Celkově byly navrženy 3 metody řešení, pracovně nazvané fast, slow a optimal. První dvě, fast a slow, optimální řešení negarantují. Třetí z nich vede pokaždé k optimálnímu řešení. Proč jsou popisovány 3 metody a ne pouze jedna, dávající optimální řešení? Metoda fast je nezbytná mj. pro odhad maximální doby přepravy a použije se u metod slow a optimal při sestavování modelu. Je tedy nezbytná a navíc velmi rychlá. Metoda slow vznikla ještě před metodou optimal, nicméně nedávala optimální řešení, proto byla upravena, a z ní vychází metoda optimal. S ohledem na její časovou složitost ve srovnání s metodou optimal není její další používání opodstatněno. Ať už je zvolena jakákoli metoda, úloha DTPN je definována tak, aby pokaždé bylo nalezeno optimální či přípustné řešení. Přeprava probíhá tak dlouho, dokud není buď vyčerpána kapacita dodavatelů nebo splněn požadavek odběratelů. Jakmile je splněna jedna ze dvou výše uvedených podmínek, přeprava se ukončí. Teoretická možnost neexistence přípustného řešení však existuje. V případě, že by celková kapacita některého z účastníků přepravy byla nenulová a kapacita všech časových jednotek (dní) v rámci sledovaného časového úseku (týdne) by byla nulová, řešení by nalezeno nebylo. To je však hraniční možnost. Princip metody fast spočívá v maximalizaci množství materiálu odeslaného v průběhu každého dne přepravy tak, aby zároveň nebyl překročen limit dodavatelů pro příslušný den. O hodnoty proměnných nalezeného řešení jsou sníženy požadavky odběratelů, je sestaven nový model a opět vyřešen. Takto se pokračuje, dokud existuje materiál k přepravě, resp. dokud nejsou uspokojeny požadavky odběratelů.
7
DISKUZE
129
Výhodou tohoto algoritmu je jeho rychlost, neboť ze všech tří navrhovaných algoritmů byl jednoznačně nejrychlejší. Nevýhodou je velká variabilita kvality nalezeného řešení, které se pohybovalo od optimálního až po více než 1,5násobek optimálního. Metoda slow také negarantuje nalezení optimálního řešení. Její princip spočívá v sestavení modelu pro celou dobu přepravy. Zde dochází ke zvláštní situaci. Doba přepravy je optimalizačním kriteriem a zároveň vstupem do modelu. K vyřešení tohoto zdánlivého paradoxu byl použit algoritmus fast. S jeho pomocí byla odhadnuta doba trvání přepravy, přičemž stačilo nalezení přípustného řešení. Pro tuto dobu přepravy byl sestaven model, přičemž princip minimalizace doby přepravy zde spočíval v postupném snižování ceny přepravovaného materiálu, až po nulové sazby poslední den přepravy. Tato účelová funkce výrazně zkracovala dobu potřebnou k přepravě, nicméně také negarantovala optimální řešení. Slabší stránkou metody je doba řešení, která se při změně počtu proměnných o 1 procento změní o 2,45 procent. Co se týká kvality optimálního řešení, nejlepší je metoda s pracovním názvem optimal. Model je podobný jako u metody slow, k odhadu doby přepravy se také použije metoda fast. U metody optimal je definován test optimality, proto lze jednoznačně určit, které řešení je optimální a kdy již nelze zkracovat dobu přepravy. Princip metody spočívá v postupném iterativním zmenšování prostoru pro dobu přepravy pomocí stanovování prohibitivních sazeb koeficientů dní s nejvyšším indexem. Koeficienty účelové funkce představující přepravu materiálu v prvních q − 1 dnech mají hodnotu jedna, q-tý den hodnotu nula. Ostatní dny, tj. q + 1 až q + r-tý den mají nastavenu prohibitivní sazbu účelové funkce. V případě, že je cena přepraveného materiálu menší než přepravované množství, je test optimality splněn. Při rovnosti této podmínky test optimality splněn není a doba povolené přepravy q je snížena o jeden den. Jako obrovská nevýhoda modelu se na první pohled jevil fakt, že pro nalezení optimálního řešení bude nutné model několikrát za sebou vyřešit, přičemž časová složitost je přibližně stejná jako u modelu slow. Tím by se stal model prakticky neřešitelný. Aby se této situaci předešlo, byla navržena dodatečná úprava na již vyřešeném modelu. Nejprve byl vyřešený model uložen a potom v něm byly postupně o jednotku zkracovány počty dní přepravy. Po každé změně byl model znovu vyřešen. To se opakovalo tak dlouho, dokud nebylo nalezeno optimální řešení. Pro tuto úpravu byla v příslušné knihovně vytvořena vlastní procedura. Zde došlo k největšímu překvapení v celé disertační práci. Čas, potřebný k dořešení modelu (tj. k vyřešení všech kroků s výjimkou prvního), byl jen zlomkem času, potřebného k nalezení prvního řešení. V nejlepším případě byl neměřitelný, v nejhorším činil součet časů potřebných k nalezení druhého přípustného až optimálního řešení 44 % času potřebného k nalezení prvního přípustného řešení. V průměru to byla 3 % celkového času výpočtu! Navíc podle přímého srovnání získaného z testovaných příkladů vycházela metoda optimal jako rychlejší v porovnání s metodou slow! Ačkoli i zde není složitost algoritmu nijak oslňující (u testovaných modelů vyšlo při zvýšení počtu proměnných o 1 % zvýšení doby řešení o 2,15 %), je rychlejší než metoda fast, přičemž je garantováno nalezení optimálního řešení.
130
7
DISKUZE
Nyní ještě k metodice testování. Bylo provedeno na náhodně vygenerovaných příkladech. Těch bylo vygenerováno celkem 360 o různých rozměrech a byly vyřešeny každou ze tří popisovaných metod, přičemž pokaždé bylo uloženo optimální řešení a čas potřebný k jeho nalezení. U metody optimal byl navíc ukládán počet kroků, potřebných k nalezení optimálního řešení a jejich čas. U všech úloh byla optimalizačním kriteriem minimalizace počtu dní odeslání. V případě, že by bylo potřeba minimalizovat počet dní dodání, postupovalo by se analogicky s tím rozdílem, že prohibitivní sazba a nulové koeficienty účelové funkce by se určovaly podle dne dodání. Poslední částí v rámci úlohy DTPN byla prezentace praktického příkladu týkajícího se sezónní přepravy ovoce. Bylo popsáno zadání modelu, jeho sestavení a vyřešení. Nalezené řešení bylo okomentováno a pro vyšší přehlednost byly některé části graficky zobrazeny.
8
8
ZÁVĚR
131
Závěr
Při řešení praktických problémů vyvstala potřeba řešit dopravní úlohy, jejichž optimalizačním kriteriem je minimalizace času, potřebného k přepravě. Jednalo o specifické problémy, pro které nebyly nalezeny metody řešení. Cílem disertační práce bylo navrhnout způsob řešení těchto popisovaných problémů. Sestavování modelů a způsob jejich řešení je popsán v kapitole 4. S ohledem na časovou složitost bylo jedním z prioritních cílů vyřešit modely pomocí metod lineárního programování. S nutnými modifikacemi, které jsou v práci popsány, se tento požadavek podařilo splnit. Dalším z cílů bylo vytvoření softwaru řešícího popisované modely. Pro jeho tvorbu byl zvolen programovací jazyk Delphi. V této souvislosti bylo nutné vytvořit stabilní knihovnu, řešící úlohy lineárního programování. To se podařilo, knihovna byla důkladně otestována a dále byla používána pro řešení popisovaných modelů. Poměrně nečekaným benefitem bylo využití lehce modifikované knihovny řešící úlohy LP ve firmě zabývající se mícháním krmných směsí. Zde bylo hledáno řešení, které minimalizuje náklady na vyráběnou krmnou směs. Prvním řešeným modelem byl model s celkovým množstvím materiálu k přepravení, pracovně nazývaný DTP. Jeho podstatou byla maximalizace přepraveného množství materiálu za jeden časový úsek (týden). Byla vytvořena knihovna, která je schopna tyto modely řešit. Pro nalezení optimálního řešení bylo využito vícekriteriální optimalizace, kdy v prvním kroku došlo k maximalizaci přepravovaného množství materiálu během jednoho týdne. V případě existence více optimálních řešení byla použita lexikografická metoda. Nalezené řešení bylo zafixováno a byla sestavena nová minimalizační účelová funkce, jejíž koeficienty obsahují doby přepravy mezi dodavateli a odběrateli. Po nalezení optimálního řešení pro jeden časový úsek byl model rozepsán pro celou dobu přepravy. Na ukázku funkčnosti byl vyřešen problém minimalizace času přepravy kalamitního dřeva. Dalším modelem řešeným v práci, byl model s dílčími dodávanými a požadovanými množstvími materiálu, s pracovním názvem DTPN. Optimalizačním kriteriem bylo opět zkrácení doby přepravy materiálu na minimum. Způsob jeho řešení byl popsán v sekci 5.3, implementace navrhovaného řešení byla realizována v praktické části v sekci 6.5. V rámci tohoto modelu byly navrženy celkově 3 metody, fast, slow a optimal. Pro všechny tři metody byly vytvořeny vlastní knihovny, kde tyto metody byly implementovány. Metoda fast byla schopna velmi rychle nalézt přípustné řešení, nicméně s nejhorší průměrnou kvalitou nalezeného řešení. Metody slow a optimal byly časově srovnatelné, nicméně metoda optimal garantovala nalezení optimálního řešení. Jak u metody slow, tak i u metody optimal, bylo nutné pro odhad doby potřebné k přepravě (na základě které byl následně sestavován model) nejprve použít metodu fast. Pro srovnání rychlosti řešení a kvality nalezených bylo použito 360 náhodně vygenerovaných příkladů. K největšímu překvapením došlo při testování metody optimal. Ta byla navržena jako iterativní, kde v každém kroku je přípustné řešení zmenšeno o jeden den, přičemž se pokračuje, dokud je to možné. Tím překva-
132
8
ZÁVĚR
pením byla disproporce mezi časem potřebným pro nalezení prvního a všech dalších řešení. Pro realizaci prvního kroku bylo v průměru potřeba 97 % času a k dořešení všech zbývajících kroků 3 % času! Následkem této skutečnosti je v průměru o něco lepší čas potřebný k vyřešení úlohy metodou optimal ve srovnání s metodou slow. Pokud porovnáme výše uvedené skutečnosti s cíli práce, stanovenými na začátku, lze konstatovat jejich splnění. V disertační práci byl navržen způsob řešení netypických modelů dopravních úloh, včetně vytvoření softwarové podpory pro jejich vyřešení. Pokud jde o kvalitu nalezeného řešení, zde již není co optimalizovat, neboť u každého typu příkladu byla popsána metoda vedoucí k optimálnímu řešení. Kde však prostor pro optimalizaci nepochybně je, je časová složitost navržených modelů. Zde by stálo za zamyšlení, zda lze navrhnout novou či upravit stávající metodu, která by dosahovala stejných výsledků v lepším čase. Návrh rychlejší metody může být také jedním ze směrů, kam by se tato práce mohla dál ubírat. Tato potřeba by mohla být aktuální zejména v případě, že by z praxe přišel požadavek na řešení většího počtu tohoto typu úloh, resp. úloh větších rozměrů. Cílem disertační práce nebylo nalézt z hlediska časové složitosti optimální algoritmus, ale ukázat, že „tudy vede cestaÿ, že úloha je takto řešitelná. Tak jako v ostatních oborech lidské činnosti, i v rámci kvantitativních metod je nutné si uvědomit, že optimalizace (a kvantitativní metody obecně) mohou být dobrým sluhou, který nám dokáže usnadnit rozhodování, ale také zlým pánem, pokud se budeme rozhodovat pouze na základě získaných výsledků, bez hlubšího pochopení podstaty problému a jeho širších souvislostí.
133
LITERATURA
Literatura [1] 1001 tipů a triků pro Delphi. 2. vyd. Praha: Computer Press, 2002. 28 s. ISBN 80-7226-529-6. [2] Black, P. E. Dictionary of Algorithms and Data Structures. U.S. National Institute of Standards and Technology. 15 December 2004. Online version Accessed May 21, 2009. [3] Bland, R. G. ”New finite pivoting rules for the simplex method”. Mathematics of Operations Research 2 (2): 103–107, may 1977. [4] Budíková, M., Králová, M., Maroš, B. Průvodce základními statistickými metodami. 1. vyd. Praha: Grada, 2010. 272 s. ISBN 978-80-247-3243-5. [5] Bulantová, P. Využití lineárního programování při optimalizaci dopravy. Bakalářská práce. Brno: MZLU v Brně, 2008. [6] Cantú, M. Mastering Delphi 5. San Francisco: Sybex, 1999. 33 s. ISBN 07821-2565-4. [7] Černý, J. Základní grafové algoritmy [online]. [cit. 2012-08-23]. Dostupné z: http://kam.mff.cuni.cz/~kuba/ka/index.html [8] Češka, M. a kol. Vyčíslitelnost a složitost. Brno: CERM, 1992. ISBN 80214-0441-8. [9] Delphi Basics. [online]. delphibasics.co.uk/
[cit.
2012-08-25].
Dostupné
z:
http://www.
[10] Devlin, K. J., Pick, L. Problémy pro třetí tisíciletí: sedm největších nevyřešených otázek matematiky. 1. vyd. Praha: Dokořán, 2005. 269 s. Aliter. ISBN 80-7363-016-8. [11] Dlouhý, M., Fábry, J., Kuncová, M. Simulace pro ekonomy. Praha: VŠE, 2005. 152 s. ISBN 80-245-0973-3. [12] Dudorkin, J. Operační výzkum. Praha: ČVUT, 2002. 296 s. ISBN 80-0102469-5. [13] Fábry, J. Matematické modelování. 1. vyd. Praha: Professional Publishing, 2011. 180 s. ISBN 978-80-245-7431-066-9. [14] Geisser, S. Modes of Parametric Statistical Inference. John Wiley & Sons, Inc., 2006. ISBN-13: 978-0-471-66726-1. [15] Greenberg, H. J. An Example of Cycling in the Simplex Method. In: [online]. [cit. 2012-08-22]. Dostupné z: http://glossary.computing.society.informs.org/notes/cycling.pdf
134
LITERATURA
[16] Gnu Regression, Econometrics and Time-series Library. [online]. [cit. 2012-0825]. Dostupné z: http://gretl.sourceforge.net/ [17] Gros, I. Kvantitativní metody v manažerském rozhodování. 1. vyd. Praha: Grada, 2003. 432 s. Expert. ISBN 80-247-0421-8. [18] Hindls, R., Hronová, S., Seger, J., Fischer, J. Statistika pro ekonomy. Praha: VŠE, 2007. 415 s. ISBN 978-80-86946-43-6. [19] Holoubek, J. Ekonomicko matematické metody. Brno: Mendelova univerzita v Brně, 2010. 153 s. ISBN 978-80-7375-411-2. [20] Hušek, R. Ekonometrická analýza. 1. vyd. Praha: Oeconomica, 2007. 367 s. ISBN 978-80-245-1300-3. [21] Hynek, J. Genetické algoritmy a genetické programování. 1. vyd. Praha: Grada, 2008. 182 s. ISBN 978-80-247-2695-3. [22] Jablonský, J. Operační výzkum: kvantitativní modely pro ekonomické rozhodování.. 3. vyd. Praha: Professional Publishing, 2007. 323 s. ISBN 978-8086946-44-3. [23] Jablonský, J. Programy pro matematické modelování. Praha: VŠE, 2007. 258 s. ISBN 978-80-245-1178-8. [24] Kadlec, V. Delphi: hotová řešení. 1. vyd. Brno: Computer Press, 2003. 312 s. K okamžitému použití. ISBN 80-251-0017-0. [25] Klee, V., Minty, G. J., Shisha, O. ”How Good is the Simplex Algorithm?” In Inequalities 3. New York: Academic Press, 159–175, 1972. [26] Kopka, H., Daly, P. W. LATEX: kompletní průvodce. 1. vyd. Brno: Computer Press, 2004. 576 s. DTP & grafika. ISBN 80-7226-973-9. [27] LINGO 11 Online User’s Manual. Chicago: LINDO Systems Inc, 2008. [28] Lagová, M., Jablonský, J. Lineární modely. Praha: Oeconomia, 2009. 300 s. ISBN 978-80-245-1511-3. [29] Megiddo, N., Chandrasekarany, R. On the ε-perturbation Method for Avoiding Degeneracy [online]. [cit. 2012-04-28]. Dostupné z: http:// citeseerx.ist.psu.edu/index [30] Montgomery, D. C., Runger, G. C. Applied statistics and probability for engineers. 2. vyd. New York: John Wiley & Sons, 1999. 817 s. ISBN 0-47117027-5. [31] Nering, E. D., Tucker, A. W. Linear Programs and Related Problems, Academic Press, 1993.
LITERATURA
135
[32] NIST/SEMATECH e-Handbook of Statistical Methods [online]. [cit. 2012-0825]. Dostupné z: http://www.itl.nist.gov/div898/handbook/ [33] Nocedal, J., Wright, S. J. Numerical Optimization. New York: SpringerVerlag, 1999. [34] Rardin, R. L. Optimization in Operations Research Upper Saddle River, N.J.: Prentice Hall, 1998. 919 s. ISBN 0-02-398415-5. [35] Rašovský, M., Šišláková, H.Ekonomicko matematické metody. 1. vyd. Brno: Mendelova zemědělská a lesnická univerzita v Brně, 1999. 195 s. ISBN 80-7157-412-0. [36] Rybička, J. LATEX pro začátečníky. 3. vydání. Brno: KONVOJ, 2003. 238 s. ISBN 80-7302-049-1. [37] Rybička, J. Styl dipp.sty (verze 1.3) pro sazbu závěrečných prací v systému LATEX [online]. 2010 [cit. 2012-08-21]. Dostupné z https://akela.mendelu.cz/~rybicka/prez/zpract/zavprace/dipp.pdf. [38] Schrage, L. Optimization Modelling with LINGO. Chicago: LINDO SYSTEMS INC., 2006. 603 s. ISBN 1-893355-00-4. [39] Slovník technických pojmů. The Tech Terms Computer Dictionary [online]. [cit. 2012-08-25]. Dostupné z: http://www.techterms.com/. [40] Teixeira, S., Pacheco, X. Borland Delphi 6 Developer’s Guide. Sams Developer’s Guides. Sams, 2002. ISBN 9780672321153. [41] Todd, M. J. School of Operations Research and Information Engineering. [online]. [cit. 2012-08-22]. Dostupné z: http://people.orie.cornell.edu/ miketodd/or630/SimplexCyclingExample.pdf [42] Tyc, O., Holoubek, J. Výhody volby optimálního kriteria pro přechod k nové bázi v simplexové metodě. In Firma a konkurenční prostředí 2005, sekce 4 – Kvantitativní metody v hospodářství. Brno: KONVOJ, spol. s r. o., 2005, s. 168–177. ISBN 80-7302-100-5. [43] Vazirani, V. V. Approximation Algorithms. Springer-Verlag, 2001. ISBN 3540-65367-8.
Přílohy
A
A
137
MODEL SMĚŠOVACíHO PROBLÉMU
Model směšovacího problému
zmin = 0,9x1 + 15,5x2 + 12,9x3 + 2,5x4 + 7,2x5 + 9x6 380x1 + 160x2 + 313x3 + 15x5 1,4x1 + 10x2 + 500x5 0,2x1 + 229x2 + 181x3 + 0,2x5 0,6x1 + 53x3 + 384x4 + 0,3x5
+ 530x7
+ 24,7x8
+ 37,2x9
+ 1 300x10
+ 0,1x7
+ 325x11
+ 55x12 + 260x13
+ 650x14 + 370x15
+ 400x16 + 2 012x17 + 119,85x18
+ 266x10 2 200x13
0,01x1 0,15x1
+ 235 000x11 + 456 000x10 38x4
+ 2 200x13
+ 640 000x7
2x5
+ 240 000x12 500 000x15
10x1 110x1
+ 9x4
+ 10x5 + 3 000x5
+ 750 000x9 + 620 000x8 500 000 000x16 1 000 000 000x14 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16
x1 x1 ,
+ x2 x2 ,
+ x3 x3 ,
+ x4 x4 ,
+ x5 + x6 x5 , x6 ,
+ x7 x7 ,
+ x8 x8 ,
+ x9 x9 ,
+ x10 x10 ,
+ x11 x11 ,
+ x12 x12 ,
+ x13 x13 ,
+ x14 x14 ,
+ x15 x15 ,
+ x16 x16 ,
+ 96,9x19
+ 98,2x20 + 4,33x21 + 1,3x21 = 187 = 60 = 35 = 35 ≥ 10,5 ≥ 35 ≥ 44 ≥ 130 100 000x18 ≥ 260 80 000x20 ≥ 1 005 100 000x19 ≥ 1 005 + 100 000x18 ≥ 2 185 ≥ 2 625 + 100 000x19 ≥ 5 250 + 80 000x20 ≥ 5 260 ≥ 131 250 ≥ 787 500 = 17,5 ≤ 12 ≤ 12 ≤ 12 ≤ 12 ≤ 12 ≤ 12 = 0,4772 ≤ 1 ≤ 12 ≤ 12 x17 = 0,125 x18 = 0,26 x19 = 1,005 x20 = 1,25625 x21 = 1,5 + x17 + x18 + x19 + x20 + x21 = 100 x17 , x18 , x19 , x20 , x21 ≥ 0
B
B
SMĚŠOVACí PROBLÉM VE VSTUPNíM FORMÁTU PROGRAMU
139
Směšovací problém ve vstupním formátu programu
[Účelová funkce] Z MIN 0,9 15,5 12,9 2,5 7,2 9 530 24,7 37,2 1300 325 55 260 650 370 400 2012 119,85 96,9 98,2 4,33 [Omezující podmínky] 380 160 313 0 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1,3 1,4 10 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,2 229 181 0 0,2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,6 0 53 384 0,3 0 0,1 0 0 266 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2200 0 0 0 0 0 0 0 0 0,01 0 0 0 0 0 0 0 0 0 235000 0 0 0 0 0 0 0 0 0 0 0,15 0 0 0 0 0 0 0 0 456000 0 0 2200 0 0 0 0 0 0 0 0 0 0 0 38 0 0 640000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100000 0 0 0 0 0 0 2 0 0 0 0 0 0 240000 0 0 0 0 0 100000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500000 0 0 0 0 0 0 10 0 0 9 10 0 0 0 750000 0 0 0 0 0 0 0 0 0 100000 0 0 110 0 0 0 3000 0 0 620000 0 0 0 0 0 0 0 0 0 0 0 80000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000000000 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
= 187 = 60 = 35 = 35 >= 10,5 >= 35 >= 44 >= 130 >= 260 >= 1005 >= 1005 >= 2185 >= 2625 >= 5250 >= 5260 >= 131250 >= 787500 = 17,5 <= 12 <= 12 <= 12 <= 12 <= 12 <= 12 = 0,4772 <= 1 <= 12 <= 12 = 0,125 = 0,26 = 1,005 = 1,25625 = 1,5 = 100
C
C
141
DENNí ROZPISY ODESLANÝCH A PŘIJATÝCH VAGONŮ
Denní rozpisy odeslaných a přijatých vagonů
Den odeslání odkud kam VE JI VE HB VE RZ VE PT VE PS NH JI NH HB NH RZ NH PT NH PS KJ JI KJ HB KJ RZ KJ PT KJ PS Vagonů k odeslání
Den dodání kam odkud JI VE JI NH JI KJ HB VE HB NH HB KJ RZ VE RZ NH RZ KJ PT VE PT NH PT KJ PS VE PS NH PS KJ Vagonů k přijetí
1 po
2 út
3 st
4 čt
5 pá
6 so
7 ne
8 po
9 út
10 10
10
10 10 5 10 20 10
15 10 10 20 5
3925
1 po
5 10 10
10
10
5
20 15
10 10 5 10 20 10
10 10 5 10 20 10
3855
3815
3745
3670
3605 3540
3465
2 út
3 st
4 čt
5 pá
6 so
10
10
20
20
15 5
10 10
15 5
4000
4000
3970
10 5
10 10
3895
3835
10
10 10 5 10 20 10
10 10 5 10 20 10
10 10 20 5
7 ne
20 10 10
10
4000
11 čt
12 pá
13 so
14 ne
15 po
16 út
10 10
15 10
10 st
3795
15
18 čt
19 pá
20 so
21 ne
22 po
23 út
10 10
15 10
17 st
5 10 10
10
10
5
20 15
10 10 5 10 20 10
10 10 5 10 20 10
3395
3355
3285
3210
3145 3080
3005
8 po
9 út
10 st
11 čt
12 pá
13 so
10
10
10
10
10
20
20
20
20
20
15 5
5 15
10 10
10 10
10 10
10 10
15 5
10
10
10
10
10
10 10
10 5
5
5
10 5
10 10
3715
3640
3575
3510
3435
3375
10
10 10 5 10 20 10
10 10 5 10 20 10
10 10 20 5
14 ne
20 10 10
3335
15
25 čt
26 pá
27 so
28 ne
29 po
30 út
10 10
15 10
24 st
5 10 10
10
10
5
20 15
10 10 5 10 20 10
10 10 5 10 20 10
2935
2895
2825
2750
2685 2620
2545
15 po
16 út
17 st
18 čt
19 pá
20 so
10
10
10
10
10
20
20
20
20
20
15 5
5 15
10 10
10 10
10 10
10 10
15 5
10
10
10
10
10
10 10
10 5
5
5
10 5
10 10
3255
3180
3115
3050
2975
2915
10
10 10 5 10 20 10
10 10 5 10 20 10
10 10 20 5
21 ne
20 10 10
2875
15
32 čt
33 pá
34 so
35 ne
36 po
37 út
10 10
15 10
31 st
5 10 10
10
10
5
20 15
10 10 5 10 20 10
10 10 5 10 20 10
2475
2435
2365
2290
2225 2160
2085
22 po
23 út
24 st
25 čt
26 pá
27 so
10
10
10
10
10
20
20
20
20
20
15 5
5 15
10 10
10 10
10 10
10 10
15 5
10
10
10
10
10
10 10
10 5
5
5
10 5
10 10
2795
2720
2655
2590
2515
2455
10
10 10 5 10 20 10
10 10 5 10 20 10
10 10 20 5
28 ne
20 10 10
2415
15
39 čt
40 pá
41 so
42 ne
43 po
44 út
10 10
15 10
38 st
5 10 10
10
10
5
20 15
10 10 5 10 20 10
10 10 5 10 20 10
2015
1975
1905
1830
1765 1700
1625
29 po
30 út
31 st
32 čt
33 pá
34 so
10
10
10
10
10
20
20
20
20
20
15 5
5 15
10 10
10 10
10 10
10 10
15 5
10
10
10
10
10
10 10
10 5
5
5
10 5
10 10
2335
2260
2195
2130
2055
1995
10
10 10 5 10 20 10
10 10 5 10 20 10
10 10 20 5
35 ne
20 10 10
1955
15
46 čt
47 pá
48 so
49 ne
50 po
51 út
52 st
10 10
15 10
45 st
5 10 10
10
10
5
20 15
10 10 5 10 20 10
10 10 5 10 20 10
1555
1515
1445
1370
1305 1240
1165
36 po
37 út
38 st
39 čt
40 pá
41 so
10
10
10
10
10
20
20
20
20
20
15 5
5 15
10 10
10 10
10 10
10 10
15 5
10
10
10
10
10
10 10
10 5
5
5
10 5
10 10
1875
1800
1735
1670
1595
1535
10
10 10 5 10 20 10
10 10 5 10 20 10
10 10 20 5
42 ne
20 10 10
1495
15
54 pá
55 so
56 ne
57 po
58 út
59 60 st čt
10 10
15 10
53 čt
5 10 10
10
10
5
20 15
10 10 5 10 20 10
10 10 5 10 20 10
1095
1055
985
910
845
43 po
44 út
45 st
46 čt
47 pá
10
10
10
10
10
20
20
20
20
20
15 5
5 15
10 10
10 10
10 10
10 10
15 5
10
10
10
10
10
10 10
10 5
5
5
10 5
10 10
1415
1340
1275
1210
1135
1075
48 so
10 10 5 10 20 10
10 10 20 5
780 705
635
49 ne
20 10 10
1035
10 15 10
15
62 63 64 so ne po
65 út
10
10
10 10 5 10 20 10
61 pá
10
5 10 10
5
20 15
10 10 5 10 20 10
595
525
450
10
10
10 10 5 10 20 10
10 10 5 10 20 10
10 10 5 10 20 10
15
385
320
245
175
50 po
51 út
52 st
53 čt
54 pá
55 so
10
10
10
10
10
20
20
20
20
20
15 5
5 15
10 10
10 10
10 10
10 10
15 5
10
10
10
10
10
10 10
10 5
5
5
10 5
955
880
815
750
675
56 ne
10
10
15 10
5 10 10 10 10 5 10 5 20 20 15
10 10 20 5
135
65
0
0
0
62 so
57 po
58 út
59 st
60 čt
61 pá
10
10
10
10
10
20
20
20
20
20
15 5
5 15
10 10
10 10
10 10
10 10
15 5
10
10
10
10
10
10 10
10 10
10 5
5
5
10 5
10 10
615
575 495
420
355
290
215
155
20 10 10
0
0
63 64 ne po
65 út
10
20 10 10
115
20 5 10 15 10
10
10 10
10 5
35
0
D
D
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM FAST
Úlohy DTPN řešené algoritmem fast série 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2
příklad dod. odb. 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5
nalezené řešení čas dní odvozu celkem dní výpočtu (s) 40 44 0,002 72 76 0,008 44 47 0,007 93 98 0,021 45 49 0,015 64 69 0,032 76 80 0,010 106 110 0,023 59 63 0,027 46 51 0,033 48 53 0,038 83 87 0,074 37 42 0,011 88 92 0,028 86 88 0,061 37 40 0,042 76 81 0,096 59 64 0,130 37 42 0,012 96 99 0,055 50 55 0,064 72 76 0,252 73 76 0,192 49 54 0,185 39 43 0,021 27 32 0,027 110 115 0,190 58 62 0,264 49 54 0,206 111 115 0,340 20 25 0,014 40 45 0,053 59 64 0,138 75 80 0,314 76 81 0,558 91 94 0,481 82 87 0,007 55 58 0,007 58 63 0,010 74 78 0,017 (pokračování na další stránce)
143
144
D
série 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3
příklad dod. odb. 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM FAST
(pokračování z předchozí stránky) nalezené řešení čas dní odvozu celkem dní výpočtu (s) 46 51 0,023 62 65 0,025 219 223 0,019 107 109 0,020 62 66 0,027 127 132 0,064 73 78 0,051 32 37 0,041 26 31 0,008 54 58 0,027 64 67 0,072 215 220 0,112 93 97 0,129 75 79 0,145 53 56 0,020 41 45 0,025 210 213 0,109 113 115 0,177 168 171 0,295 132 136 0,345 63 66 0,024 65 69 0,060 214 216 0,287 38 40 0,138 100 104 0,340 78 83 0,306 95 99 0,048 81 86 0,092 59 63 0,128 68 73 0,260 182 187 1,035 95 100 0,493 71 73 0,016 62 66 0,009 87 89 0,012 64 67 0,016 53 55 0,023 21 24 0,010 40 42 0,006 76 80 0,018 75 79 0,025 25 29 0,015 (pokračování na další stránce)
D
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM FAST
série 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
příklad dod. odb. 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5
(pokračování z předchozí stránky) nalezené řešení čas dní odvozu celkem dní výpočtu (s) 56 59 0,043 55 60 0,047 25 30 0,006 56 60 0,036 72 77 0,106 82 87 0,079 24 29 0,041 95 98 0,182 116 119 0,028 45 50 0,032 135 138 0,116 63 67 0,083 79 82 0,158 52 57 0,163 37 41 0,018 23 27 0,030 76 81 0,160 80 82 0,226 85 89 0,344 72 75 0,342 31 36 0,020 49 54 0,066 47 52 0,123 41 45 0,189 55 60 0,378 70 72 0,457 80 82 0,003 36 39 0,006 41 45 0,008 69 71 0,022 35 39 0,012 49 53 0,020 101 104 0,008 98 102 0,029 60 65 0,023 48 52 0,032 142 145 0,084 49 54 0,089 73 78 0,011 66 70 0,027 120 124 0,088 85 89 0,109 (pokračování na další stránce)
145
146
D
série 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
příklad dod. odb. 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM FAST
(pokračování z předchozí stránky) nalezené řešení čas dní odvozu celkem dní výpočtu (s) 46 51 0,082 113 117 0,177 60 65 0,018 41 46 0,037 85 88 0,124 68 73 0,133 303 305 0,212 83 88 0,247 48 51 0,021 56 61 0,060 69 73 0,169 66 70 0,141 59 62 0,256 72 76 0,375 34 39 0,021 55 59 0,086 45 50 0,130 52 57 0,214 67 71 0,418 53 58 0,524 75 78 0,007 28 30 0,005 53 57 0,016 47 50 0,008 61 64 0,023 47 51 0,016 116 121 0,009 55 60 0,016 55 59 0,022 33 38 0,027 67 72 0,042 54 58 0,062 27 32 0,006 48 50 0,023 72 75 0,130 130 134 0,093 86 91 0,086 49 53 0,099 43 47 0,014 75 79 0,034 71 74 0,058 59 64 0,114 (pokračování na další stránce)
D
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM FAST
série 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
příklad dod. odb. 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5
(pokračování z předchozí stránky) nalezené řešení čas dní odvozu celkem dní výpočtu (s) 59 63 0,181 35 40 0,141 26 31 0,011 53 57 0,057 48 50 0,096 105 107 0,215 76 81 0,366 106 110 0,368 44 48 0,024 37 42 0,052 95 100 0,209 41 46 0,179 43 48 0,268 61 64 0,386 111 114 0,01 95 99 0,012 52 56 0,011 49 54 0,009 55 60 0,017 40 45 0,019 246 249 0,017 95 98 0,094 65 69 0,031 47 52 0,025 47 51 0,042 77 82 0,082 43 48 0,010 54 58 0,028 99 102 0,091 76 80 0,100 293 296 0,294 68 73 0,152 53 57 0,016 92 95 0,050 64 67 0,110 65 70 0,127 65 67 0,142 54 56 0,157 70 74 0,036 49 54 0,039 44 49 0,091 73 77 0,155 (pokračování na další stránce)
147
148
D
série 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
příklad dod. odb. 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM FAST
(pokračování z předchozí stránky) nalezené řešení čas dní odvozu celkem dní výpočtu (s) 129 132 0,478 71 76 0,338 33 38 0,018 46 50 0,070 37 41 0,109 32 37 0,158 92 95 0,549 63 65 0,429 81 85 0,003 35 39 0,005 80 84 0,016 52 56 0,011 60 65 0,021 72 77 0,024 186 189 0,012 74 77 0,030 59 64 0,026 51 56 0,025 70 74 0,050 93 97 0,074 45 47 0,011 40 45 0,019 95 98 0,048 339 343 0,134 105 107 0,110 58 61 0,120 22 27 0,008 49 53 0,036 58 63 0,066 45 49 0,083 77 82 0,188 184 186 0,364 109 113 0,034 78 83 0,072 45 50 0,065 116 118 0,233 190 194 0,408 105 110 0,338 63 68 0,035 108 112 0,127 130 135 0,351 68 71 0,246 (pokračování na další stránce)
D
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM FAST
série 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9
příklad dod. odb. 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5
(pokračování z předchozí stránky) nalezené řešení čas dní odvozu celkem dní výpočtu (s) 232 236 0,749 51 56 0,443 71 76 0,004 85 90 0,010 21 25 0,006 51 53 0,010 56 58 0,019 58 60 0,026 35 40 0,005 251 256 0,031 63 68 0,039 68 70 0,030 47 51 0,037 36 41 0,085 65 69 0,011 41 45 0,022 69 73 0,062 77 81 0,078 222 226 0,239 55 60 0,094 88 92 0,034 185 188 0,070 36 40 0,040 192 196 0,209 45 50 0,148 47 52 0,159 89 93 0,036 57 62 0,065 49 53 0,100 76 80 0,217 125 130 0,452 92 97 0,366 47 51 0,028 40 43 0,046 80 83 0,177 55 60 0,260 79 84 0,919 258 263 0,894 51 55 0,003 24 27 0,003 31 34 0,006 29 34 0,008 (pokračování na další stránce)
149
150
D
série 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10
příklad dod. odb. 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM FAST
(pokračování z předchozí stránky) nalezené řešení čas dní odvozu celkem dní výpočtu (s) 60 63 0,021 22 27 0,011 41 44 0,005 38 42 0,009 46 50 0,028 112 117 0,051 74 79 0,064 44 49 0,063 35 40 0,009 77 80 0,037 63 66 0,044 232 234 0,100 278 280 0,216 199 201 0,218 51 54 0,011 63 67 0,053 56 60 0,081 76 81 0,158 87 90 0,225 171 175 0,429 53 58 0,021 182 186 0,228 62 67 0,117 80 84 0,213 103 108 0,694 79 82 0,415 45 50 0,027 32 36 0,045 51 56 0,149 68 73 0,295 82 84 0,552 58 62 0,600 72 74 0,007 33 38 0,007 67 72 0,013 62 66 0,019 61 66 0,024 33 36 0,021 46 48 0,009 67 70 0,012 65 69 0,032 86 91 0,040 (pokračování na další stránce)
D
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM FAST
série 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
příklad dod. odb. 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7
(pokračování z předchozí stránky) nalezené řešení čas dní odvozu celkem dní výpočtu (s) 77 80 0,063 76 80 0,073 38 41 0,013 49 54 0,035 99 102 0,070 61 63 0,083 58 63 0,084 65 70 0,136 149 151 0,063 57 61 0,052 35 38 0,054 73 75 0,162 77 81 0,163 54 59 0,206 50 55 0,026 37 42 0,047 134 137 0,240 93 97 0,267 59 62 0,260 106 108 0,399 54 59 0,040 40 43 0,051 74 79 0,202 38 43 0,181 59 64 0,435 107 112 1,047
151
152
E
E
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM SLOW
Úlohy DTPN řešené algoritmem slow série 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2
příklad dod. odb. 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5
nalezené řešení proměnných čas dní odvozu celkem dní modelu výpočtu (s) 38 42 59 0,967 72 76 96 5,99 38 41 50 3,385 93 98 108 33,43 45 49 60 6,302 64 69 77 29,999 71 75 84 5,46 69 73 96 55,199 59 63 86 20,061 46 51 61 18,533 48 53 63 17,426 83 87 97 86,648 36 39 61 4,353 63 66 84 125,144 70 72 93 171,07 35 40 51 12,433 76 81 89 104,146 57 62 72 107 37 42 52 2,652 76 81 103 344,8 41 46 62 67,798 60 65 146 398,066 71 75 103 251,004 44 48 58 110,323 39 43 55 3,962 27 32 44 5,553 106 111 124 239,242 54 59 131 1602,435 42 47 69 229,196 90 95 102 507,797 19 23 33 1,56 40 44 53 11,887 58 62 72 101,275 75 80 88 98,436 69 74 91 513,334 91 94 104 862,884 68 73 100 3,339 55 58 74 3,838 58 63 73 5,772 74 78 88 13,01 (pokračování na další stránce)
E
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM SLOW
série 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3
příklad dod. odb. 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5
(pokračování z předchozí stránky) nalezené řešení proměnných čas dní odvozu celkem dní modelu výpočtu (s) 46 51 70 13,681 62 65 75 17,831 159 163 173 68,468 80 83 102 29,157 62 67 88 29,313 127 131 141 157,342 73 77 88 49,936 32 37 45 11,872 25 29 42 0,812 54 58 70 9,22 54 59 160 226,84 118 123 154 703,655 62 67 81 369,253 75 77 89 152,443 52 56 71 7,753 41 45 56 11,7 132 137 123 269,615 68 70 101 568,028 84 87 128 1016,279 132 136 146 987,278 61 66 76 11,715 65 69 79 36,739 150 154 175 2282,877 32 37 62 79,794 78 82 127 2160,963 78 82 92 358,567 95 99 109 46,863 81 86 93 56,316 53 58 71 92,96 64 67 82 138,107 182 187 195 3456,467 71 76 106 1231,7 61 64 262 33,696 40 45 67 3,338 87 90 105 12,839 39 42 62 8,986 53 55 67 9,859 21 24 34 1,358 40 42 61 1,529 55 59 94 26,692 67 72 87 23,493 25 27 39 2,652 (pokračování na další stránce)
153
154
E
série 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
příklad dod. odb. 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM SLOW
(pokračování z předchozí stránky) nalezené řešení proměnných čas dní odvozu celkem dní modelu výpočtu (s) 56 59 68 17,675 55 60 68 32,214 25 30 38 0,53 56 60 77 19,749 72 77 195 199,134 82 84 99 112,258 24 29 37 7,55 85 90 100 265,201 81 84 92 22,417 41 46 61 11,544 90 94 102 229,633 63 68 77 74,365 79 82 92 199,54 52 57 67 105,425 36 39 51 4,306 19 23 43 4,758 76 81 90 72,852 70 74 141 714,856 60 64 111 839,641 51 55 80 543,848 31 36 46 3,37 47 52 62 19,048 47 52 61 60,138 41 46 56 56,768 51 56 73 198,588 68 70 80 932,819 72 74 58 0,842 31 36 63 1,934 35 40 57 3,416 69 72 111 30,842 35 39 49 2,917 49 53 63 7,925 83 85 88 7,91 91 95 110 17,535 60 65 74 17,02 43 47 64 19,11 142 145 157 177,373 47 52 66 76,674 65 70 78 12,23 52 57 78 25,552 85 89 116 242,19 85 89 174 311,922 (pokračování na další stránce)
E
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM SLOW
série 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
příklad dod. odb. 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5
(pokračování z předchozí stránky) nalezené řešení proměnných čas dní odvozu celkem dní modelu výpočtu (s) 41 45 67 55,442 113 115 127 382,45 60 65 74 5,881 41 46 57 11,481 63 67 111 234,375 68 73 90 134,02 100 102 131 1306,19 80 82 95 498,654 48 51 62 4,976 55 60 72 18,938 69 73 100 108,311 66 71 84 149,854 50 54 70 347,46 51 55 106 1156,149 34 39 49 3,23 55 59 69 28,174 45 50 61 45,411 52 57 65 97,438 66 71 79 184,065 48 53 75 563,333 64 67 85 3,042 27 29 40 0,343 53 57 85 7,442 47 50 55 4,056 61 64 76 17,176 47 51 62 7,02 63 66 99 11,279 45 50 95 22,292 38 43 66 15,116 27 31 47 8,065 67 72 80 25,116 53 58 65 34,133 27 32 42 0,936 36 39 58 8,128 65 68 236 374,541 116 120 130 257,447 86 89 101 110,948 49 52 64 60,294 41 45 54 3,088 59 64 68 28,268 46 51 62 52,697 50 55 83 141,476 (pokračování na další stránce)
155
156
E
série 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
příklad dod. odb. 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM SLOW
(pokračování z předchozí stránky) nalezené řešení proměnných čas dní odvozu celkem dní modelu výpočtu (s) 50 53 76 171,631 35 40 50 45,489 25 30 39 1,17 53 57 68 30,436 46 50 59 50,357 82 84 103 516,486 76 81 90 331,142 92 95 108 678,32 44 48 60 4,696 37 42 52 11,403 95 100 110 168,215 41 46 56 72,009 38 42 58 203,814 45 47 62 650,849 104 107 177 27,815 95 99 104 13,432 45 49 61 3,776 49 54 64 4,197 55 60 70 10,889 40 45 55 9,531 145 148 152 42,401 78 82 398 713,733 49 54 85 28,111 47 52 62 13,354 47 51 62 20,202 77 82 92 90,433 43 48 59 3,557 52 56 80 14,866 58 62 159 701,674 75 80 92 145,657 293 296 341 231,008 68 73 88 201,692 53 57 68 6,271 75 78 92 151,507 56 59 103 303,702 48 53 91 397,832 61 65 77 111,197 54 56 68 112,648 70 74 89 16,271 49 53 63 16,318 44 49 59 29,718 62 66 76 105,019 (pokračování na další stránce)
E
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM SLOW
série 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
příklad dod. odb. 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5
(pokračování z předchozí stránky) nalezené řešení proměnných čas dní odvozu celkem dní modelu výpočtu (s) 96 101 149 1236,599 71 76 86 415,803 33 38 48 4,04 46 50 60 22,979 36 41 51 12,449 32 37 48 56,41 87 91 105 871,262 49 53 68 809,563 74 78 81 3,057 35 39 73 2,34 80 85 116 15,772 52 56 64 3,79 60 65 73 14,726 72 77 87 22,074 174 177 136 42,963 67 70 127 53,804 52 57 65 13,166 45 49 60 15,319 70 74 83 44,554 93 97 106 109,886 40 44 62 3,401 38 43 54 4,54 70 73 91 57,423 129 134 145 760,891 105 108 117 257,665 58 63 75 92,477 22 27 37 0,842 44 47 53 8,829 58 63 73 32,588 35 39 53 38,111 77 82 102 366,414 184 188 196 1525,293 109 113 121 42,073 78 83 91 49,67 42 47 60 17,441 87 89 101 913,413 97 100 124 1477,385 105 109 119 519,559 62 67 77 17,675 96 100 115 292,001 130 135 148 290,472 48 53 76 416,849 (pokračování na další stránce)
157
158
E
série 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9
příklad dod. odb. 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM SLOW
(pokračování z předchozí stránky) nalezené řešení proměnných čas dní odvozu celkem dní modelu výpočtu (s) 101 106 205 2715,999 48 52 73 477,564 54 57 61 1,076 85 90 100 9,376 20 25 36 0,53 44 49 53 2,745 56 58 70 12,792 58 63 70 13,494 35 40 50 1,17 140 145 149 154,268 46 51 77 18,938 68 73 80 33,649 46 50 61 14,867 36 41 51 15,241 57 62 68 5,32 30 34 50 4,118 69 73 89 64,818 77 81 91 61,652 214 217 228 1302,571 52 57 67 55,38 87 92 104 22,87 101 104 120 320,456 35 39 53 17,207 87 91 153 1379,901 34 37 69 91,978 45 48 62 82,477 88 93 101 28,626 57 62 77 41,418 49 53 61 39,374 62 66 107 872,166 85 88 130 78,456 92 97 106 827,363 46 51 59 8,534 39 43 52 20,327 80 83 91 101,01 46 50 79 628,494 61 66 226 1230,314 76 80 150 384,936 48 52 56 0,67 24 27 38 0,406 31 34 44 1,264 29 34 44 1,467 (pokračování na další stránce)
E
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM SLOW
série 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10
příklad dod. odb. 2 6 2 7 3 2 3 3 3 4 3 5 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7 2 2 2 3 2 4 2 5 2 6 2 7 3 2 3 3 3 4 3 5
(pokračování z předchozí stránky) nalezené řešení proměnných čas dní odvozu celkem dní modelu výpočtu (s) 60 63 73 10,281 22 27 37 1,888 36 40 49 1,186 35 38 50 2,652 46 50 72 11,934 112 114 127 79,965 74 79 89 79,887 40 44 61 38,501 35 40 65 2,605 65 68 90 75,895 46 51 66 16,208 83 87 111 220,023 278 280 290 3255,414 199 202 211 1514,887 45 48 56 4,399 61 65 79 27,97 56 60 68 19,094 64 69 84 159,51 57 62 85 560,494 168 173 181 2192,787 53 58 67 9,204 182 186 201 522,835 62 67 77 44,257 62 65 101 1112,516 97 101 171 2827,458 71 75 108 794,354 45 50 61 6,646 31 36 45 9,532 51 56 66 39,5 66 71 82 118,186 79 84 99 973,363 56 61 91 587,825 65 67 74 1,856 32 35 48 0,811 67 72 82 7,036 62 66 76 14,009 61 63 74 10,827 33 38 46 4,228 44 49 60 2,044 48 50 69 10,905 60 64 72 13,9 70 73 94 39,219 (pokračování na další stránce)
159
160
E
série 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
příklad dod. odb. 3 6 3 7 4 2 4 3 4 4 4 5 4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3 6 4 6 5 6 6 6 7 7 2 7 3 7 4 7 5 7 6 7 7
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM SLOW
(pokračování z předchozí stránky) nalezené řešení proměnných čas dní odvozu celkem dní modelu výpočtu (s) 67 71 82 57,018 76 81 91 76,097 32 35 60 4,555 48 52 72 16,005 58 62 99 104,006 54 56 76 69,67 56 58 72 57,221 65 70 81 114,816 146 151 166 119,075 55 59 72 48,547 35 38 53 25,038 67 69 99 541,087 72 74 86 161,569 54 58 68 134,815 50 55 65 7,893 37 42 53 6,552 111 114 131 1013,16 78 83 96 411,154 50 54 70 347,303 103 105 120 879,561 54 59 72 9,251 40 43 54 13,431 73 78 98 335,144 37 42 55 77,563 56 61 75 192,099 103 107 134 1327,063
F
161
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM OPTIMAL
F
Úlohy DTPN řešené algoritmem optimal
příklad sér. D O 1 2 2 1 2 3 1 2 4 1 2 5 1 2 6 1 2 7 1 3 2 1 3 3 1 3 4 1 3 5 1 3 6 1 3 7 1 4 2 1 4 3 1 4 4 1 4 5 1 4 6 1 4 7 1 5 2 1 5 3 1 5 4 1 5 5 1 5 6 1 5 7 1 6 2 1 6 3 1 6 4 1 6 5 1 6 6 1 6 7 1 7 2 1 7 3 1 7 4 1 7 5 1 7 6 1 7 7 2 2 2 2 2 3 2 2 4 2 2 5
dní odvozu 38 72 38 93 45 64 71 66 59 46 48 83 36 62 67 35 76 57 37 76 41 60 71 44 39 27 106 53 42 90 19 40 58 75 69 91 68 55 58 74
celk. dní 42 76 41 98 49 69 75 71 63 51 53 87 40 66 72 40 81 62 42 81 46 65 75 48 43 32 111 58 47 95 23 44 62 80 74 94 73 58 63 78
kr. výp. 13 16 4 5 5 3 3 20 17 5 5 4 15 12 16 6 3 5 5 17 11 76 22 4 6 7 8 68 17 2 4 3 4 3 12 3 22 9 5 4
čas výpočtu (s) 0,841 5,652 2,482 30,909 5,886 27,860 4,290 26,579 20,062 18,760 17,385 86,405 3,603 35,684 80,427 12,862 106,934 114,388 2,628 90,907 45,665 402,568 256,714 87,216 4,288 5,786 223,640 478,878 144,220 515,571 1,591 12,387 80,392 100,501 377,058 880,588 3,713 3,932 5,960 13,276
1. krok (s) 0,841 5,652 2,440 30,909 5,886 27,860 4,290 18,492 20,062 18,671 17,385 86,405 3,603 32,380 80,043 12,862 106,934 114,388 2,628 85,818 36,339 402,520 256,698 87,216 4,132 5,786 223,640 473,747 144,017 515,571 1,560 12,387 79,877 100,501 376,590 880,588 3,432 3,932 5,960 13,276
ostatní 1. krok / ost. kr. / kr. (s) čas výp. čas výp. 0,000 1,000 0,000 0,000 1,000 0,000 0,042 0,983 0,017 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 8,087 0,696 0,304 0,000 1,000 0,000 0,089 0,995 0,005 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 3,304 0,907 0,093 0,384 0,995 0,005 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 5,089 0,944 0,056 9,326 0,796 0,204 0,048 1,000 0,000 0,016 1,000 0,000 0,000 1,000 0,000 0,156 0,964 0,036 0,000 1,000 0,000 0,000 1,000 0,000 5,131 0,989 0,011 0,203 0,999 0,001 0,000 1,000 0,000 0,031 0,981 0,019 0,000 1,000 0,000 0,515 0,994 0,006 0,000 1,000 0,000 0,468 0,999 0,001 0,000 1,000 0,000 0,281 0,924 0,076 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 (pokračování na další stránce)
162
příklad sér. D O 2 2 6 2 2 7 2 3 2 2 3 3 2 3 4 2 3 5 2 3 6 2 3 7 2 4 2 2 4 3 2 4 4 2 4 5 2 4 6 2 4 7 2 5 2 2 5 3 2 5 4 2 5 5 2 5 6 2 5 7 2 6 2 2 6 3 2 6 4 2 6 5 2 6 6 2 6 7 2 7 2 2 7 3 2 7 4 2 7 5 2 7 6 2 7 7 3 2 2 3 2 3 3 2 4 3 2 5 3 2 6 3 2 7 3 3 2 3 3 3 3 3 4 3 3 5
F
dní odvozu 46 62 125 80 62 127 73 32 25 54 54 118 54 75 52 41 118 65 67 132 61 65 150 32 74 78 95 81 53 64 181 71 59 37 87 39 53 21 40 55 67 25
celk. dní 51 65 129 83 67 131 77 37 29 58 59 123 59 77 56 45 123 70 72 136 66 69 154 37 78 82 99 86 58 67 186 76 64 40 90 42 55 24 42 59 72 27
kr. výp. 14 3 38 12 16 4 5 3 7 6 96 26 17 4 9 5 95 26 51 4 5 4 15 20 43 4 4 2 8 8 4 25 193 20 10 13 6 3 11 29 10 4
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM OPTIMAL
čas výpočtu (s) 13,994 18,175 79,590 23,962 29,937 151,900 51,028 12,262 0,827 9,594 187,762 547,198 133,995 156,020 8,159 9,907 1596,868 254,402 801,924 793,429 11,951 37,677 735,740 79,156 1099,225 365,763 48,113 57,519 83,446 136,754 2381,628 1246,458 42,309 3,482 13,120 7,692 10,078 1,373 1,576 21,671 22,590 2,715
1. krok (s) 13,994 18,175 48,595 23,432 29,937 151,900 51,028 12,262 0,827 9,594 187,747 477,728 109,390 156,020 8,159 9,423 1080,890 226,351 581,824 793,429 11,951 37,662 735,740 79,156 1071,563 365,763 48,113 57,519 81,044 136,754 2381,628 1164,770 35,180 2,449 13,120 7,161 10,078 1,373 1,576 17,489 22,590 2,699
(pokračování seznamu) ostatní 1. krok / ost. kr. / kr. (s) čas výp. čas výp. 0,000 1,000 0,000 0,000 1,000 0,000 30,995 0,611 0,389 0,530 0,978 0,022 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,015 1,000 0,000 69,470 0,873 0,127 24,605 0,816 0,184 0,000 1,000 0,000 0,000 1,000 0,000 0,484 0,951 0,049 515,978 0,677 0,323 28,051 0,890 0,110 220,100 0,726 0,274 0,000 1,000 0,000 0,000 1,000 0,000 0,015 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 27,662 0,975 0,025 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 2,402 0,971 0,029 0,000 1,000 0,000 0,000 1,000 0,000 81,688 0,934 0,066 7,129 0,832 0,168 1,033 0,703 0,297 0,000 1,000 0,000 0,531 0,931 0,069 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 4,182 0,807 0,193 0,000 1,000 0,000 0,016 0,994 0,006 (pokračování na další stránce)
F
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM OPTIMAL
příklad sér. D O 3 3 6 3 3 7 3 4 2 3 4 3 3 4 4 3 4 5 3 4 6 3 4 7 3 5 2 3 5 3 3 5 4 3 5 5 3 5 6 3 5 7 3 6 2 3 6 3 3 6 4 3 6 5 3 6 6 3 6 7 3 7 2 3 7 3 3 7 4 3 7 5 3 7 6 3 7 7 4 2 2 4 2 3 4 2 4 4 2 5 4 2 6 4 2 7 4 3 2 4 3 3 4 3 4 4 3 5 4 3 6 4 3 7 4 4 2 4 4 3 4 4 4 4 4 5
dní odvozu 56 55 25 55 72 82 24 85 80 41 87 63 79 52 36 19 76 70 55 50 31 47 47 41 51 68 72 31 35 69 35 49 83 91 60 43 142 47 63 52 85 85
celk. dní 59 60 30 59 77 84 29 90 84 46 89 68 82 57 39 23 81 74 58 55 36 52 52 46 56 70 74 36 40 72 39 53 85 95 65 47 145 52 68 57 89 88
kr. výp. 2 3 3 12 113 7 3 5 2 10 5 4 3 5 5 14 4 61 46 20 5 5 4 5 12 2 10 22 12 32 4 4 1 9 4 11 5 9 5 16 21 79
čas výpočtu (s) 18,066 32,934 0,547 18,097 193,355 95,023 7,785 271,729 19,563 10,952 128,501 75,381 203,117 107,737 3,884 4,929 74,336 707,787 733,318 464,082 3,463 19,485 43,510 58,111 192,375 592,495 3,132 1,982 3,868 31,575 3,011 8,127 8,268 18,720 17,519 19,657 182,417 68,579 10,125 19,017 136,285 311,897
1. krok (s) 18,066 32,934 0,547 17,801 193,323 95,023 7,785 271,729 18,955 10,952 95,022 75,381 203,117 107,737 3,884 4,929 74,336 700,362 651,992 410,275 3,463 19,485 43,510 58,111 190,675 592,495 3,065 1,982 3,603 31,560 3,011 8,127 8,268 18,065 17,519 19,657 182,417 67,128 9,969 18,705 135,021 311,836
163 (pokračování seznamu) ostatní 1. krok / ost. kr. / kr. (s) čas výp. čas výp. 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,296 0,984 0,016 0,032 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,608 0,969 0,031 0,000 1,000 0,000 33,479 0,739 0,261 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 7,425 0,990 0,010 81,326 0,889 0,111 53,807 0,884 0,116 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 1,700 0,991 0,009 0,000 1,000 0,000 0,067 0,979 0,021 0,000 1,000 0,000 0,265 0,931 0,069 0,015 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,655 0,965 0,035 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 1,451 0,979 0,021 0,156 0,985 0,015 0,312 0,984 0,016 1,264 0,991 0,009 0,061 1,000 0,000 (pokračování na další stránce)
164
příklad sér. D O 4 4 6 4 4 7 4 5 2 4 5 3 4 5 4 4 5 5 4 5 6 4 5 7 4 6 2 4 6 3 4 6 4 4 6 5 4 6 6 4 6 7 4 7 2 4 7 3 4 7 4 4 7 5 4 7 6 4 7 7 5 2 2 5 2 3 5 2 4 5 2 5 5 2 6 5 2 7 5 3 2 5 3 3 5 3 4 5 3 5 5 3 6 5 3 7 5 4 2 5 4 3 5 4 4 5 4 5 5 4 6 5 4 7 5 5 2 5 5 3 5 5 4 5 5 5
F
dní odvozu 41 113 60 41 62 68 93 80 48 55 68 66 49 51 34 55 45 52 66 48 59 27 53 47 61 47 63 43 37 27 67 53 27 36 65 116 86 49 41 59 43 50
celk. dní 45 115 65 46 67 73 95 82 51 60 73 71 54 55 39 59 50 57 71 53 62 29 57 50 64 51 66 48 42 31 72 58 32 39 68 118 89 52 45 64 47 55
kr. výp. 16 4 4 6 39 12 28 5 4 7 22 8 11 45 5 4 6 3 3 17 18 3 22 1 5 5 26 42 19 10 3 2 5 12 161 4 5 5 3 1 9 23
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM OPTIMAL
čas výpočtu (s) 56,786 390,025 6,053 9,282 137,190 133,664 1125,149 305,768 5,133 19,360 95,490 154,194 202,521 631,726 3,354 28,846 45,148 99,312 164,960 412,803 3,228 0,343 7,722 4,228 17,597 7,223 10,747 19,749 12,199 6,537 25,756 34,976 0,952 8,488 346,017 261,170 113,808 61,872 3,120 25,101 54,306 140,935
1. krok (s) 56,770 390,010 6,053 9,282 134,397 133,664 874,059 305,768 5,133 19,360 95,490 154,194 185,482 595,267 3,354 28,846 45,148 99,312 164,960 412,413 2,543 0,343 7,722 4,228 17,597 7,223 8,737 14,181 9,547 6,443 25,756 34,976 0,952 7,364 345,954 246,725 113,808 61,872 3,120 25,101 33,744 138,860
(pokračování seznamu) ostatní 1. krok / ost. kr. / kr. (s) čas výp. čas výp. 0,016 1,000 0,000 0,015 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 2,793 0,980 0,020 0,000 1,000 0,000 251,090 0,777 0,223 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 17,039 0,916 0,084 36,459 0,942 0,058 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,390 0,999 0,001 0,685 0,788 0,212 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 2,010 0,813 0,187 5,568 0,718 0,282 2,652 0,783 0,217 0,094 0,986 0,014 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 1,124 0,868 0,132 0,063 1,000 0,000 14,445 0,945 0,055 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 20,562 0,621 0,379 2,075 0,985 0,015 (pokračování na další stránce)
F
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM OPTIMAL
příklad sér. D O 5 5 6 5 5 7 5 6 2 5 6 3 5 6 4 5 6 5 5 6 6 5 6 7 5 7 2 5 7 3 5 7 4 5 7 5 5 7 6 5 7 7 6 2 2 6 2 3 6 2 4 6 2 5 6 2 6 6 2 7 6 3 2 6 3 3 6 3 4 6 3 5 6 3 6 6 3 7 6 4 2 6 4 3 6 4 4 6 4 5 6 4 6 6 4 7 6 5 2 6 5 3 6 5 4 6 5 5 6 5 6 6 5 7 6 6 2 6 6 3 6 6 4 6 6 5
dní odvozu 50 35 25 52 45 82 76 92 44 37 95 41 37 45 90 95 45 49 55 40 145 78 49 47 47 77 43 52 57 75 293 68 53 75 55 46 61 54 70 49 44 62
celk. dní 54 40 30 57 50 86 81 95 48 42 100 46 41 49 93 100 49 54 60 45 148 82 54 52 51 82 48 56 62 80 296 73 57 78 59 50 65 56 74 54 49 66
kr. výp. 16 5 4 6 4 11 4 6 6 5 5 5 11 7 77 1 6 5 5 5 1 310 26 5 5 5 6 20 45 7 38 10 5 9 38 35 6 4 9 4 5 4
čas výpočtu (s) 140,092 46,832 1,201 27,847 36,115 320,577 335,087 694,111 4,805 11,123 171,576 52,152 154,132 301,961 26,537 14,492 3,916 4,509 11,185 9,922 42,402 429,267 27,627 13,822 20,733 92,619 3,682 16,910 134,260 72,792 319,056 207,459 6,521 56,941 102,199 175,522 117,408 115,646 16,646 16,022 28,736 95,786
1. krok (s) 140,092 46,832 1,201 27,114 35,335 320,562 335,087 694,111 4,805 11,107 171,576 52,152 147,737 267,859 20,561 14,492 3,916 4,400 11,185 9,922 42,402 359,457 22,246 13,822 20,733 92,604 3,682 16,848 125,399 72,792 319,040 207,443 6,521 51,046 101,762 155,927 117,408 115,646 16,646 16,022 28,736 95,786
165 (pokračování seznamu) ostatní 1. krok / ost. kr. / kr. (s) čas výp. čas výp. 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,733 0,974 0,026 0,780 0,978 0,022 0,015 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,016 0,999 0,001 0,000 1,000 0,000 0,000 1,000 0,000 6,395 0,959 0,041 34,102 0,887 0,113 5,976 0,775 0,225 0,000 1,000 0,000 0,000 1,000 0,000 0,109 0,976 0,024 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 69,810 0,837 0,163 5,381 0,805 0,195 0,000 1,000 0,000 0,000 1,000 0,000 0,015 1,000 0,000 0,000 1,000 0,000 0,062 0,996 0,004 8,861 0,934 0,066 0,000 1,000 0,000 0,016 1,000 0,000 0,016 1,000 0,000 0,000 1,000 0,000 5,895 0,896 0,104 0,437 0,996 0,004 19,595 0,888 0,112 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 (pokračování na další stránce)
166
příklad sér. D O 6 6 6 6 6 7 6 7 2 6 7 3 6 7 4 6 7 5 6 7 6 6 7 7 7 2 2 7 2 3 7 2 4 7 2 5 7 2 6 7 2 7 7 3 2 7 3 3 7 3 4 7 3 5 7 3 6 7 3 7 7 4 2 7 4 3 7 4 4 7 4 5 7 4 6 7 4 7 7 5 2 7 5 3 7 5 4 7 5 5 7 5 6 7 5 7 7 6 2 7 6 3 7 6 4 7 6 5 7 6 6 7 6 7 7 7 2 7 7 3 7 7 4 7 7 5
F
dní odvozu 96 71 33 46 36 32 86 49 74 35 80 52 60 72 174 66 52 45 70 93 40 38 70 107 105 58 22 44 58 35 77 184 109 78 42 73 90 105 62 96 130 48
celk. dní 101 76 38 50 41 37 91 53 78 39 85 56 65 77 177 70 57 49 74 97 44 43 73 112 108 63 27 49 63 39 82 188 113 83 47 76 93 109 67 100 135 53
kr. výp. 43 5 5 4 5 6 9 9 1 28 26 2 3 5 15 51 3 5 3 3 12 6 11 28 2 7 5 1 5 8 15 2 2 3 8 18 24 4 5 9 8 18
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM OPTIMAL
čas výpočtu (s) 1043,395 427,362 4,212 20,764 12,667 41,731 673,778 387,964 3,151 2,434 16,131 3,963 15,164 22,652 105,244 35,460 13,776 15,805 45,930 112,438 3,526 4,867 60,689 582,821 266,469 91,684 0,874 9,002 33,463 37,971 315,594 1559,999 43,369 45,755 17,815 441,020 933,200 535,704 16,864 184,303 293,693 239,371
1. krok (s) 1023,894 427,362 4,212 20,296 12,667 41,731 653,732 384,844 3,151 2,356 16,115 3,963 15,164 22,652 103,466 34,773 13,776 15,805 45,930 112,438 3,526 4,711 58,832 354,743 266,469 91,122 0,874 9,002 33,463 35,428 315,594 1559,999 43,369 45,755 17,815 396,263 689,870 535,704 16,864 184,303 293,693 187,141
(pokračování seznamu) ostatní 1. krok / ost. kr. / kr. (s) čas výp. čas výp. 19,501 0,981 0,019 0,000 1,000 0,000 0,000 1,000 0,000 0,468 0,977 0,023 0,000 1,000 0,000 0,000 1,000 0,000 20,046 0,970 0,030 3,120 0,992 0,008 0,000 1,000 0,000 0,078 0,968 0,032 0,016 0,999 0,001 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 1,778 0,983 0,017 0,687 0,981 0,019 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,156 0,968 0,032 1,857 0,969 0,031 228,078 0,609 0,391 0,000 1,000 0,000 0,562 0,994 0,006 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 2,543 0,933 0,067 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 44,757 0,899 0,101 243,330 0,739 0,261 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 52,230 0,782 0,218 (pokračování na další stránce)
F
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM OPTIMAL
příklad sér. D O 7 7 6 7 7 7 8 2 2 8 2 3 8 2 4 8 2 5 8 2 6 8 2 7 8 3 2 8 3 3 8 3 4 8 3 5 8 3 6 8 3 7 8 4 2 8 4 3 8 4 4 8 4 5 8 4 6 8 4 7 8 5 2 8 5 3 8 5 4 8 5 5 8 5 6 8 5 7 8 6 2 8 6 3 8 6 4 8 6 5 8 6 6 8 6 7 8 7 2 8 7 3 8 7 4 8 7 5 8 7 6 8 7 7 9 2 2 9 2 3 9 2 4 9 2 5
dní odvozu 101 47 54 85 20 44 56 58 35 124 46 68 46 36 57 30 69 77 214 52 87 84 35 77 34 45 88 57 49 62 83 92 46 38 80 46 61 73 46 24 31 29
celk. dní 106 52 57 90 25 49 58 63 40 128 51 73 50 41 62 34 73 81 217 57 92 88 39 80 37 48 93 62 53 66 88 97 51 43 83 50 66 78 50 27 34 34
kr. výp. 94 16 1 5 6 1 4 2 5 15 21 2 5 5 1 10 10 4 4 5 7 26 8 66 25 7 3 10 2 35 37 4 3 4 1 23 155 67 9 4 3 5
čas výpočtu (s) 760,782 298,340 1,076 9,687 0,546 2,777 13,275 13,775 1,186 162,101 19,327 34,429 15,163 15,569 5,305 4,197 55,349 63,055 1311,205 56,628 22,636 143,284 15,928 702,264 76,533 84,557 25,384 41,047 37,849 330,974 1104,753 843,383 8,673 18,315 102,823 249,884 1163,711 2792,214 1,144 0,421 1,263 1,482
1. krok (s) 454,755 298,340 1,076 9,563 0,546 2,777 13,026 13,775 1,139 106,236 15,616 34,429 14,711 15,522 5,242 4,197 55,349 63,055 1311,205 56,628 22,636 125,517 15,928 557,357 74,271 84,557 25,384 41,047 37,849 305,685 1103,942 843,383 8,580 17,831 102,823 249,884 1154,008 2612,217 1,005 0,421 1,263 1,482
167 (pokračování seznamu) ostatní 1. krok / ost. kr. / kr. (s) čas výp. čas výp. 306,027 0,598 0,402 0,000 1,000 0,000 0,000 1,000 0,000 0,124 0,987 0,013 0,000 1,000 0,000 0,000 1,000 0,000 0,249 0,981 0,019 0,000 1,000 0,000 0,047 0,960 0,040 55,865 0,655 0,345 3,711 0,808 0,192 0,000 1,000 0,000 0,452 0,970 0,030 0,047 0,997 0,003 0,063 0,988 0,012 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 17,767 0,876 0,124 0,000 1,000 0,000 144,907 0,794 0,206 2,262 0,970 0,030 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 25,289 0,924 0,076 0,811 0,999 0,001 0,000 1,000 0,000 0,093 0,989 0,011 0,484 0,974 0,026 0,000 1,000 0,000 0,000 1,000 0,000 9,703 0,992 0,008 179,997 0,936 0,064 0,139 0,878 0,122 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 (pokračování na další stránce)
168
příklad sér. D O 9 2 6 9 2 7 9 3 2 9 3 3 9 3 4 9 3 5 9 3 6 9 3 7 9 4 2 9 4 3 9 4 4 9 4 5 9 4 6 9 4 7 9 5 2 9 5 3 9 5 4 9 5 5 9 5 6 9 5 7 9 6 2 9 6 3 9 6 4 9 6 5 9 6 6 9 6 7 9 7 2 9 7 3 9 7 4 9 7 5 9 7 6 9 7 7 10 2 2 10 2 3 10 2 4 10 2 5 10 2 6 10 2 7 10 3 2 10 3 3 10 3 4 10 3 5
F
dní odvozu 60 22 36 35 46 112 74 40 35 64 46 83 278 199 45 61 56 61 50 168 53 182 62 55 97 71 45 31 51 66 79 56 65 32 67 62 61 33 44 47 60 70
celk. dní 63 27 40 38 50 114 79 45 40 69 51 87 280 202 48 65 60 66 55 173 58 186 67 60 101 75 50 36 56 71 84 61 67 35 72 66 63 38 49 50 64 73
kr. výp. 3 5 5 5 16 5 5 11 20 16 10 18 2 2 1 8 2 13 25 3 4 9 5 36 64 27 6 4 5 6 10 25 9 6 5 4 3 3 6 12 2 14
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM OPTIMAL
čas výpočtu (s) 10,545 1,935 1,263 2,590 12,262 81,401 78,156 39,686 2,636 37,518 18,237 192,020 3316,680 1545,041 5,149 25,074 19,551 148,115 316,804 2236,868 9,407 530,352 40,201 422,512 1601,594 810,701 6,817 9,516 40,669 120,729 573,456 579,291 2,846 0,827 7,192 14,414 11,045 4,337 2,106 7,068 13,993 40,092
1. krok (s) 10,530 1,935 1,186 2,590 12,262 81,401 78,156 38,969 2,636 34,866 16,131 177,044 3316,680 1545,041 4,572 25,074 19,535 118,051 179,484 2236,868 9,407 530,337 40,045 278,304 1594,357 810,701 6,817 9,516 40,669 120,729 567,762 579,291 2,734 0,827 7,192 14,414 11,045 4,337 2,106 6,302 13,993 40,092
(pokračování seznamu) ostatní 1. krok / ost. kr. / kr. (s) čas výp. čas výp. 0,015 0,999 0,001 0,000 1,000 0,000 0,077 0,939 0,061 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,717 0,982 0,018 0,000 1,000 0,000 2,652 0,929 0,071 2,106 0,885 0,115 14,976 0,922 0,078 0,000 1,000 0,000 0,000 1,000 0,000 0,577 0,888 0,112 0,000 1,000 0,000 0,016 0,999 0,001 30,064 0,797 0,203 137,320 0,567 0,433 0,000 1,000 0,000 0,000 1,000 0,000 0,015 1,000 0,000 0,156 0,996 0,004 144,208 0,659 0,341 7,237 0,995 0,005 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 5,694 0,990 0,010 0,000 1,000 0,000 0,112 0,961 0,039 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,000 1,000 0,000 0,766 0,892 0,108 0,000 1,000 0,000 0,000 1,000 0,000 (pokračování na další stránce)
F
169
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM OPTIMAL
příklad sér. D O 10 3 6 10 3 7 10 4 2 10 4 3 10 4 4 10 4 5 10 4 6 10 4 7 10 5 2 10 5 3 10 5 4 10 5 5 10 5 6 10 5 7 10 6 2 10 6 3 10 6 4 10 6 5 10 6 6 10 6 7 10 7 2 10 7 3 10 7 4 10 7 5 10 7 6 10 7 7
dní odvozu 67 76 32 46 57 49 56 65 146 55 35 65 72 54 50 37 109 78 49 103 54 40 73 37 56 103
celk. dní 71 81 35 50 62 54 58 70 151 59 38 69 74 58 55 42 114 83 54 105 59 43 78 42 61 107
kr. výp. 5 5 20 16 32 17 6 6 10 7 8 24 4 4 5 6 12 8 11 7 8 4 15 8 9 21
čas výpočtu (s) 58,578 77,531 3,603 15,787 79,685 59,422 58,391 118,000 123,170 25,403 18,879 191,649 166,431 137,720 8,066 6,693 380,473 256,622 202,503 898,966 9,423 13,650 248,134 64,927 176,436 1356,980
1. krok (s) 58,578 77,516 2,980 15,584 74,396 48,189 58,391 117,578 121,890 24,544 18,879 191,649 166,431 137,720 8,066 6,693 344,453 256,606 185,484 898,966 9,423 13,650 248,118 64,912 176,436 1356,964
ostatní kr. (s) 0,000 0,015 0,623 0,203 5,289 11,233 0,000 0,422 1,280 0,859 0,000 0,000 0,000 0,000 0,000 0,000 36,020 0,016 17,019 0,000 0,000 0,000 0,016 0,015 0,000 0,016
(pokračování seznamu) 1. krok / ost. kr. / čas výp. čas výp. 1,000 0,000 1,000 0,000 0,827 0,173 0,987 0,013 0,934 0,066 0,811 0,189 1,000 0,000 0,996 0,004 0,990 0,010 0,966 0,034 1,000 0,000 1,000 0,000 1,000 0,000 1,000 0,000 1,000 0,000 1,000 0,000 0,905 0,095 1,000 0,000 0,916 0,084 1,000 0,000 1,000 0,000 1,000 0,000 1,000 0,000 1,000 0,000 1,000 0,000 1,000 0,000
170
F
ÚLOHY DTPN ŘEŠENÉ ALGORITMEM OPTIMAL
G
G
171
DENNí ROZPISY ODESLANÉHO A DODANÉHO OVOCE
Denní rozpisy odeslaného a dodaného ovoce
Den odeslání Odkud Kam D1 O1 D1 O2 D1 O3 D2 O1 D2 O2 D2 O3 D3 O1 D3 O2 D3 O3 D4 O1 D4 O2 D4 O3 D5 O1 D5 O2 D5 O3 Dodavatel 1 Dodavatel 2 Dodavatel 3 Dodavatel 4 Dodavatel 5 Zbývá odvézt
Den dodání Kam Odkud O1 D1 O1 D2 O1 D3 O1 D4 O1 D5 O2 D1 O2 D2 O2 D3 O2 D4 O2 D5 O3 D1 O3 D2 O3 D3 O3 D4 O3 D5 Odběratel 1 Odběratel 2 Odběratel 3 Zbývá přivézt:
1 čt
2 pá
3 so
30 20
30
50 40
40
90
90
4 ne
5 po 20 30
40
6 út
7 st 30
50 10
40
40
50
30 90
90
80 10
50 20 30 30 1450 860 2910 2430 2040 9690
1 čt
20 40 10 60
30
20
40 30
1400 820 2820 2360 1980 9380
1370 780 2770 2290 1950 9160
2 pá
70
30 40
50 10 20 1370 740 2770 2220 1920 9020
8 čt
50 20 20 10 20 60 50 20
10 60 1320 740 2680 2150 1860 8750
50 1270 700 2590 2080 1800 8440
3 so
4 ne
5 po
90
90
50
20 40 1240 660 2500 2080 1740 8220
6 út
60 1190 620 2410 2010 1680 7910
9 pá
10 so
50
30
30
20 40 30 60
1140 580 2320 1940 1620 7600
7 st
8 čt
90 20 10
90 30
30 40
40
60 30 40
30 40
12 po 20 30
40
10 70
40 50 30 30
40
11 ne
80 10
13 út
14 st 30
15 čt 30
20
40
20 40
30
20 70 20
20 90 60 10
30 20 40 50 20
50
50
70 30
1110 540 2270 1870 1590 7380
9 pá 10 80 20 10 50 20
50 20 60
30
70 50 10
1110 500 2270 1800 1560 7240
1060 500 2180 1730 1500 6970
1010 460 2090 1660 1440 6660
10 so 20 10 70 20
11 ne 20 70 30
60
12 po 30 30
60 50
50
40
60
980 420 2000 1660 1380 6440
930 380 1910 1590 1320 6130
880 350 1820 1520 1260 5830
14 st
15 čt
40
40 80
70
50 30 30
30
5000 3500 2800 11300
30 5000 3460 2770 11230
4910 3420 2770 11100
4790 3420 2770 10980
20 20 4680 3350 2680 10710
10 60 4560 3280 2590 10430
40 50 4440 3280 2500 10220
50 40 4320 3210 2410 9940
60 4200 3140 2320 9660
4080 3100 2320 9500
3960 3100 2320 9380
19 po
50 20 50 30
20 út 50
21 st 30
40 10
40
20 50 50
50 30
850 350 1770 1450 1230 5650
16 pá 20 20 20 60 50 10
10 30
850 350 1770 1380 1200 5550
800 350 1680 1310 1150 5290
17 so 20 40
18 ne 40 30 50
60
10
40
30 50 40
20
60
50 10 10 20
60 30
20 70
50 40
70
3840 3030 2230 9100
3720 2960 2140 8820
3600 2960 2050 8610
3480 2890 1960 8330
3360 2820 1870 8050
750 310 1590 1240 1090 4980
19 po 30 30
10 60 20
10
70
3120 2780 1870 7770
25 ne
3000 2710 1780 7490
26 po
27 út 50
28 st 30
40 10
40
90 60 10
60
720 270 1500 1240 1030 4760
20 út 30
60 30 30
10 80 50 20
60
50 10
670 270 1410 1170 970 4490
620 230 1320 1100 910 4180
21 st 50
22 čt
20 50
50 20 50 40
20 20
29 čt 30
30 pá 50
31 so
32 ne
30 20 10
20 70 50 60
40
33 po 20 10 20
40
34 út 50
35 st 30
36 čt 30
37 pá 50
38 so
39 ne
30 40
40 po
41 út 20
42 st
10 40
20
43 čt
44 pá
70
70
45 so
46 ne
30 20
20 40
10 30
30 40
20 50 60
2880 2640 1690 7210
70
60
590 230 1270 1030 880 4000
590 230 1270 960 850 3900
23 pá
24 so
10 20 30 60
40
70
40
20 60
540 230 1180 890 790 3630
25 ne 50
40 50
50 40
50
2760 2640 1600 7000
2640 2570 1510 6720
2520 2500 1420 6440
490 190 1140 820 730 3370
26 po 30 40
70 50
10 60 20 70
2400 2460 1420 6280
2280 2460 1420 6160
2160 2390 1330 5880
90 60 10
60
30
10 30 90
20 40 70
30
20
3240 2780 1870 7890
24 so
30
30
70
60
20 20
23 pá 50
30
70 30
22 čt 30 20
30
13 út
40
20
18 ne
20 70
60
20 40
17 so 30
70 20 10 40
16 pá 50
460 150 1050 820 670 3150
27 út 30
60 30 30
10 80 50 20
60
50 10
410 150 960 750 610 2880
360 110 870 680 550 2570
28 st 50 20 50
10 20 10
29 čt
60 60 40
20 70 50 60 10 30
70 70 30 40
70 60
2040 2320 1240 5600
60
330 110 820 610 520 2390
330 110 820 540 490 2290
30 pá
31 so
10 20 30 60
40 20 60
70
40
50 40
50
1920 2320 1150 5390
1800 2250 1060 5110
1680 2180 970 4830
280 110 730 470 430 2020
32 ne 50
230 70 690 400 370 1760
33 po 30 40
70 50
10 60 20 70
1560 2140 970 4670
20 70 50 20 60
20 70 50 50
70 20 10 40
20 30
60
30
80 10
90 60 10
60
30
10 30 90
20 40
1440 2140 970 4550
1320 2070 880 4270
200 30 600 400 310 1540
34 út 30
60 30 30
150 30 510 330 250 1270
35 st 50 20 50
10 20 10
20 30 70 60
40
30
30
100
70
70
20
420 260 190 970
370 190 160 790
370 120 130 690
280 50 70 420
36 čt
37 pá 40 20
60 60 10
38 so 20 40
230 30 30 290
39 ne 50
1200 2000 790 3990
40 po 30 30
70 60
60
70
40
60
30 30
10 60 20
20 90
140 30 30 200
80 10
50 40
70
70
1080 2000 700 3780
960 1930 610 3500
840 1860 520 3220
720 1820 520 3060
600 1820 520 2940
480 1750 430 2660
70 30 30 130
41 út 30
60 30 30
30 30 60
30 30 60
0
42 st 50
43 čt
44 pá
20 50
10 50 60 30
20 20 40
20 20
70
45 so
46 ne 20
47 po
48 út
70
70
49 st
50 čt
20
40
10 30
30 30 20
90
360 1680 340 2380
70 20
50 40
70
70
240 1680 250 2170
120 1610 160 1890
40 1540 70 1650
40 1500 70 1610
1500 70 1570
1430
1360
1360
1300
1430
1360
1360
1300