Adamátor Zápisky Hlášky

Hlava prof. 🅱urdíka Pokus o lepší vysvětlení Lineárního programování než od 🅱urdíka

Předpokladem k porozumění tomuto textu je znalost poznatků z Lineární algebry 1 a 2. Na rozdíl od 🅱urdíkových přednášek není předpokladem porozumění lineárnímu programování.

Věty označené „Rohn“ jsou opsané a upravené ze skript J. Rohn: Lineární a nelineární programování (1997) .

Co je lineární programování?

Lineární programování, příhodněji také zvané lineární optimalizace, je teorie řešení optimalizačních úloh, které mají lineární charakter, tedy jsou zadané v podobě lineárních rovnic a nerovnic. Název „programování“ je historický a nemá nic společného se současným použitím tohoto slova.

Nejpoužívanějším postupem k řešení základních úloh lineárního programování je simplexová metoda (viz níže), také zvaná simplexový algoritmus. Název odpovídá geometrické představě, kde se pohybujeme po vrcholech nějakého konvexního mnohostěnu a snažíme se najít ten, který „trčí nejdál“ do nějakého směru. Účetní se dříve učili počítat velké simplexové tabulky (aniž by znali teorii za nimi), dnes už k tomu naštěstí máme počítače.

Značení

Na rozdíl od ostatních materiálů jasně značím, co je vektor (šipkou) a co matice (tučně). Symbol ∴ znamená „proto“ a ∵ znamená „protože“. Jinak by tu asi nemělo být nic překvapivého.

Simplexová metoda

Jelikož chceme optimalizovat něco s vektory, asi by mohl být dobrý nápad si nejprve zavést, jak se porovnávají. Uděláme to naprosto zřejmým způsobem:

Definice. Nechť n∈ℕ+. Nerovnost vektorů z ℝn definujeme takto: x→⋚y→⇔def(∀i∈n^)(xi⋚yi)

Tato nerovnost se v určitých ohledech chová jako nerovnost čísel. Asi není potřeba dokazovat reflexivitu, antisymetrii, tranzitivitu, přičítání nuly a podobné věci. Něco, co by nemuselo být úplně zřejmé, je násobení:

Věta (násobení nerovnosti vektorem). Nechť u→,v→,w→∈ℝn,u→≥v→,w→≥0→. Potom u→Tw→≥v→Tw→.

Nyní už přejděme k lineárnímu programování. Problémy, je kterými se v něm setkáme, můžou mít rozličné tvary, takže podrobně analyzujeme jeden, se kterým se dobře pracuje, a následně si ukážeme, že spousta ostatních se na něj dá převést.

Definice. Mějme m,n∈ℕ+,𝐀∈ℝm×n,b→∈ℝm,c→∈ℝn. Primární úloha lineárního programování je následující optimalizační úloha: min⁡{c→Tx→|x→∈ℝn,𝐀x→=b→,x→≥0→} Funkce x→↦c→Tx→, kterou chceme optimalizovat, se nazývá účelová funkce.
Definice. Přípustné řešení primární úlohy lineárního programování je jakýkoli vektor x→∈ℝn splňující 𝐀x→=b→∧x→≥0→.
Definice. Optimální řešení primární úlohy lineárního programování je přípustné řešení, pro které je c→Tx→ minimální.

Možných přípustných řešení může být celkem hodně (konkrétně nespočetně mnoho), takže zkoušet postupně všechny by asi nebyl úplně nejlepší přístup. Naštěstí se ukazuje, že se stačí zajímat o tzv. bazická řešení:

Definice. Bazické řešení primární úlohy lineárního programování je přípustné řešení, pro které jsou sloupce {A→∘j|xj>0} lineárně nezávislé.
Věta (Rohn 1). Pokud má primární úloha lineárního programování optimální řešení, potom má bazické optimální řešení.

Nyní zavedeme značení, které nám z matice umožní vybírat pouze některé sloupce. Toto značení se ukáže jako velmi užitečné v dalších větách.

Definice. Nechť B∈n^m obsahuje vzájemně různá čísla. Potom značíme 𝐀B≔(A→∘B1⋯A→∘Bm) x→B≔(xB1⋮xBm)
Definice. Pro N≔n^∖B analogicky definujeme 𝐀N,x→N.

