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: xydef(in^)(xiyi)

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,wn,uv,w0. Potom uTwvTw.

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,bm,cn. Primární úloha lineárního programování je následující optimalizační úloha: min{cTx|xn,𝐀x=b,x0} Funkce xcTx, 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 xn splňující 𝐀x=bx0.
Definice. Optimální řešení primární úlohy lineárního programování je přípustné řešení, pro které je cTx 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 {Aj|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ť Bn^m obsahuje vzájemně různá čísla. Potom značíme 𝐀B(AB1ABm) xB(xB1xBm)
Definice. Pro Nn^B analogicky definujeme 𝐀N,xN.

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ť mn 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𝐀B1b0. Potom definujeme xB předpisem xBBy xNB0

Dobře, můžeme tedy vzít nějaké B a dostaneme bazické řešení xB, 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í cTcBT𝐀B1𝐀 Potom xB 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í xB.

Definice. Mějme B takové, že 𝐀B je regulární. Potom definujeme 𝐀𝐀B1𝐀 bxBB=𝐀B1b ccTcBT𝐀B1𝐀 hcBTxBB=cBT𝐀B1b
Věta. 𝐀B=𝐈
Věta. cB=0T

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 sn^ takové, že cs<0 a zAs0. Potom účelová funkce není zdola omezená (a úloha tedy nemá optimální řešení), to znamená inf{cTx|xn,𝐀x=b,x0}=

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 (𝐀bch)

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 (𝐀bcT0) 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é jm^ se z Bj-tého sloupce stane ej. 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 As=er,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 brcsArs. Víme, že br0,cs<0, takže aby přičtený výraz byl nezáporný, potřebujeme Ars>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 brArs 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í br=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 c0, potom nějaké x*n je optimální řešení právě tehdy, pokud
Věta (Rohn 9). Je-li v simplexové tabulce cN>0, potom má úloha právě jedno optimální řešení (a to xB).

Teorie duality

Definice. Duální úloha lineárního programování je následující optimalizační úloha: max{bTy|ym,𝐀Tyc}
Věta (Rohn 10, o slabé dualitě). Nechť x,y jsou přípustná řešení primární a duální úlohy. Potom cTxbTy. Navíc pokud cTx=bTy, potom jde o optimální řešení.
Věta (Rohn 11). Je-li xB optimální řešení primární úlohy nalezené simplexovým algoritmem, potom y*(𝐀BT)1cB je optimální řešení duální úlohy a platí cTxB=bTy*.
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í xB primární úlohy a platí xBB>0, potom duální úloha má jediné optimální řešení y*(𝐀BT)1cB.

Úlohy s nerovnostmi

Definice. Primární úloha s nerovnostmi je následující optimalizační úloha: min{cTx|xn,𝐀xb,x0}
Definice. Duální úloha s nerovnostmi je následující optimalizační úloha: max{bTy|ym,𝐀Tyc,y0}
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 cTxbTy. Navíc pokud cTx=bTy, 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,bm. Soustava 𝐀x=b x0 má řešení právě tehdy, pokud (ym)(𝐀Ty0bTy0).
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 (xn,x0)(𝐀x=0cTx0).

Von Neumann a teorie her

Definice. Mějme výplatní matici 𝐀m×n. Potom maticovou hrou nazveme takovouto hru: První hráč zvolí im^, druhý nezávisle na něm zvolí jn^. Následně první hráč získá Aij bodů a druhý získá Aij bodů.
Definice. Smíšená strategie je dvojice vektorů (xm,yn),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 xT𝐀y, pro druhého hráče xT𝐀y.
Definice. Optimální smíšená strategie je smíšená strategie (x*,y*) taková, že pro každou smíšenou strategií (x,y) je xT𝐀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(11) 𝐄(1111)
Věta (Rohn 22). Nechť α,α>maxi,j(Aij). Nechť 𝐀𝐀+α𝐄. Potom dvojice úloh s nerovnostmi min{eTx|𝐀Txex0}(primaˊrnıˊ) max{eTy|𝐀yey0}(duaˊlnıˊ) má optimální řešení (x0,y0). Nechť dále x*x0eTx0,y*y0eTy0. 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+,am,bn,𝐂m×n. Dopravní problém je následující optimalizační úloha: min{i=1mj=1nCijXij|𝐗m×n,(im^)(j=1nXij=ai),(jn^)(i=1mXij=bi),(im^,jn^)(Xij0)}
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í pm,qn 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 xBB=𝐀B1b0. Zkusíme najít, jak moc se může změnit bp pro nějaké pm^.

b*b+Δbb+(00Δbp00)

Chceme, aby bylo:

0𝐀B1b*=𝐀B1b+𝐀B1Δb 𝐀B1Δb𝐀B1b

Pro maximální zmatení budeme značit 𝐁𝐀B1:

BpΔbpb

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

BipΔbpbi

Z toho dostaneme podmínku:

max{biBip|im^,Bip>0}Δbpmin{biBip|im^,Bip<0}

Pokud bychom nedělali ty šaškárny s Δ, ale rovnou rozepsali po složkách vztah 𝐀B1b*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 xBB 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 cBT𝐀B1𝐀cT0. Zároveň z nějakého důvodu musí být cBT𝐀B10. Jelikož ve vzorcích máme cB, musíme rozlišovat změnu bazické a nebazické části. Nejdříve změníme nebazickou.

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

ck*=cBT𝐀B1Akck*=ckΔck

Chceme, aby to pořád bylo nezáporné, tedy řešení zůstává optimální, pokud Δckck. Žá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:

cj=cB*T𝐀B1Ajcj

Teď prostě zase budeme řešit, kdy je to nezáporné. Nemá cenu to rozepisovat. Ještě navíc musí být cB*T𝐀B1 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{cjAqj|jn^,Aqj>0}Δckmin{cjAqj|jn^,Aqj<0}