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á <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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!