Nyní ukážeme, že mezi bazickými řešeními a B existuje jednoduchý vztah. To je dobrá zpráva, protože možných B je pouze konečně mnoho (i když na řešení hrubou silou jich pořád může být celkem hodně).

Věta (Rohn 2). Nechť m≤n a řádky 𝐀 jsou lineárně nezávislé. Potom x→ je bazické řešení právě tehdy, pokud pro nějaké B platí:
Definice. Nechť 𝐀B je regulární a y≔𝐀B−1b→≥0. Potom definujeme x→B předpisem x→BB≔y→ x→NB≔0→

Dobře, můžeme tedy vzít nějaké B a dostaneme bazické řešení x→B, které je kandidátem na optimální řešení. Ale jak poznáme, jestli je to to pravé? Celkem jednoduše:

Věta (Rohn 3, kritérium optimality). Nechť pro nějaké B je 𝐀B regulární a platí c→T≥c→BT𝐀B−1𝐀 Potom x→B je optimální řešení primární úlohy.

Teď zavedeme taková divná písmena s čarami, jejichž význam je zatím dost nejasný, ale později z nich sestavíme simplexovou tabulku, která bude výrazně ulehčovat hledání správného B a jeho bazického řešení x→B.

Definice. Mějme B takové, že 𝐀B je regulární. Potom definujeme 𝐀≔𝐀B−1𝐀 b‾→≔x→BB=𝐀B−1b→ c‾→≔c→T−c→BT𝐀B−1𝐀 h‾≔−c→BTx→BB=−c→BT𝐀B−1b→
Věta. 𝐀B=𝐈
Věta. c‾→B=0→T

Ještě by ale bylo dobré umět poznat, kdy úloha žádné optimální řešení nemá, protože se s účelovou funkcí dokážeme dostat libovolně nízko.

Věta (Rohn 4, kritérium neomezenosti). Nechť pro nějaké B existuje s∈n^ takové, že c‾s<0 a z→≔A‾→∘s≤0→. Potom účelová funkce není zdola omezená (a úloha tedy nemá optimální řešení), to znamená inf⁡{c→Tx→|x→∈ℝn,𝐀x→=b→,x→≥0→}=−∞

Nyní již přejděme k simplexové tabulce:

Definice. Mějme primární úlohu lineárního programování a nějaké B. Simplexová tabulka je tabulka (m+1)×(n+1) ve tvaru (𝐀b‾→c‾→h‾)

Proč takovouto tabulku zavádíme? Ukazuje se, že provádění určitých řádkových úprav v simplexové tabulce odpovídá zkoušení různých B, a již víme, že pokud existuje optimální řešení, potom ho pro nějaké B v tabulce najdeme. Zároveň v pravém dolním rohu najdeme minimální hodnotu účelové funkce (akorát bez mínusu).

Věta (Rohn 5). Mějme nějaké B. Upravme původní tabulku (𝐀b→c→T0) pomocí řádkových úprav (násobení řádku konstantou a přičtení násobku řádku k jinému) do takové podoby, že pro každé j∈m^ se z Bj-tého sloupce stane e→j. Přitom nikdy nebudeme násobit poslední řádek nebo přičítat jeho násobek k jinému. Potom těmito úpravami vznikne simplexová tabulka pro dané B.

Teď už můžeme přejít k samotnému algoritmu. Myšlenka je taková, že máme simplexovou tabulku s nějakým B a snažíme se ji upravit tak, aby vzniklo jiné B vyhovující podmínce optimality. Budeme to provádět postupně: vždy vybereme jednu složku B, která se nám nelíbí, a nahradíme ji jinou složkou.

Jelikož chceme, aby na spodním řádku nebyla žádná záporná čísla, vybereme jeden sloupec s, který tam má záporné číslo, a nacpeme ho do B, což způsobí, že tam bude mít nulu. Zároveň musíme vybrat řádek r, jehož odpovídající Br z báze vyřadíme. Následně provedeme řádkové úpravy tak, aby bylo A→∘s=e→r,cs=0, čímž dostaneme opět platnou simplexovou tabulku s novým B.

