VŠB – Technická univerzita Ostrava Fakulta ... - FEI VŠB
VŠB – Technická univerzita Ostrava Fakulta ... - FEI VŠB VŠB – Technická univerzita Ostrava Fakulta ... - FEI VŠB
VŠB – Technická univerzita Ostrava Fakulta elektrotechniky a informatiky BAKALÁŘSKÁ PRÁCE 2007 Petr Oborný
- Page 2 and 3: VŠB - Technická univerzita Ostrav
- Page 4 and 5: Abstrakt Historicky základním pro
- Page 6 and 7: 1 Úvod Problematika matematického
- Page 8 and 9: kanonický - jsou-li všechny podm
- Page 10 and 11: 3.2.3 Smíšený tvar úlohy lineá
- Page 12 and 13: 3.4 Dělení řešení úlohy line
- Page 14 and 15: Označíme-li je ∑ z = n ∑ c j
- Page 16 and 17: sloupci získat jednotkový bázick
- Page 18 and 19: vektory A 1 , . . . , A r−1 , A r
- Page 20 and 21: 6.1 Prvá fáze 1 - jsou-li podmín
- Page 22 and 23: kde x ∗ = ( x y ) a z = max c ∗
- Page 24 and 25: z bázických proměnných s hodnot
- Page 26 and 27: matice U. Výběr klíčového prvk
- Page 28 and 29: Matice L a U na konci: Na konci je
- Page 30 and 31: Reference [1] Rovný, B.: Optimáln
VŠB – Technická <strong>univerzita</strong> <strong>Ostrava</strong><br />
<strong>Fakulta</strong> elektrotechniky a<br />
informatiky<br />
BAKALÁŘSKÁ PRÁCE<br />
2007 Petr Oborný
VŠB – Technická <strong>univerzita</strong> <strong>Ostrava</strong><br />
<strong>Fakulta</strong> elektrotechniky a<br />
informatiky<br />
Katedra aplikované matematiky<br />
Simplexový algoritmus pro rozsáhlé<br />
úlohy lineárního programování<br />
2007 Petr Oborný
Prohlášení<br />
Prohlašuji, že jsem tuto bakalářskou práci na téma ”<br />
Simplexový algoritmus pro rozsáhlé úlohy<br />
lineárního programování“ vypracoval samostatně. Uvedl jsem všechny literární prameny a<br />
publikace, ze kterých jsem čerpal.<br />
V Ostravě dne: ............................... Podpis: ...............................
Abstrakt<br />
Historicky základním prostředkem pro řešení úloh lineárního programování byla simplexová<br />
metoda. Tato metoda však kombinatoricky závisí na velikosti simplexu popisující lineární<br />
omezení a proto je prakticky použitelná pouze pro menší úlohy. Pro střední a rozsáhlé úlohy je<br />
nutné využít řídkých struktur matic omezení. Cílem práce je studium, návrh a implementace<br />
simplexového algoritmu využívajícího řídkých struktur.<br />
Klíčová slova<br />
Lineární programování, simplexový algoritmus, řídké matice
Obsah<br />
1 Úvod 1<br />
2 Optimalizační úloha 2<br />
3 Úloha lineárního programování 2<br />
3.1 Formulace problému . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />
3.2 Tvary modelu lineárního programování . . . . . . . . . . . . . . . . . . . . . . 2<br />
3.2.1 Kanonický tvar úlohy lineárního programování . . . . . . . . . . . . . 3<br />
3.2.2 Symetrický tvar úlohy lineárního programování . . . . . . . . . . . . . 4<br />
3.2.3 Smíšený tvar úlohy lineárního programování . . . . . . . . . . . . . . . 5<br />
3.3 Převody mezi tvary úloh lineárního programování . . . . . . . . . . . . . . . . 6<br />
3.3.1 Převod na kanonický tvar . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
3.3.2 Maximalizace/minimalizace . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
3.4 Dělení řešení úlohy lineárního programování . . . . . . . . . . . . . . . . . . . 7<br />
3.5 Věty lineárního programování . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
4 Simplexová metoda 8<br />
5 Algoritmus simplexové metody 9<br />
5.1 1. krok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
5.2 2. krok - test optimality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
5.3 3. krok - volba klíčového sloupce . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
5.4 4. krok - volba řádku a tedy určení proměnné, která opustí bázi . . . . . . . . 10<br />
5.5 5. krok - transformace simplexové tabulky . . . . . . . . . . . . . . . . . . . . 10<br />
5.6 6. krok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />
5.7 Zdůvodnění výběru klíčového prvku . . . . . . . . . . . . . . . . . . . . . . . 11<br />
5.8 Příklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
6 Simplexový algoritmus 14<br />
6.1 Prvá fáze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
6.2 Druhá fáze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
6.3 Příklad obecně . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
6.4 Příklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
7 Metoda prohibitivních ocenění 16<br />
7.1 Příklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
8 Simplexová metoda pro degenerované úlohy 18<br />
8.1 Příklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
9 Použití LU pro zachování řídkosti 19<br />
10 Popis vytvořených algoritmů 20<br />
10.1 Simplexový algoritmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
10.2 Simplexový algoritmus s LU rozkladem . . . . . . . . . . . . . . . . . . . . . . 20<br />
11 Závěr 24
1 Úvod<br />
Problematika matematického programování je velice široká a mimo jiné zahrnuje oblasti<br />
lineárního programování. Základní úlohu lineárního programování zformuloval Dantzig již<br />
v roce 1947 a později vypracoval i metodu řešení této úlohy - simplexovou metodu. Ve své bakalářské<br />
práci si tedy nejdříve ukážeme jak vypadá formulace úlohy lineárního programování.<br />
A protože může být zadána různými tvary, měli bychom vědět jak vypadají. Seznámíme se<br />
tedy s různými interpretacemi tvarů lineárního programování. Dále nás bude zajímat v čem<br />
spočívá simplexová metoda a podrobně si vysvětlíme jednotlivé kroky jejího algoritmu. Také<br />
se dozvíme, že se skládá ze dvou fází a že první z nich pro své řešení používá metodu prohibitivních<br />
ocenění, kterou si budeme muset objasnit. Špatná podmíněnost úlohy by mohla<br />
způsobit její degeneraci a proto musí dojít ke zpřesnění simplexového algoritmu, aby si i s<br />
takto zadanou úlohou dokázal poradit. A nakonec se podíváme jak si pomocí LU rozkladu<br />
zachovat řídkost struktury úlohy.<br />
1
2 Optimalizační úloha<br />
Optimalizace je matematická disciplína, ve které hledáme maximum (resp. minimum) funkce<br />
f(x) na množině M. Funkce f(x) se nazývá obvykle cenový funkcionál. Optimalizace<br />
je podmíněna existencí jisté množiny G variant řešení optimalizační úlohy. Reálný systém<br />
není zpravidla schopen akceptovat všechny varianty řešení, ale pouze určitou podmnožinu M<br />
množiny G variant. Podmnožina M, tzv. množina přípustných řešení, je určena souborem<br />
podmínek - v našem případě soustavou konečného počtu rovnic či nerovnic. Funkce f(x)<br />
přiřazuje každému přípustnému řešení určité reálné číslo. Nalezené přípustné řešení nazýváme<br />
optimální řešení.<br />
Cílem optimalizační úlohy je zpravidla optimalizace reálného problému. Základním problémem<br />
je vytvoření matematické reprezentace reálného systému ve formě matematického modelu.<br />
Speciálním případem optimalizační úlohy je úloha lineárního programování.<br />
3 Úloha lineárního programování<br />
3.1 Formulace problému<br />
Základní problém:<br />
Většinu jednoduchých typů omezených optimalizačních úloh získáme tak, že množina přípustných<br />
řešení jsou všechno lineární rovnice či nerovnice.<br />
max {f(x); Ax = b, x ≥ 0}<br />
Předpokládáme, že A ∈ R m×n , b ∈ R m , f(x) = c T x, kde c, x ∈ R n .<br />
Výše uvedený problém vypadá rozepsaně takto:<br />
Nalézt maximum lineární funkce<br />
při splnění podmínek<br />
f(x) = c 1 x 1 + c 2 x 2 + . . . + c n x n ... cenový funkcionál<br />
a 11 x 1 + a 12 x 2 + · · · + a 1n x n = b 1 ... vlastní omezení<br />
a 21 x 1 + a 22 x 2 + · · · + a 2n x n = b 2<br />
.<br />
a m1 x 1 + a m2 x 2 + · · · + a mn x n = b m ,<br />
kde x j ≥ 0 pro j = 1, 2, ..., n. ... podmínky nazápornosti<br />
Jde tedy o nalezení největší hodnoty lineární funkce c T ∑<br />
x = n c j x j na množině nezáporných<br />
řešení soustavy Ax = b.<br />
Pro řešení jsou známy algoritmy jako je například simplexový algorimus.<br />
3.2 Tvary modelu lineárního programování<br />
Téměř všechny úlohy lineárního programování můžeme rozdělit do tří kategorií podle omezujících<br />
podmínek. Úlohy tedy mohou reprezentovat modely různých tvarů:<br />
j=1<br />
2
kanonický – jsou-li všechny podmínky omezení prostoru přípustných řešení zadány ve tvaru<br />
rovnic<br />
symetrický – jsou-li omezení prostoru přípustných řešení zadána ve tvaru nerovností<br />
smíšený – jsou-li některá omezení prostoru přípustných řešení zadána ve tvaru rovnic a<br />
zbývající ve tvaru nerovnic<br />
3.2.1 Kanonický tvar úlohy lineárního programování<br />
Obecný zápis úlohy :<br />
Stanovíme x 1 , x 2 , ..., x n tak, aby cenový funkcionál<br />
f(x) = c 1 x 1 + c 2 x 2 + ... + c n x n<br />
nabyl svého maxima na množině přípustných řešení<br />
kde x j ≥ 0 pro j = 1, 2, ..., n.<br />
a 11 x 1 + a 12 x 2 + · · · + a 1n x n = b 1<br />
.<br />
a m1 x 1 + a m2 x 2 + · · · + a mn x n = b m ,<br />
Sumační zápis úlohy :<br />
Stanovíme x 1 , x 2 , ..., x n tak, aby cenový funkcionál<br />
∑<br />
f(x) = n c j x j<br />
j=1<br />
nabyl svého maxima na množině přípustných řešení<br />
kde x j ≥ 0 pro j = 1, 2, ..., n.<br />
n∑<br />
a ij x j = b i pro i = 1, 2, ..., m,<br />
j=1<br />
Maticový zápis úlohy(nejstručnější) :<br />
Stanovíme x 1 , x 2 , ..., x n tak, aby cenový funkcionál<br />
f(x) = c T x<br />
nabyl svého maxima na množině přípustných řešení<br />
3
Ax = b,<br />
kde x ≥ 0.<br />
3.2.2 Symetrický tvar úlohy lineárního programování<br />
Obecný zápis úlohy :<br />
Stanovíme x 1 , x 2 , ..., x n tak, aby cenový funkcionál<br />
f(x) = c 1 x 1 + c 2 x 2 + ... + c n x n<br />
nabyl svého maxima na množině přípustných řešení<br />
kde x j ≥ 0, pro j = 1, 2, ..., n.<br />
a 11 x 1 + a 12 x 2 + · · · + a 1n x n ≤ b 1<br />
.<br />
a m1 x 1 + a m2 x 2 + · · · + a mn x n ≤ b m ,<br />
Sumační zápis úlohy :<br />
Stanovíme x 1 , x 2 , ..., x n tak, aby cenový funkcionál<br />
∑<br />
f(x) = n c j x j<br />
j=1<br />
nabyl svého maxima na množině přípustných řešení<br />
kde x j ≥ 0 pro j = 1, 2, ..., n<br />
n∑<br />
a ij x j ≤ b i pro i = 1, 2, ..., m,<br />
j=1<br />
Maticový zápis úlohy(nejstručnější) :<br />
Stanovíme x 1 , x 2 , ..., x n tak, aby cenový funkcionál<br />
f(x) = c T x<br />
nabyl svého maxima na množině přípustných řešení<br />
kde x ≥ 0.<br />
Ax ≤ b,<br />
4
3.2.3 Smíšený tvar úlohy lineárního programování<br />
Obecný zápis úlohy :<br />
Stanovíme x 1 , x 2 , ..., x n tak, aby cenový funkcionál<br />
f(x) = c 1 x 1 + c 2 x 2 + ... + c n x n<br />
nabyl svého maxima na množině přípustných řešení<br />
a 11 x 1 + a 12 x 2 + · · · + a 1n x n ≤ b 1<br />
a k1 x 1 + a k2 x 2 + · · · + a kn x n ≤ b k<br />
.<br />
a k+1,1 x 1 + a k+1,2 x 2 + · · · + a k+1,n x n = b k+1<br />
.<br />
a m1 x 1 + a m2 x 2 + · · · + a mn x n = b m ,<br />
kde x j ≥ 0, pro j = 1, 2, ..., l a x j ∈ R pro j = l + 1, ..., n.<br />
Sumační zápis úlohy :<br />
Stanovíme x 1 , x 2 , ..., x n tak, aby cenový funkcionál<br />
∑<br />
f(x) = n c j x j<br />
j=1<br />
nabyl svého maxima na množině přípustných řešení<br />
n∑<br />
a ij x j ≤ b i , pro i = 1, 2, ..., k,<br />
j=1<br />
n∑<br />
a ij x j = b i , pro i = k + 1, ..., m,<br />
j=1<br />
kde x j ≥ 0, pro j = 1, 2, ..., l a x j ∈ R pro j = l + 1, ..., n.<br />
Maticový zápis úlohy(nejstručnější) :<br />
Stanovíme x 1 , x 2 , ..., x n tak, aby cenový funkcionál<br />
f(x) = c T x<br />
nabyl svého maxima na množině přípustných řešení<br />
A 1 x ≤ b 1 ; A 2 x = b 2 ,<br />
5
kde matice struktury A typu (m, n) vznikne složením dvou submatic<br />
A 1 typu (k, n) a A 2 typu (m − k, n) takto:<br />
A =<br />
(<br />
A<br />
1<br />
A 2 )<br />
,<br />
obdobně je složen i vektor procesů:<br />
x =<br />
(<br />
x<br />
1<br />
x 2 )<br />
,<br />
kde x 1 ≥ 0, x 2 ∈ R.<br />
3.3 Převody mezi tvary úloh lineárního programování<br />
Úlohu lineárního programování lze matematicky formulovat jako úlohu nalezení extrému (maxima<br />
nebo minima) lineární funkce více proměnných při vedlejších podmínkách vyjádřených<br />
lineárními rovnicemi nebo nerovnicemi. Nerovnice lze převést na rovnice o větším počtu<br />
neznámých a řešení úloh maximalizačních na minimalizační takto:<br />
3.3.1 Převod na kanonický tvar<br />
K řešení úloh lineárního programování používám simplexový algoritmus, který nalezne základní<br />
přípustné řešení pouze, jsou-li výchozí podmínky v kanonickém tvaru(viz. kapitola 6). Z tohoto<br />
důvodu musíme nerovnice převést na rovnice doplněním dalších proměnných - přídatné<br />
proměnné.<br />
Příklad:<br />
upravíme na rovnice takto:<br />
4x 1 + 2x 2 + 5x 3 = 92<br />
3x 1 + 2x 2 + 6x 3 ≤ 84<br />
2x 1 + 5x 2 + 2x 3 ≥ 95<br />
4x 1 + 2x 2 + 5x 3 = 92<br />
3x 1 + 2x 2 + 6x 3 + x 4 = 84<br />
2x 1 + 5x 2 + 2x 3 − x 5 = 95,<br />
kde x 4 , x 5 ≥ 0 jsou přídatné proměnné.<br />
Z příkladu je patrné, že při ≤ kladnou přídatnou proměnnou přičítáme, při ≥ ji odečítáme,<br />
rovnice není třeba upravovat.<br />
3.3.2 Maximalizace/minimalizace<br />
V další části práce se budu zabývat pouze maximalizací z toho důvodu, že převedení minimalizace<br />
f(x) na maximalizaci spočívá pouze ve změně znaménka funkce f(x) a naopak.<br />
6
3.4 Dělení řešení úlohy lineárního programování<br />
Definice 1 Přípustné řešení je řešení soustavy lineárních rovnic vlastních omezení, které<br />
vyhovuje podmínkám nezápornosti.<br />
Definice 2 Optimální řešení je právě takové přípustné řešení, které maximalizuje cenový<br />
funkcionál.<br />
Definice 3 Základní řešení je přípustné řešení, které má nejvýše tolik kladných složek, kolik<br />
je lineárně nezávislých rovnic tvořících vlastní omezení(t.j.v našem případě nejvýše m<br />
kladných složek a nejméně n−m nulových složek za předpokladu, že n ≥ m). Sloupce podmínek<br />
vlastních omezení, odpovídající kladným složkám základního řešení, jsou lineárně nezávislé.<br />
Definice 4 Degenerované řešení je základní řešení, které má více než n − m nulových složek.<br />
Věta 1 Pro každou úlohu lineárního programování nastává právě jedna ze tří možností:<br />
(i) úloha nemá přípustné řešení,<br />
(ii) úloha má optimální řešení,<br />
(iii) cenový funkcionál je na množině přípustných řešení neomezený shora.<br />
Důkaz je proveden v [2].<br />
3.5 Věty lineárního programování<br />
Věta 2 (Základní věta lineárního programování.)<br />
Má-li úloha lineárního programování optimální řešení, má též optimální řešení základní.<br />
Důkaz je proveden v [1].<br />
To znamená, že se při hledání optimálního řešení můžeme omezit na základní řešení, kterých<br />
je vždy konečný počet, nejvýše rovný kombinačnímu číslu ”n nad m”.<br />
Definice 5 Množina je konvexní, patří-li do ní s každými dvěma body množiny i jejich spojnice.<br />
Věta 3 (O vlastnostech přípustných řešení úlohy lineárního programování.)<br />
Jsou-li x 1 a x 2 dvě přípustná řešení úlohy lineárního programování, pak i každá jejich konvexní<br />
kombinace, t.j. x = kx 1 + (1 − k)x 2 , kde (0 ≤ k ≤ 1), je přípustné řešení.<br />
Důkaz je proveden v [1].<br />
Z věty vyplývá, že množina přípustných řešení úlohy lineárního programování je konvexní<br />
množinou s konečným počtem krajních bodů (vrcholů), tj. takových bodů, které neleží<br />
na spojnici jiných dvou bodů množiny. Lze dokázat, že základní řešení odpovídají krajním<br />
bodům konvexní množiny přípustných řešení.<br />
7
4 Simplexová metoda<br />
Princip metody je dán základní větou lineárního programování, tj. optimální řešení je nutně<br />
základní řešení soustavy m lineárních rovnic pro n neznámých. Simplexová metoda pak pracuje<br />
se dvěma rozhodnutími.<br />
1. rozhodnutí: je-li řešení optimální, pak metoda končí,<br />
není-li řešení optimální, pak se přejde ke 2. rozhodnutí<br />
2. rozhodnutí: provede se výběr nezákladní a jednoznačné stanovení základní proměnné,<br />
které se navzájem nahradí, přičemž se dosáhne zlepšení hodnoty cenového funkcionálu<br />
Výběr nezákladní proměnné (tu budeme označovat jako proměnná zařazovaná do báze) je<br />
pro 2. rozhodnutí podmíněn kriteriem, tj. zda maximalizujeme či minimalizujeme cenový<br />
funkcionál. Jednoznačné stanovení základní proměnné (budeme ji označovat jako proměnná<br />
vylučovaná), která opustí bázi, závisí na kvalitě požadovaného optimálního řešení, které<br />
je nejčastěji dáno nezáporností proměnných. Mějme tedy prostor přípustných řešení dán<br />
podmínkami:<br />
Ax = b; x ≥ 0; b ≥ 0.<br />
Je-li b T = [b 1 , b 2 , . . . , b m ] vektor s nezápornými složkami, pak každý vektor x T = [x 1 , x 2 , . . . , x n ]<br />
splňující výše uvedené podmínky je přípustným řešením, které může sloužit za výchozí řešení<br />
pro obecnější metody než je simplexová. Ta požaduje speciální přípustné řešení, a to pouze<br />
základní přípustné řešení. Metoda sama identifikuje změny cenového funkcionálu a jeho<br />
číselnou hodnotu. Realizuje se provedením vhodné eliminační metody, při které se zvolená<br />
nezákladní proměnná převede do báze a tam jednoznačně nahradí určitou základní proměnnou,<br />
která naopak bázi opustí a stane se proměnnou nezákladní.<br />
Simplexová metoda převádí jedno základní přípustné řešení v jiné základní přípustné řešení<br />
a kontroluje, zda ja dosaženo optima. V důsledku toho je nutné, aby matematický model<br />
byl v kanonickém tvaru. Pokud jej nemáme, je třeba někdy použít jednoduché úpravy, jindy<br />
náročnějšího postupu, abychom si opatřili kanonický tvar se základním přípustným řešením.<br />
Řešení soustavy rovnic můžeme explicitně vyjádřit pomocí základních proměnných ve tvaru<br />
kde i = 1, 2, ..., m.<br />
n∑<br />
x n+i = b i + a ij (−x j ) ≥ 0, (1)<br />
j=1<br />
Označíme-li hodnotu cenového funkcionálu z pro toto základní řešení z 0 , je<br />
∑<br />
z 0 = m ∑<br />
c n+i x n+i = m c n+i b i .<br />
i=1<br />
i=1<br />
Použijeme-li vyjádření (1), platí pro cenový funkcionál<br />
8
Označíme-li<br />
je<br />
∑<br />
z = n ∑<br />
c j x j + m c n+i x n+i<br />
j=1<br />
i=1<br />
∑<br />
z = n ∑<br />
c j x j + m ∑<br />
c n+i b i + m n∑<br />
c n+i a ij (−x j )<br />
j=1 i=1<br />
i=1 j=1<br />
∑<br />
z = z 0 + n ( m∑<br />
j=1<br />
i=1<br />
a ij c n+i − c j<br />
)<br />
· (−x j ).<br />
∑<br />
α j = m a ij c n+i − c j ,<br />
i=1<br />
n∑<br />
z = z 0 + α j (−x j ). (2)<br />
i=1<br />
Výraz (2) pak rozhoduje o tom, zda je dosaženo optima či nikoliv. Zvýšení hodnoty cenového<br />
funkcionálu z je možno dosáhnout tehdy, když bude výraz<br />
n∑<br />
α j (−x j ) > 0.<br />
j=1<br />
Protože je<br />
∑<br />
α j = m a ij c n+i − c j ,<br />
i=1<br />
x j ≥ 0,<br />
je nutné, aby současně bylo aspoň pro některé j<br />
α j < 0<br />
a v důsledku toho bylo možno zvýšit hodnotu cenového funkcionálu z.<br />
Je-li naopak<br />
α j ≥ 0 pro všechna j,<br />
pak pro maximalizaci je dosaženo optimálního řešení.<br />
Uvedený rozbor je současně zdůvodněním druhého kroku algoritmu simplexové metody.<br />
5 Algoritmus simplexové metody<br />
Algoritmus simplexové metody se používá k nalezení řešení úlohy lineárního programování.<br />
Níže popsaný algoritmus nalezne maximální řešení. Pro hledání minima musíme změnit<br />
znaménko cenového funkcionálu. Celý postup můžeme rozložit do následujících šesti kroků:<br />
9
5.1 1. krok<br />
Soustavu rovnic definujících prostor přípustných řešení spolu s cenovým funkcionálem zapíšeme<br />
do tabulky.<br />
b −x 1 −x 2 . . . −x n −x n+1 −x n+2 . . . −x n+m<br />
x n+1 b 1 a 11 a 12 . . . a 1n 1 0 . . . 0<br />
x n+2 b 2 a 21 a 22 . . . a 2n 0 1 . . . 0<br />
.<br />
x n+m b m a m1 a m2 . . . a mn 0 0 . . . 1<br />
z z 0 α 1 α 2 . . . α n 0 0 . . . 0<br />
5.2 2. krok - test optimality<br />
Je-li řešení optimální (maximální), zjistíme vyhodnocením koeficientů α j pro každou nezákladní<br />
proměnnou x j (podle (2)), kde v prvním kroku α j = −c j .<br />
Hodnoty α j budeme označovat jako oceňovací koeficienty. Absolutní hodnota záporných koeficientů<br />
α j udává, o kolik vzroste cenový funkcionál, jestliže v právě určeném základním<br />
řešení hodnotu nezákladní proměnné x j zvětšíme z nuly na jedničku a ostatní nezákladní<br />
proměnné zůstanou nulové. Hodnoty základních proměnných vyčíslíme ze soustavy rovnic<br />
vlastních omezení.<br />
Důsledkem je: je-li jeden nebo více oceňovacích koeficientů α j záporných, není dosaženo maxima<br />
a je třeba provést nejméně jednu další iteraci. Jsou-li všechny koeficienty α j > 0, je<br />
dosaženo maxima. Je-li α j = 0, pak existuje více rovnocenných optimálních řešení.<br />
5.3 3. krok - volba klíčového sloupce<br />
Ze všech α j zvolíme ten sloupec, kde<br />
a) α j < 0, což nastane pro j = s,<br />
b) nejméně jeden z koeficientů a is v s-tém sloupci je kladný.<br />
Lze oprávněně očekávat, že pro maximální −α j dosáhneme i největšího růstu cenového funkcionálu,<br />
ale nemusí tomu tak být. Nevhodná volba klíčového sloupce může pouze prodloužit<br />
vlastní výpočet, nemá vliv na konečný výsledek algoritmu. Není-li splněna podmínka 3b),<br />
bude cenový funkcionál vzrůstat nade všechny meze, a není už tedy zapotřebí v algoritmu<br />
pokračovat.<br />
5.4 4. krok - volba řádku a tedy určení proměnné, která opustí bázi<br />
Bázi opustí ta proměnná, která po vytoření podílů b i<br />
a is<br />
bude mít index nejmenšího kladného<br />
podílu(proč tomu tak je viz. kapitola 5.7). Pro tento podíl tedy bude i = r. Ve třetím kroku<br />
zvolený sloupec s a takto určený r-tý řádek nazýváme klíčovým sloupcem a řádkem. Společný<br />
prvek klíčového sloupce a řádku označujeme za klíčový prvek (pivot).<br />
5.5 5. krok - transformace simplexové tabulky<br />
Pravidla pro výpočet nové tabulky jsou v podstatě jedním krokem Jordanovy eliminace. Ta<br />
spočívá v tom, že<br />
a) dělíme všechny prvky klíčového řádku klíčovým prvkem, protože je třeba v klíčovém<br />
10
sloupci získat jednotkový bázický vektor,<br />
b) klíčový řádek násobíme i-tou složkou vektoru klíčového sloupce a odečteme od i-tého<br />
řádku. Tedy nad a pod klíčovým prvkem potřebujeme vytvořit nuly. Tyto transformace se<br />
provedou včetně sloupce vektoru pravých stran i koeficientů cenového funkcionálu.<br />
Novou základní proměnnou zapíšeme do pravého sloupce. Takže se tabulka po provedení<br />
transformace změní takto:<br />
5.6 6. krok<br />
b −x 1 −x 2 . . . −x r . . . −x n −x n+1 −x r −x n+m<br />
x n+1 b 1 a 11 a 12 0 a 1n 1 a 1r 0<br />
.<br />
x s b r a r1 a r2 1 a rn 0 a rr 0<br />
.<br />
x n+m b m a m1 a m2 0 a mn 0 a mr 1<br />
z z 1 α 1 α 2 0 α n 0 α r 0<br />
Kroky 2. až 5. opakujeme tak dlouho, až je splněna podmínka optimality v kroku 2. Pak<br />
hodnota z 1 udává hodnotu cenového funkcionálu a základní proměnné, tj. proměnné zapsané<br />
v levém sloupci se rovnají hodnotám složek vektoru pravých stran b i .<br />
Pokud bude proměnná x s základní, bude vždy s-tý sloupec obsahovat jednu jedničku a ostatní<br />
nuly a nenese pro další výpočet či jiné potřeby žádnou užitečnou informaci a je možné jej<br />
vynechat. Jinými slovy: dovedeme-li pro daný model udat netriviální základní řešení tak, že<br />
po eventuálním uspořádání je to právě prvých m proměnných, jež jsou nenulové, můžeme<br />
simplexové schéma zapsat ve tvaru<br />
b i −x m+1 −x m+2 . . . −x m+n<br />
x 1 b 1 a 1,m+1 a 1,m+2 a 1,m+n<br />
x 2<br />
.<br />
b 2 a 2,m+1 a 2,m+2 a 2,m+n<br />
(3)<br />
z z m α m+1 α m+2 α m+n<br />
x m b m a m,m+1 a m,m+2 a m,m+n<br />
5.7 Zdůvodnění výběru klíčového prvku<br />
Vylučme případ degenerace, tj. neurčitost výběru základní proměnné, která má být vyloučena<br />
z báze. Budeme předpokládat, že máme jisté základní řešení (3), ve kterém prvých<br />
m proměnných jsou kladná čísla. Pak toto řešení můžeme zapsat vektorově.<br />
m∑<br />
x j A j = b,<br />
j=1<br />
kde<br />
x j > 0 pro j = 1, 2, . . . , m (4)<br />
x j = 0 pro j = m + 1, . . . , m + n<br />
11
A j jsou sloupcové vektory matice A. Je-li x nějaké základní řešení, pak sloupcové vektory<br />
A 1 , A 2 , . . . , A m jsou lineárně nezávislé a tvoří bázi m-dimenzionálního vektorového prostoru.<br />
Ve třetím kroku proměnná x s musí nahradit proměnnou x r a ostatní základní proměnné<br />
x 1 , x 2 , . . . , x r−1 , x r+1 , . . . , x m musí zůstat kladnými. Protože A 1 , . . . , A m jsou bází m-dimenzionálního<br />
vektorového prostoru, je vektor A s jejich lineární kombinací<br />
m∑<br />
A s = λ j A j (5)<br />
j=1<br />
vynásobíme skalárem x s<br />
x s A s =<br />
a použijeme-li (4), můžeme psát<br />
m∑<br />
x s λ j A j (6)<br />
j=1<br />
m∑<br />
(x j − λ j x s ) A j + x s A s = b<br />
j=1<br />
kde<br />
x s =<br />
min<br />
1≤j≤m<br />
{ }<br />
xj<br />
; λ j > 0 = x r<br />
> 0 (7)<br />
λ j λ j<br />
x j − x s λ j > 0<br />
x r − x s λ r = 0.<br />
pro j = 1, 2, . . . , r − 1, r + 1, . . . , m<br />
Definujeme-li nový vektor x 1 , tak aby odpovídal výše uvedeným podmínkám, tedy takto:<br />
⎧<br />
⎪⎨ x j − x s λ j pro j = 1, . . . , r − 1, r + 1, . . . , m<br />
x 1 j = x<br />
⎪ j j = r<br />
⎩ 0 j = m + 1, . . . , m + n<br />
je přípustným vektorem. Není-li naopak splněna podmínka (7), tj.pro všechna j je λ j ≤ 0,<br />
nemá úloha konečné řešení a cenový funkcionál na zadaném omezení neomezeně roste.<br />
Zbývá dokázat, že nová báze, která odpovídá řešení x 1 , je lineárně nezávislá. Provedeme<br />
jej sporem. Předpokládejme, že lineární kombinace sloupcových vektorů s vesměs nenulovými<br />
koeficienty µ i je<br />
µ 1 A 1 + . . . + µ r−1 A r−1 + µ r+1 A r+1 + . . . + µ m A m + µ s A s =<br />
Určitě je µ s ≠ 0, nebot’ jinak by byly A 1 , . . . , A m lineárně závislé.<br />
Dosazením z (6) do (8) získáme<br />
m∑<br />
j=1,j≠r<br />
µ j A j + µ s A s = 0 (8)<br />
m∑<br />
m∑<br />
µ j A j + µ s λ j A j =<br />
m∑<br />
(µ j + µ s λ j ) A j + µ s λ r A r = 0 (9)<br />
j=1,j≠r j=1<br />
j=1,j≠r<br />
Protože µ s ≠ 0 a podle (7) λ r > 0 je µ s λ r ≠ 0, a pak z (9) vyplývá, že sloupcové vektory<br />
A 1 , . . . , A m jsou lineárně závislé, což je ve sporu s předpokladem. Musí být tedy sloupcové<br />
12
vektory A 1 , . . . , A r−1 , A r+1 , . . . , A m , A s lineárně nezávislé. Tím jsme dokázali, že při simplexové<br />
metodě po každém iteračním kroku dostaneme přípustné základní řešení, které pro m<br />
nezávislých podmínek omezení přiřazují m kladných hodnot.<br />
Jestliže v soustavě (3) jsou některé z koeficientů α j pro j = m + 1, . . . , m + n záporné, je<br />
možno hodnotu cenového funkcionálu zvýšit a to tak, že některou ze základních proměnných<br />
x 1 , . . . , x m nahradíme nezákladní proměnnou x j pro j = m + 1, . . . , m + n, jejíž koeficient<br />
α j < 0. Je-li jich více, vzniká otázka, kterou z nich zvolit. Obecně je jedno, kterou z nich vybereme,<br />
ale ta proměnná, jejíž absolutní hodnota α j je maximální, s větší pravděpodobností<br />
přispěje k podstatnějšímu zvětšení cenového funkcionálu. Odpověd’ na druhou otázku, kterou<br />
ze základních proměnných vyloučit z báze, je už jednoznačná. Jestliže si označíme β j = b j z<br />
(3) a x j = t pro tu proměnnou, která se stane základní, získáme pro ostatní základní proměnné<br />
toto vyjádření:<br />
x 1 = β 1 − α 1,j t<br />
x 2 = β 2 − α 2,j t<br />
.<br />
x m = β m − α m,j t,<br />
kde j = m + 1, . . . , m + n.<br />
Základní proměnné musí být kladné až na jednu, která se právě provedením iterace stane<br />
nezákladní a tím nulovou.<br />
Musí tedy t splňovat tyto podmínky:<br />
kde i = 1, 2, . . . , m, a j = 1, 2, . . . , m + n.<br />
0 ≤ t ≤ β i<br />
α ij<br />
,<br />
Protože t ≥ 0, musí být koeficienty β i a α ij téhož znaménka. Koeficient β i je vždy nezáporný,<br />
a proto se na stanovení klíčového řádku podílejí pouze koeficienty α ij > 0.<br />
5.8 Příklad<br />
Zadání matematického modelu:<br />
3x 1 + 4x 2 + 2x 3 ≤ 200<br />
5x 1 + 2x 2 + 3x 3 ≤ 180<br />
x 1 ≥ 0<br />
x 2 ≥ 0<br />
x 3 ≥ 0<br />
z = max(x 1 + x 2 + x 3 )<br />
Řešení:<br />
K matematickému modelu sestavíme tabulku.<br />
b −x 1 −x 2 −x 3 −x 4 −x 5<br />
x 4 200 3 4 2 1 0<br />
x 5 180 5 2 3 0 1<br />
z 0 −1 −1 −1 0 0<br />
13
Podle 2. kroku není dosaženo optimálního řešení, a podle 3. kroku lze kteroukoli z proměnných<br />
x 1 , x 2 , x 3 zařadit do báze. Zvolme třeba x 2 za novou bázickou proměnnou a použitím 4. kroku<br />
určíme, kterou z proměnných x 4 , x 5 nahradí. Minimální z podílů je<br />
(<br />
min 200<br />
4 ; 180<br />
2<br />
)<br />
= min (50; 90) = 50,<br />
a proto proměnná x 4 opustí bázi a použitím pravidel 5. kroku získáme novou tabulku:<br />
b −x 1 −x 2 −x 3 −x 4 −x 5<br />
3<br />
1<br />
x 2 50<br />
4<br />
1<br />
2<br />
1<br />
4<br />
0<br />
x 5 80<br />
7<br />
2<br />
0 2 − 1 2<br />
1<br />
z 50 − 1 4<br />
0 − 1 2<br />
1<br />
4<br />
0<br />
Protože není splněna podmínka 2. kroku, je nutno opakovat kroky 3., 4., 5. ještě jednou a<br />
tedy dostaneme další tabulku:<br />
b −x 1 −x 2 −x 3 −x 4 −x 5<br />
x 2 30 − 1 8<br />
1 0 − 1 8<br />
− 1 4<br />
x 3 40<br />
7<br />
4<br />
0 1 − 1 4<br />
1<br />
2<br />
5<br />
1<br />
z 70<br />
8<br />
0 0<br />
8<br />
1<br />
4<br />
Řádek cenového funkcionálu neobsahuje ani jeden záporný oceňovací koeficient a tím je splňen<br />
požadavek optimality a iterační proces končí s výsledkem<br />
a hodnotou cenového funkcionálu<br />
6 Simplexový algoritmus<br />
x 2 = 30, x 3 = 40<br />
z = 70.<br />
Jak jsme v předchozích odstavcích zjistili, je simplexová metoda aplikovatelná jen v tom<br />
případě, že známe základní přípustné řešení. Takové výchozí podmínky udává jen kanonický<br />
tvar lineární úlohy. Na ostatní tvary, tj. symetrický a smíšený nelze bezprostředně aplikovat<br />
simplexovou metodu a je tedy nutné oba tyto tvary nejprve na kanonický upravit. Celý postup,<br />
který vede k získání základního přípustného řešení, rozdělíme do dvou fází.<br />
14
6.1 Prvá fáze<br />
1 – jsou-li podmínky vlastních omezení nerovnice, doplníme je přídatnými proměnnými na<br />
rovnice<br />
2 – obsahuje-li rozšířená strukturní matice A ∗ úplnou jednotkovou submatici téže hodnosti<br />
jako matice nerozšířená, získáme kanonický tvar a současně základní přípustné řešení<br />
zadané úlohy<br />
3 – neobsahuje-li rozšířená strukturní matice A ∗ úplnou jednotkovou submatici téže hodnosti<br />
jako matice nerozšířená, je nutno zařadit další pomocné (umělé) proměnné v takovém<br />
počtu, až získáme pro soustavu vlastních omezení soustavu rovnic<br />
4 – podle 3. bodu zkonstruovaný kanonický tvar, kde bázi tvoří pomocné, eventuálně přídatné<br />
proměnné, neudává ještě přípustné řešení původní úlohy. Nejčastější postupy vedoucí k<br />
získání přípustného řešení původní úlohy používají metody prohibitivních ocenění<br />
k vyhledání základního přípustného řešení původní úlohy, nebo ke zjištění, že původní<br />
úloha nemá přípustné řešení, jinými slovy je sporně formulována<br />
6.2 Druhá fáze<br />
Za předpokladu, že jsme v prvé fázi získali základní přípustné řešení původní úlohy, použijeme<br />
simplexové metody k vyhledání řešení optimálního, pokud existuje, nebo ke zjištění, že původní<br />
cenový funkcionál nabývá při maximalizaci nekonečné hodnoty.<br />
6.3 Příklad obecně<br />
Matematický model v symetrickém tvaru s kladnými úrovněmi činitelů převedeme na model<br />
výpočetní se základním přípustným řešením prostým zavedením přídatných proměnných.<br />
Zápis výchozího modelu<br />
Zápis modelu rozšířeného<br />
kde matice A ∗ = (A|E)<br />
a vektor x ∗ =<br />
(<br />
x1<br />
x 2<br />
)<br />
.<br />
z = max c T x 1<br />
Ax 1 ≤ b; b ≥ 0; x 1 ≥ 0<br />
z = max c T x 1<br />
A ∗ x ∗ = b; b ≥ 0; x ∗ ≥ 0,<br />
V tomto případě provedeme ze simplexového algoritmu v prvé fázi - prvý a druhý bod a<br />
přejdeme k druhé fázi - vlastní optimalizaci.<br />
15
6.4 Příklad<br />
Maximalizujte cenový funkcionál<br />
s podmínkami omezení<br />
a podmínkami nezápornosti<br />
f(x) = 10x 1 + 15x 2 + 20x 3 + 7x 4 + 12x 5<br />
x 1 + 2x 2 + x 3 + 3x 4 + ≤ 750<br />
3x 1 + 2x 2 + 2x 3 + + 4x 5 ≤ 1000<br />
2x 1 + 4x 2 + x 3 + 2x 4 + 3x 5 ≤ 980<br />
x j ≥ 0 j = 1, 2, . . . , 5.<br />
Zavedením nezáporných přídatných proměnných x 6 , x 7 , x 8 získáme výpočetní model a tím<br />
současně splníme první fázi simplexového algoritmu.<br />
Výpočetní model je<br />
s vlastními omezeními<br />
z = max (10x 1 + 15x 2 + 20x 3 + 7x 4 + 12x 5 )<br />
x 1 + 2x 2 + x 3 + 3x 4 + + x 6 = 750<br />
3x 1 + 2x 2 + 2x 3 + + 4x 5 + x 7 = 1000<br />
2x 1 + 4x 2 + x 3 + 2x 4 + 3x 5 + x 8 = 980<br />
a podmínkami nezápornosti<br />
Tento model zapíšeme do tabulky takto:<br />
x j ≥ 0 j = 1, 2, . . . , 8.<br />
b −x 1 −x 2 −x 3 −x 4 −x 5 −x 6 −x 7 −x 8<br />
x 6 750 1 2 1 3 0 1 0 0<br />
x 7 1000 3 2 2 0 4 0 1 0<br />
x 8 980 2 4 1 2 3 0 0 1<br />
z 0 -10 -15 -20 -7 -12 0 0 0<br />
7 Metoda prohibitivních ocenění<br />
V tomto případě bude prvá fáze simplexového algoritmu složitější než v předchozím případě.<br />
Vyjděme z matematického modelu ve tvaru<br />
z = max c T x<br />
Ax = b; x ≥ 0<br />
Podmínky vlastních omezení jsou rovnice a není třeba zařazovat přídatné proměnné. Prvou<br />
fázi započneme třetím bodem. Zařadíme pomocné proměnné, a to v počtu rovnajícímu se<br />
počtu rovnic v soustavě Ax = b a jejich vektor označíme y. Budeme tedy mít výpočetní<br />
model ve tvaru<br />
16
kde x ∗ =<br />
(<br />
x<br />
y<br />
)<br />
a<br />
z = max c ∗T x ∗<br />
(A|E) x ∗ = b, x ∗ ≥ 0,<br />
c ∗ – je vektor ocenění rozšířený o složky oceňující proměnné y i<br />
E – je jednotková matice hodnosti m,<br />
y – je vektor pomocných proměnných<br />
Matematický model původní měl vlastní omezení ve tvaru rovnic. Úprava na kanonický tvar<br />
uměle zavádí pomocné proměnné a ty jsou v modelu nežádoucím faktorem a potřebujeme<br />
je během výpočtu co nejdříve z báze vyloučit. Toho dosáhneme prohibitivním oceněním. Při<br />
maximalizaci volíme velká záporná ocenění, při minimalizaci naopak velká kladná ocenění. V<br />
numerickém příkladě vybereme absolutně největší ocenění, znásobíme alespoň 10 a opatříme<br />
- kladným znaménkem při minimalizaci,<br />
- záporným znaménkem při maximalizaci.<br />
Tím jsme získali v cenovém funkcionálu nenulové ocenění a základní proměnné nemají přiřazeny<br />
jednotkové vektory strukturních koeficientů. Proto musíme prohibitivní ocenění promítnout<br />
do cenového funkcionálu a ocenění nezákladních proměnných. Pak teprve získáme základní<br />
řešení a použitím simplexové metody postupně vyloučíme pomocné proměnné z báze a získáme<br />
základní přípustné řešení původní úlohy. Tím skončíme prvou fázi a přejdeme k vlastní optimalizaci,<br />
tj. druhé fázi simplexového algoritmu.<br />
7.1 Příklad<br />
Maximalizujte cenový funkcionál<br />
s podmínkami omezení<br />
a podmínkami nezápornosti<br />
z = 10x 1 + 15x 2 + 20x 3 + 7x 4 + 12x 5<br />
2x 1 + x 2 + 3x 3 + + 2x 5 = 1000<br />
1x 1 + 3x 2 + x 3 + 2x 4 + 4x 5 = 1200<br />
3x 1 + 2x 2 + 2x 3 + 3x 4 + x 5 = 1500<br />
x j ≥ 0 j = 1, 2, . . . , 5.<br />
Zavedeme pomocné (umělé) proměnné y 1 , y 2 , y 3 a jejich prohibitivní ocenění −100.<br />
Příslušný výpočetní model je<br />
s podmínkami omezení<br />
z = max (10x 1 + 15x 2 + 20x 3 + 7x 4 + 12x 5 − 100(y 1 + y 2 + y 3 ))<br />
2x 1 + x 2 + 3x 3 + + 2x 5 + y 1 = 1000<br />
1x 1 + 3x 2 + x 3 + 2x 4 + 4x 5 + y 2 = 1200<br />
3x 1 + 2x 2 + 2x 3 + 3x 4 + x 5 + y 3 = 1500<br />
17
a podmínkami nezápornosti<br />
Tento model přepíšeme do výpočetní tabulky<br />
x j ≥ 0 j = 1, 2, . . . , 5,<br />
y i ≥ 0 i = 1, 2, 3.<br />
b −x 1 −x 2 −x 3 −x 4 −x 5 −y 1 −y 2 −y 3<br />
y 1 1000 2 1 3 0 2 1 0 0<br />
y 2 1200 1 3 1 2 4 0 1 0<br />
y 3 1500 3 2 2 3 1 0 0 1<br />
z 0 -10 -15 -20 -7 -12 100 100 100<br />
Vynásobením 1., 2. a 3. řádku (-100) a přičtením k cenovému funkcionálu získáme základní<br />
řešení pomocného problému.<br />
b −x 1 −x 2 −x 3 −x 4 −x 5 −y 1 −y 2 −y 3<br />
y 1 1000 2 1 3 0 2 1 0 0<br />
y 2 1200 1 3 1 2 4 0 1 0<br />
y 3 1500 3 2 2 3 1 0 0 1<br />
z -370000 -610 -615 -620 -507 -712 0 0 0<br />
Dalším postupem bude nahradit základní pomocné proměnné y i skutečnými proměnnými x j<br />
v souladu s kriteriem optimality cenového funkcionálu.<br />
Použijeme simplexové metody a vyloučíme pomocné proměnné y 1 , y 2 , y 3 z báze a nahradíme je<br />
skutečnými proměnnými x j . Při eliminaci proměnných y i můžeme ihned vynechávat příslušný<br />
sloupec tabulky. Pro odstranění všech pomocných proměnných z báze je hodnota cenového<br />
funkcionálu z vždy různá od nuly. Po postupném nahrazení<br />
y 2 proměnnou x 5 ,<br />
y 1 proměnnou x 3 ,<br />
y 3 proměnnou x 4<br />
dostaneme přípustné řešení původního problému.<br />
b −x 1 −x 2 −x 3 −x 4 −x 5<br />
x 3 275 0,8125 0 1 0 0<br />
x 5 87,5 -0,21875 0,5 0 1 0<br />
x 4 287,5 0,53125 0,5 0 0 1<br />
z 8562,5 7,34375 -5,5 0 0 0<br />
Získané řešení je přípustné a základní, ale není dosud optimální. Přejdeme k druhé fázi simplexového<br />
algoritmu a vyhledáme řešení optimální jedním použitím simplexové metody.<br />
8 Simplexová metoda pro degenerované úlohy<br />
V případě degenerovaných úloh lineárního programování se v průběhu výpočtu může stát,<br />
že při aplikaci pravidla 4. kroku nebude jen jeden minimální podíl. Důsledkem této situace<br />
bude, že se v následujícím kroku objeví v simplexové tabulce v prvním sloupci alespoň jedna<br />
18
z bázických proměnných s hodnotou 0. V takovém případě v dalším kroku, přechodu od<br />
jedné báze k bázi druhé nedojde ke změně hodnoty cílové funkce. Je nebezpečí, že se budeme<br />
znovu vracet k bázím, které jsme již prohlédli (vzniká nebezpečí zacyklení algoritmu). Je<br />
více způsobů, jak této situaci čelit. Základem všech je upřesnění pravidel výběru klíčového<br />
sloupce a řádku tak, aby výběr byl jednoznačný. Pravidlo 4. kroku je možno přeformulovat<br />
tak, že pro vybraný klíčový sloupec vytvoříme podíly mezi prvky vektoru b a kladnými prvky<br />
klíčového sloupce (mimo řádek simplexové tabulky, kde ze zapsána účelová funkce) a vybereme<br />
minimální podíl. Pokud je řádků s minimálním podílem více, tak z báze vylučujeme vektor,<br />
který bude odpovídat lexikograficky minimálnímu řádku.<br />
Věta 4 Vektor a = (a 1 , a 2 , . . . , a n ) nazveme lexikograficky menší než nulový vektor, jestliže<br />
první nenulová komponenta vektoru a je záporná. Vektor a je lexikograficky menší než vektor<br />
b, jestliže vektor a − b je lexikograficky menší než nulový vektor.<br />
Důkaz je proveden v [3].<br />
8.1 Příklad<br />
Mějme zadanou úlohu, která se dá shrnout do následující zkrácené simplexové tabulky. Na<br />
posledním řádku se nalézá cenový funkcionál a cílem optimalizace je nalézt maximum funkce.<br />
b −x 1 −x 2 −x 3<br />
5 1 2 3<br />
5 1 1 5<br />
10 1 2 3<br />
10 2 1 0<br />
0 -7 2 -3<br />
Je zřejmé, že do báze bude vstupovat proměnná x 1 , protože má nejzápornější α = −7<br />
a zároveň ( obsahuje ) nezáporné prvky. Dalším krokem je zjištění minimálního podílu, tedy<br />
min 5<br />
1 , 5 1 , 10 1 , 10 2 , = 5. Takovému výsledku ale odpovídají hned tři řádky a proto se musí<br />
vybrat lexikograficky minimální. Takže po jednotlivých krocích se vždy zjišt’uje řádek s<br />
nejmenším prvkem v prvním sloupci, dojde-li ke shodě, zkontrolují se prvky dalším sloupci, a<br />
tak dál až se nalezne lexikograficky minimální řádek. Konkrétně na našem příkladě se výběru<br />
účastní řádky 1., 2. a 4. jejichž první sloupec (sloupec b) nabývá hodnot 5, 5 a 10, minimálním<br />
prvkem je 5. Tuto hodnotu ale mají jak 1. řádek tak 2. řádek, proto se zkontroluje druhý sloupec<br />
s hodnotami 1 a 1. Opět tedy nemůžeme určit minální řádek. Rozhodne se až v třetím<br />
testu, kde má první řádek hodnotu 2 a druhý hodnotu 1. Ted’ už můžeme jednoznačně říct,<br />
že lexikograficky minimální řádek je druhý, a proto to bude právě ten, který opustí bázi.<br />
9 Použití LU pro zachování řídkosti<br />
Protože jsem simplexový algoritmus používal na velmi řídkých omezujících podmínkách, tak<br />
simplexová tabulka byla řídkou maticí. Tu jsem si před zahájením výpočtů rozdělil na dolní<br />
trojúhelníkovou matici L a horní trojúhelníkovou matici U pomocí LU-rozkladu bez pivotizace.<br />
To v důsledku znamená, že matice L nevypadá jako dolní trojúhelníková, ale kdyby se<br />
pronásobila zleva pivotizační maticí, tak by vypadala správně.<br />
19
Samotný eliminační krok (viz. kapitola 5.6) se potom ale bude provádět pouze na matici L,<br />
protože veškeré řádkové úpravy této matice dávají ve výsledném součinu L · U stejnou matici,<br />
kterou bychom získali řádkovými úpravami prováděnými přímo na ní samotné. Takže po eliminaci<br />
získanou novou matici L, která ted’ už není dolní trojúhelníková a je navíc doplněna o<br />
nové nenulové prvky, opět rozložíme na nové matice l a u. Matice l bude po tomto rozkladu<br />
opět obohacena o nulové prvky a uložíme ji jako L. Tím se zachovává její stálá řídkost. Matici<br />
U sestavíme jako součin u · U. Protože násobíme dvě horní trojúhelníkové matice, je výsledná<br />
opět horní trojúhelníková. Matice U se bude neustále zaplňovat, ale kvůli řídké matici L se<br />
bude při počítání konkrétního prvku téměř pořád násobit jenom nulou.<br />
10 Popis vytvořených algoritmů<br />
Algoritmy jsem psal v MATLABu jako M-funkce (viz. Přílohy).<br />
10.1 Simplexový algoritmus<br />
Nejdřív se začne sestavovat simplexová tabulka tak, že se k matici A přidá vektor s koeficienty<br />
cenového funkcionálu vždy tak, aby další postup mohl hledat maximum. Zkontroluje se<br />
vektor v, který uchovává informaci o rovnostních a nerovnostních znaméncích a podle toho<br />
můžeme přiřadit přídatnou proměnnou. Následně se přidá vektor b a zkontrolují se znaménka<br />
právě přidaného vektoru. Ty nesmí být záporné a proto při nalezení takového prvku musí<br />
celý řádek změnit své znaménko. Simplexová tabulka je dotvořena přidáním sumy sloupce k<br />
řádku s cenovým funkcionálem, který je vždycky nad ním, násobenou konstantou K. Tím je<br />
zaručeno přidání umělých proměnných.<br />
Dále se hledá nejzápornější prvek cenového funkcionálu α j , jeho zápornost se ale neporovnává<br />
s nulou, ale s hodnotou -1e-15. To proto, že počítačová matematika vnáší do svých výpočtů<br />
malou numerickou chybu. Bez těchto úprav by byl vytvořený algoritmus převážně nefunkční.<br />
Pak se zkontroluje zda-li se ve sloupci nad funkcionálem nachází alespoň jeden kladný prvek.<br />
To proto abychom mohli utvořit alespoň jeden kladný podíl a tím určit klíčový prvek. Při<br />
tvorbě podílů musíme mít opět na paměti chybu numerických výpočtů a proto se i zde zavádí<br />
jistá tolerance. Klíčový řádek se pak vybírá jako lexikograficky minimální. V této fázi už tedy<br />
máme vybraný klíčový prvek, pivot. A zbývá provést eliminaci, která spočívá ve vydělení<br />
klíčového řádku pivotem a ostatní řádky upravit tak, aby ve sloupci nad a pod pivotem<br />
zůstaly jenom nuly.<br />
Tahle část algoritmu se opakuje tak dlouho dokud se v tabulce vyskytuje alespoň jedno<br />
záporné α j . Až program nalezne optimální řešení, tak už mu jenom zbývá záskat řešení ze simplexové<br />
tabulky, kde také hned kontroluje jestli byly vyměněny všechny přídatné proměnné,<br />
pokud by nebyly vyměněny, musel by algoritmus zahlásit že daná úloha nemá řešení. Takže<br />
pokud celý proces výpočtu simplexového algoritmu úspěšně proběhl, pak funkce vrátí vektor<br />
řešení a hodnotu výsledného cenového funkcionálu.<br />
10.2 Simplexový algoritmus s LU rozkladem<br />
Tento algoritmus je v podstatě stejný jako výše popsaný. Je ale odlišný po sestavení simplexové<br />
tabulky, kterou si rozloží na dolní a horní trojúhelníkovou matici pomocí LU-rozkladu.<br />
A nadále pracuje už jen s těmito maticemi. Takže chceme-li potom pracovat s konkrétním<br />
prvkem původní matice, pak si jej musíme spočítat jako daný řádek matice L se sloupcem<br />
20
matice U. Výběr klíčového prvku se tedy provede složitěji, zato elimiace je jednodušší a její<br />
princip je lépe popsán v kapitole 9.<br />
Na následujících obrázcích se podíváme jak se měnily matice L a U.<br />
Matice L a U na začátku:<br />
Na začátku jsou ještě obě matice velmi řídké.<br />
21
Matice L a U asi v polovině algoritmu:<br />
Přibližně v polovině algoritmu je vidět jak se zaplňuje matice U, zatímco L je pořád velmi<br />
řídká.<br />
22
Matice L a U na konci:<br />
Na konci je vidět velké zaplnění matice U a matice L, která je pořád řídká.<br />
23
11 Závěr<br />
Cílem této práce bylo navrhnout simplexový algoritmus pro rozsáhlé úlohy lineárního programování.<br />
Proto jsem vytvořil funkce simplex.m a simplexLU.m, které řeší zadaný problém.<br />
Pro srovnání byla použita funkce linprog optimalizačního toolboxu MATLABu, s parametrem<br />
pro počítání simplexovou metodou. Funkce simplex.m dosahuje na malých a středně velkých<br />
úlohách stejného výsledku jako MATLABovský simplexový algoritmus s maximálním rozdílem<br />
v řádu 10 −4 . Což lze považovat za shodné výsledky. Ale navíc mnou naimplementovaný algoritmus<br />
je oproti MATLABovskému průměrně 4 až 6-krát rychlejší. Funkce simplexLU.m<br />
dosahuje stejně přesných výsledků (viz Příloha III), ale na středně velkých úlohách ještě není<br />
rychlejší než simplex.m. Řídkost matic si ale dokáže udržet, takže byl splňen požadavek této<br />
bakalářské práce.<br />
24
Reference<br />
[1] Rovný, B.: Optimální programování, lineární modely<br />
Vydala Vysoká škola báňská, <strong>Ostrava</strong> 1986<br />
[2] Rohn, J.: Lineární algebra a optimalizace<br />
Vydala Univerzita Karlova, Praha 2004<br />
[3] Berka, M.: Matematické programování<br />
http://home.eunet.cz/berka/o/matempro.htm<br />
25
Seznam příloh<br />
Příloha I - simplex.m<br />
Příloha II - simplexLU.m<br />
Příloha III - výsledky příkladu<br />
I<br />
IV<br />
VIII<br />
26