Jak vybrat správné r? Chceme, aby se zvýšilo h‾, protože −h‾ je hodnota účelové funkce, kterou chceme minimalizovat. Snadno spočteme, že h‾ se po úpravě zvýší o −b‾rc‾sA‾rs. Víme, že b‾r≥0,c‾s<0, takže aby přičtený výraz byl nezáporný, potřebujeme A‾rs>0. Ale co když žádné takové r neexistuje? V takovém případě máme dole záporné číslo, nad kterým není žádné kladné číslo, takže úloha je neomezená.

Zároveň si musíme dávat pozor, aby složky b‾→ zůstaly nezáporné. Toho docílíme tím, že si zvolíme takové r, aby b‾rA‾rs bylo minimální (důkaz jde snadno rozmyslet).

Tímhle způsobem tedy dokážeme zajistit, aby hodnota účelové funkce po provedení krohu byla větší nebo rovna. Ale jak zajistíme, že se nedostaneme do nekonečné smyčky? Ještě máme určitou volnost ve volbě s,r, a té právě vyuzijeme.

Definice. Cyklus je konečná posloupnost kroků simplexového algoritmu, které začínají i končí stejným B.
Věta. V přůběhu cyklu zůstává poslední sloupec beze změny a v každém kroku platí b‾r=0.
Věta (Rohn 6, Blandovo pravidlo). Při provádění simplexového algoritmu: Potom se algoritmus nedostane do cyklu.

Pokud 𝐀 obsahuje jednotkovou matici, můžeme rovnou použít simplexovou metodu a úlohu vyřešit. Ale co když ne? V takovém případě použijeme dvoufázovou simplexovou metodu. Nejprve si zavedeme m umělých proměnných, abychom do tabulky jednotkovou matici dostali. Chceme ovšem, aby ve výsledku měly všechny hodnotu 0. To zajistíme tak, že nejprve budeme (pomocí simplexové metody) minimalizovat součet těchto umělých proměnných. Tedy vytvoříme pomocné c→, od kterého musíme ještě odečíst všechny řádky matice, aby na správných místech obsahovalo nuly. Pokud se nám podaří pomocnou účelovou funkci dostat na nulu, dostali jsme přípustné řešení, které neobsahuje umělé proměnné, takže je můžeme odstranit a pokračovat (akorát musíme přepočítat spodní řádek). Pokud se nepodaří umělou účelovou funkci dostat na nulu, znamená to, že úloha žádné přípustné řešení nemá.

Věta (Rohn 7). Pokud má primární úloha lineárního programování přípustné řešení, potom buď má optimální řešení, nebo je zdola neomezená.
Věta (Rohn 8, množina optimálních řešení). Je-li v simplexové tabulce c‾→≥0, potom nějaké x→*∈ℝn je optimální řešení právě tehdy, pokud
Věta (Rohn 9). Je-li v simplexové tabulce c‾N→>0, potom má úloha právě jedno optimální řešení (a to x→B).

Teorie duality

Definice. Duální úloha lineárního programování je následující optimalizační úloha: max⁡{b→Ty→|y→∈ℝm,𝐀Ty→≤c→}
Věta (Rohn 10, o slabé dualitě). Nechť x→,y→ jsou přípustná řešení primární a duální úlohy. Potom c→Tx→≥b→Ty→. Navíc pokud c→Tx→=b→Ty→, potom jde o optimální řešení.
Věta (Rohn 11). Je-li x→B optimální řešení primární úlohy nalezené simplexovým algoritmem, potom y→*≔(𝐀BT)−1c→B je optimální řešení duální úlohy a platí c→Tx→B=b→Ty→*.
Věta (Rohn 12, o dualitě). Primární úloha lineárního programování má optimální řešení právě tehdy, pokud ho má duální úloha. V tom případě jsou optimální hodnoty stejné.
Věta (Rohn 13). Pokud jsou primární i duální úloha přípustné, potom obě mají optimální řešení a stejnou optimální hodnotu.
Věta (Rohn 14). Vektory x→,y→ jsou optimální řešení primární a duální úlohy právě tehdy, pokud platí:
Věta (Rohn 15). Jestliže použitím simplexové metody dostaneme optimální řešení x→B primární úlohy a platí x→BB>0, potom duální úloha má jediné optimální řešení y→*≔(𝐀BT)−1c→B.

Úlohy s nerovnostmi

Definice. Primární úloha s nerovnostmi je následující optimalizační úloha: min⁡{c→Tx→|x→∈ℝn,𝐀x→≥b→,x→≥0→}
Definice. Duální úloha s nerovnostmi je následující optimalizační úloha: max⁡{b→Ty→|y→∈ℝm,𝐀Ty→≤c→,y→≥0→}
Věta (Rohn 16, o slabé dualitě pro nerovnosti). Nechť x→,y→ jsou přípustná řešení primární a duální úlohy s nerovnostmi. Potom c→Tx→≥b→Ty→. Navíc pokud c→Tx→=b→Ty→, potom jde o optimální řešení.
Věta (Rohn 17, o dualitě pro nerovnosti). Primární úloha s nerovnostmi má optimální řešení právě tehdy, pokud ho má duální úloha. V tom případě jsou optimální hodnoty stejné.
Věta (Rohn 18, podmínky optimality pro nerovnosti). Přípustná řešení úloh s nerovnostmi jsou optimální, právě pokud platí

Farkasova věta

Čteno „farkašova“, je to Maďar.

Věta (Rohn 19, Farkasova). Nechť 𝐀∈ℝm×n,b→∈ℝm. Soustava 𝐀x→=b→ x→≥0→ má řešení právě tehdy, pokud (∀y→∈ℝm)(𝐀Ty→≥0⟹b→Ty→≥0→).
Věta (Rohn 20). Je-li primární úloha lineárního programování přípustná, potom má optimální řešení právě tehdy, pokud (∀x→∈ℝn,x→≥0→)(𝐀x→=0→⟹c→Tx→≥0).

Von Neumann a teorie her

Definice. Mějme výplatní matici 𝐀∈ℝm×n. Potom maticovou hrou nazveme takovouto hru: První hráč zvolí i∈m^, druhý nezávisle na něm zvolí j∈n^. Následně první hráč získá Aij bodů a druhý získá −Aij bodů.
Definice. Smíšená strategie je dvojice vektorů (x→∈ℝm,y→∈ℝn),∑i=1mxi=∑j=1nyi=1 reprezentující pravděpodobnost, s jakou každý hráč zvolí jednotlivé řádky/sloupce.
Poznámka. Očekávaná hodnota zisku pro prvního hráče při použití smíšené strategie (x→,y→) je x→T𝐀y→, pro druhého hráče −x→T𝐀y→.
Definice. Optimální smíšená strategie je smíšená strategie (x→*,y→*) taková, že pro každou smíšenou strategií (x→,y→) je x→T𝐀y→*≤x→*T𝐀y→*≤x→*T𝐀y→ Tedy pokud si kterýkoli hráč zvolí libovolnou jinou strategii, bude na tom stejně nebo hůř.
Věta. Všechny optimální smíšené strategie jsou stejně dobré, tedy existuje nějaká cena hry ω, která se rovná hodnotám všech optimálních smíšených strategií.
Definice. e→≔(1⋮1) 𝐄≔(1⋯1⋮⋱⋮1⋯1)
Věta (Rohn 22). Nechť α∈ℝ,α>maxi,j⁡(−Aij). Nechť 𝐀≔𝐀+α𝐄. Potom dvojice úloh s nerovnostmi min⁡{e→Tx→|𝐀Tx→≥e→∧x→≥0}(primaˊrnıˊ) max⁡{e→Ty→|𝐀y→≤e→∧y→≥0}(duaˊlnıˊ) má optimální řešení (x→0,y→0). Nechť dále x*≔x→0e→Tx→0,y*≔y→0e→Ty→0. Potom (x*,y*) je optimální smíšená strategie, podle které můžeme spočítat cenu hry ω, a daná smíšená strategie (x→,y→) je optimální právě tehdy, pokud 𝐀Tx→≥ωe→∧𝐀y→≤ωe→.
Věta (Rohn 23, von Neumannova). Každá konečná maticová hra má optimální smíšenou strategii.

Dopravní problém

Definice. Mějme m,n∈ℕ+,a→∈ℝm,b→∈ℝn,𝐂∈ℝm×n. Dopravní problém je následující optimalizační úloha: min⁡{∑i=1m∑j=1nCijXij|𝐗∈ℝm×n,(∀i∈m^)(∑j=1nXij=ai),(∀j∈n^)(∑i=1mXij=bi),(∀i∈m^,j∈n^)(Xij≥0)}
Věta (Rohn 24). Dopravní problém je přípustný právě tehdy, pokud ∑i=1mai=∑j=1nbj. V takovém případě má optimální řešení a nějaké 𝐗 je optimální řešení právě tehdy, pokud existují p→∈ℝm,q→∈ℝn taková, že

Analýza citlivosti

Tahle sekce pochází z prezentace Mgr. Jany Sekničkové, Ph.D., takže je psána takovým fyzikálnějším stylem: místo vět a důkazů je postupné odvozování. Taky používá úplně jiné značení než Rohn; pokusím se to trochu zkonzistentnit, ale přesto hodně štěstí.

Mějme nějakou simplexovou tabulku s optimálním řešením. Zajímá nás, jak moc se můžou změnit parametry úlohy, aby se nezměnilo optimální B.

Aby řešení stále bylo přípustné, musí být x→BB=𝐀B−1b→≥0. Zkusíme najít, jak moc se může změnit bp pro nějaké p∈m^.

b→*≔b→+Δb→≔b→+(0⋮0Δbp0⋮0)

Chceme, aby bylo:

0≤𝐀B−1b→*=𝐀B−1b→+𝐀B−1Δb→ 𝐀B−1Δb→≥−𝐀B−1b→

Pro maximální zmatení budeme značit 𝐁≔𝐀B−1:

B→∘pΔbp≥−b‾→

Rozepíšeme to po složkách, tedy pro všechna i∈m^:

BipΔbp≥−b‾i

Z toho dostaneme podmínku:

max⁡{−b‾iBip|i∈m^,Bip>0}≤Δbp≤min⁡{−b‾iBip|i∈m^,Bip<0}

Pokud bychom nedělali ty šaškárny s Δ, ale rovnou rozepsali po složkách vztah 𝐀B−1b→*≥0→, vyšly by nám nerovnosti udávající omezení přímo pro b→*.

Pokud tedy takovéto nerovnosti splníme, B zůstane stejné, ovšem stále se může změnit x→BB a hodnota účelové funkce.

Tím jsme zjistili, jak optimální řešení reaguje na změny b→. Co takhle změny c→? Řešení musí stále splňovat podmínku optimality c→BT𝐀B−1𝐀−cT≥0. Zároveň z nějakého důvodu musí být c→BT𝐀B−1≥0. Jelikož ve vzorcích máme c→B, musíme rozlišovat změnu bazické a nebazické části. Nejdříve změníme nebazickou.

Nechť ck*≔ck+Δck, kde k∈N. Potom se změní jedna složka c→, zatímco c→B se nezmění. Z vektoru c‾→ se také změní k-tá složka:

c‾k*=c→BT𝐀B−1A→∘k−c→k*=c‾k−Δck

Chceme, aby to pořád bylo nezáporné, tedy řešení zůstává optimální, pokud Δck≤c‾k. Žádné dolní omezení není, nebazická proměnná se může libovolně snížit.

Dobře, to bylo jednoduché. Co takhle změna bazické proměnné? Teď už se změní všechny koeficienty c‾→:

c‾j=c→B*T𝐀B−1A→∘j−cj

Teď prostě zase budeme řešit, kdy je to nezáporné. Nemá cenu to rozepisovat. Ještě navíc musí být c→B*T𝐀B−1 nezáporné. Jelikož máme rádi písmenka, označíme si q číslo řádku, v němž je xk bazická proměnná (tedy k=Bq), a máme

max⁡{−c‾jA‾qj|j∈n^,A‾qj>0}≤Δck≤min⁡{−c‾jA‾qj|j∈n^,A‾qj<0}