--- tags: om --- # Optimizacijske metode, 1. del 1. del \| [2. del](https://hackmd.io/@jaanos/By-Edfw75) --- ## Optimizacijski problemi **_Primer._** Od doma do fakultete iščemo pot, ki je * najkrajša * najhitrejša * najcenejša * najbolj udobna * ... **_Definicija._** _Optimizacijski problem_ je trojica $(\Omega, f, \operatorname{opt})$, kjer je * $\Omega$ ... množica dopustnih (angl. _feasible_) rešitev * $f : \Omega \to \mathbb{R}$ ... ciljna (kriterijska) funkcija * $\operatorname{opt} \in \{\min, \max, \inf, \sup\}$ ... tip ekstrema Če velja $\Omega = \emptyset$, je problem _nedopusten_, sicer pa je _dopusten_. --- ### Primeri 1. * $\Omega = [0, 3]$ * $f(x) = x^2 - 3x + 2$ * $\operatorname{opt} = \max$ Metoda reševanja: kandidati za maksimum so ničle odvoda in krajišča dopustnega intervala. Pišemo: $$ \begin{aligned} \max &\quad x^2 - 3x + 2 \\[1ex] \text{p.p.} &\quad 0 \le x \le 3 \end{aligned} $$ * p.p. ... pri pogojih * angl. _s.t._ (_subject to_, tudi _so that_, _such that_) ---- 2. * $\Omega = [0, 2] \times [0, 3]$ * $f(x, y) = x^2 - y^2$ * $\operatorname{opt} = \min$ Metoda reševanja: kandidati za minimum so ničle parcialnih odvodov in rob dopustnega območja. --- **_Definicija._** _Optimalna rešitev_ $(\Omega, f, \max)$ je $x^\ast \in \Omega$, da velja $\forall x \in \Omega: f(x) \le f(x^\ast)$. Vrednosti $f(x^\ast)$ pravimo _optimalna vrednost_. * Podobno, če $\operatorname{opt} = \min$. **Pozor!** ~~"bolj optimalna rešitev"~~ --- 3. Na kmetiji velikosti 50 ha želimo gojiti pšenico, koruzo in krompir. Na voljo imamo 5000 človek-ur dela in 24000 € kapitala ter sledeče podatke | | delo (človek-ur/ha) | stroški (€/ha) | dobiček (€/ha) | | ------- | ------------------- | -------------- | -------------- | | pšenica | 60 | 240 | 400 | | koruza | 80 | 400 | 600 | | krompir | 100 | 320 | 480 | Koliko ha posameznega pridelka naj posadimo, da bo dobiček čim večji? $$ \begin{aligned} \max &\ & 400 x_1 + 600 x_2 + 480 x_3 \\[1ex] \text{p.p.} && x_1 + x_2 + x_3 &\le 50 \\ && 60 x_1 + 80 x_2 + 100 x_3 &\le 5000 \\ && 240 x_1 + 400 x_2 + 320 x_3 &\le 24000 \\ && x_1, x_2, x_3 &\ge 0 \end{aligned} $$ Taki nalogi rečemo _linearni program_ (LP). --- 4. Imamo $2n$ jabolk z masami $w_1, w_2, \dots, w_{2n}$. Jabolka bi radi razdelili v dve košari tako, da je v vsaki košari $n$ jabolk in da sta masi obeh košar čim bliže. * $\Omega = \{A \subseteq \{1, 2, \dots, 2n\} \mid |A| = n\}$ * $f(A) = |\sum_{i \in A} w_i - \sum_{i \in A^c} w_i|$ * $\operatorname{opt} = \min$ Drugače zapisano: $$ \begin{aligned} \Omega &= \{-1, 1\}^{2n} \\ x_i &= \begin{cases} 1 & \text{$i$-to jabolko v levi košari} \\ -1 & \text{$i$-to jabolko v desni košari} \\ \end{cases} \end{aligned} $$ $$ \begin{aligned} && \min \ \left|\sum_{i=1}^{2n} w_i x_i \right| \\ \text{p.p.} && \sum_{i=1}^{2n} x_i &= 0 \\ && x_1, x_2, \dots, x_{2n} &\in \{-1, 1\} \end{aligned} $$ ---- 5. Ana, Barbara, Cvetka in Darja želijo prečkati most. Naenkrat lahko most prečkata le dve od njiju, imajo pa eno samo svetilko. Za prečkanje mostu A, B, C, D potrebujejo 1, 2, 5 oziroma 10 minut - pri skupnem prečkanju seveda potrebujejo toliko časa kot počasnejša od njiju. Kako naj prečkajo most, da bodo čim hitrejše? * Definiramo graf z množico vozlišč $V = \mathcal{P}\{A, B, C, D, s\}$ - vsako vozlišče predstavlja stanje na eni strani mostu. * Vozlišči $u$ in $v$ sta sosedni, če lahko z enim prečkanjem pridemo od stanja $u$ do stanja $v$ (tj., $s \in u \oplus v$, $2 \le |u \oplus v| \le 3$ in $u \subset v$ ali $v \subset u$). * Uteži povezav so porabljeni časi. * Iščemo najkrajšo pot med $\emptyset$ in $\{A, B, C, D, s\}$. * Rešujemo z Dijkstrovim algoritmom - spoznali ga bomo pri predmetu Operacijske raziskave. ---- 6. Sestaviti želimo čim hitrejšo štafeto. | | prsno | hrbtno | delfin | prosto | | - | ----- | ------ | ------ | ------ | | 1 | 65 | 73 | 63 | 57 | | 2 | 67 | 76 | 65 | 58 | | 3 | 68 | 72 | 69 | 55 | | 4 | 67 | 75 | 70 | 59 | | 5 | 71 | 69 | 75 | 57 | | 6 | 69 | 71 | 66 | 59 | Primer rešitve (ne nujno optimalne!): * prsno 3 (68) * hrbtno 5 (69) * delfin 1 (63) * prosto 6 (59) ```graphviz graph G { rankdir=LR edge [color=gray] prsno -- 1 prsno -- 2 prsno -- 3 [penwidth=2,color=red,label=68] prsno -- 4 prsno -- 5 prsno -- 6 hrbtno -- 1 hrbtno -- 2 hrbtno -- 3 hrbtno -- 4 hrbtno -- 5 [penwidth=2,color=red,label=69] hrbtno -- 6 delfin -- 1 [penwidth=2,color=red,label=63] delfin -- 2 delfin -- 3 delfin -- 4 delfin -- 5 delfin -- 6 prosto -- 1 prosto -- 2 prosto -- 3 prosto -- 4 prosto -- 5 prosto -- 6 [penwidth=2,color=red,label=59] } ``` ---- 7. Potujoči trgovec iz Ljubljane želi obiskati London, Pariz, Madrid, Berlin. | | Lj | Lo | P | M | B | | -- | -- | -- | -- | -- | -- | | Lj | / | 5 | 10 | 5 | 10 | | Lo | 5 | / | 10 | 1 | 5 | | P | 10 | 10 | / | 5 | 5 | | M | 5 | 1 | 5 | / | 1 | | B | 10 | 5 | 5 | 1 | / | * Primer poti: Lj - B - P - Lo - M - Lj, cena 10+5+10+1+5 = 31 Iščemo najcenejšo pot, torej najcenejši Hamiltonov cikel. To je **problem potujočega trgovca** - učinkovit algoritem ni znan! --- ```mermaid graph TD op["Optimizacijski problemi"] op --- Nedopustni op --- Dopustni Dopustni --- Neomejeni Dopustni --- Omejeni Omejeni --- Optimalni Omejeni --- Neoptimalni ``` * Nedopustni problemi: $\Omega = \emptyset$ $$ \begin{aligned} \max \ 2x - y^2 \\ \text{p.p.} \quad x - y &\le 1 \\ -x + y &\le -2 \end{aligned} $$ * Dopustni problemi: $\Omega \ne \emptyset$ - Neomejeni problemi $$ \begin{aligned} \max \ 2x - y^2 \\ \text{p.p.} \quad x &\ge 0 \\ y &\le 5 \end{aligned} $$ - Omejeni problemi + Optimalni problemi $$ \begin{aligned} \max \ x^2 + y^2 \\ \text{p.p.} \quad 0 \le x &\le 2 \\ 0 \le y &\le 1 \end{aligned} $$ + Neoptimalni problemi $$ \begin{aligned} \max \ x^2 + y^2 \\ \text{p.p.} \quad 0 \le x &< 2 \\ 0 \le y &< 1 \end{aligned} $$ --- ## Linearno programiranje **_Definicija._** _Linearni program_ (LP) je optimizacijski problem, kjer so ciljna funkcija in vsi pogoji linearni. **_Primer._** $$ \begin{aligned} \min \ 2x_1 - 3x_2 + 2x_3 \\[1ex] \text{p.p.} \quad x_1 + 2x_2 - x_3 &\le 4 \\ x_1 + 5x_2 + 2x_3 &\ge 2 \\ 2x_1 - 3x_2 - 4x_3 &= 1 \\ x_1 &\ge 0 \\ x_3 &\le 0 \end{aligned} $$ **_Definicija._** Linearni program je v _standardni obliki_, če * iščemo $\max$ * so vsi pogoji $\le$ * so vse spremenljivke $\ge 0$ **_Trditev._** Vsak linearni program lahko ekvivalentno zapišemo v standardni obliki. _Dokaz._ * $\min f(x) \to \max -f(x)$ * $g_j(x) \ge b \to -g_j(x) \le -b$ * $g_j(x) = b \to g_j(x) \le b$; $-g_j(x) \le -b$ * $x_i \le 0 \to x_i = -x'_i$; $x'_i \ge 0$ * $x_i$ neomejena $\to x_i = x^+_i - x^-_i$; $x^+_i, x^-_i \ge 0$ **_Primer._** Zapišimo prejšnji primer v standardni obliki. $$ \begin{aligned} \max \ -2x_1 + 3x^+_2 - 3x^-_2 + 2x'_3 \\[1ex] \text{p.p.} \quad x_1 + 2x^+_2 - 2x^-_2 + x'_3 &\le 4 \\ -x_1 - 5x^+_2 + 5x^-_2 + 2x'_3 &\le -2 \\ 2x_1 - 3x^+_2 + 3x^-_2 + 4x'_3 &\le 1 \\ -2x_1 + 3x^+_2 - 3x^-_2 - 4x'_3 &\le -1 \\ x_1, x^+_2, x^-_2, x'_3 &\ge 0 \end{aligned} $$ ---- V splošnem lahko zapišemo linearni program v standardni obliki kot $$ \begin{aligned} \max \ c_1 x_1 + c_2 x_2 + \dots + c_n x_n \\[1ex] \text{p.p.} \quad a_{11} x_1 + a_{12} x_2 + \dots + a_{1n} x_n &\le b_1 \\ a_{21} x_1 + a_{22} x_2 + \dots + a_{2n} x_n &\le b_2 \\ &\ \ \vdots \\ a_{m1} x_1 + a_{m2} x_2 + \dots + a_{mn} x_n &\le b_m \\ x_1, x_2, \dots, x_n &\ge 0 \end{aligned} $$ **Matrična oblika:** $$ x = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}, \quad c = \begin{bmatrix} c_1 \\ c_2 \\ \vdots \\ c_n \end{bmatrix} \in \mathbb{R}^n, \quad b = \begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_m \end{bmatrix} \in \mathbb{R}^m, \quad A = [a_{ij}]_{i,j=1}^{m,n} \in \mathbb{R}^{m \times n} $$ $$ \begin{aligned} \max \ c^\top x \\[1ex] \text{p.p.} \quad A x &\le b \\ x &\ge 0 \end{aligned} $$ **_Definicija._** Množica $A \subseteq \mathbb{R}^n$ je _konveksna_, če za vsaka $x, y \in A$ in vsak $\lambda \in [0, 1]$ velja $(1 - \lambda) x + \lambda y \in A$. * $\sum_{i=1}^k \alpha_i x_i$ z $\sum_{i=1}^k \alpha_i = 1$ je _afina kombinacija_ točk $x_i$ ($1 \le i \le k$). - Afin prostor: "premaknjen" linearen prostor = afina kombinacija točk neke množice * $\sum_{i=1}^k \alpha_i x_i$ z $\sum_{i=1}^k \alpha_i = 1$ in $\alpha_i \ge 0$ ($1 \le i \le k$) je _konveksna kombinacija_ točk $x_i$ ($1 \le i \le k$). Torej: množica $A$ je konveksna, če je vsaka daljica s krajišči v množici $A$ v celoti vsebovana v $A$. **_Primer._** * Konveksne množice v $\mathbb{R}$: intervali * Krogla v $\mathbb{R}^n$ je konveksna, sfera pa ne * Polprostor v $\mathbb{R}^n$ je konveksen: $$ \begin{aligned} a_1 x_1 + a_2 x_2 + \dots + a_n x_n &\le b &&/ \cdot (1 - \lambda) \\ a_1 y_1 + a_2 y_2 + \dots + a_n y_n &\le b &&/ \cdot \lambda \\ a_1 ((1-\lambda) x_1 + \lambda y_1) + \dots + a_n ((1-\lambda) x_n + \lambda y_n) &\le (1-\lambda) b + \lambda b = b \end{aligned} $$ $\Rightarrow$ $(1-\lambda) x + \lambda y$ je tudi v polprostoru. **_Trditev._** Presek konveksnih množic je konveksen: $A_i$ ($i \in I$) konveksne $\Rightarrow \bigcap_{i \in I} A_i$ konveksna. _Dokaz._ Preveriti moramo: za vsaka $x, y \in \bigcap_{i \in I} A_i$ in vsak $\lambda \in [0, 1]$ velja $\forall i \in I: (1-\lambda) x + \lambda y \in A_i$. To je res, ker so množice $A_i$ ($i \in I$) konveksne. Unija konveksnih množic **ni nujno konveksna**! **_Trditev._** Naj bo $\Pi = (\Omega, f, \max)$ linearni program. Potem velja: 1. $\Omega$ je konveksna množica. 2. Množica optimalnih rešitev $\Pi$ je konveksna množica. _Dokaz._ 1. $\Omega$ je presek polprostorov (in hiperravnin), torej je konveksna množica. 2. Če optimalnih rešitev ni, potem je množica optimalnih rešitev prazna, torej konveksna. Sicer naj bo $c$ optimalna vrednost. Potem je množica optimalnih rešitev enaka $$ \{x \in \Omega \mid f(x) = c\} $$ in je zato konveksna množica. --- ### Grafično reševanje LP z dvema spremenljivkama **_Primer._** $$ \begin{aligned} \max \ x + y \\[1ex] \text{p.p.} \quad x + 2y &\le 6 \\ 5x + 4y &\le 20 \\ x, y &\ge 0 \end{aligned} $$ ![](https://i.imgur.com/4BSJuiC.png) $$ \begin{aligned} x + 2y &= 6 &&/ \cdot (-2) \\ 5x + 4y &= 20 \\ 3x &= 8 \\ x &= {8 \over 3} \\ 2y &= 6 - {8 \over 3} = {10 \over 3} \\ y &= {5 \over 3} \end{aligned} $$ $(x^\ast, y^\ast) = ({8 \over 3}, {5 \over 3})$ je optimalna rešitev, $z^\ast = {13 \over 3}$ je optimalna vrednost. --- Množica dopustnih rešitev $\Omega$ je **politop** (lahko neomejen). Množica optimalnih rešitev je **lice** tega politopa (oglišče, stranica, stranska ploskev, itd.). Optimalna vrednost (če obstaja) je vedno dosežena (tudi) v oglišču. --- ### Simpleksna metoda Denimo, da imamo linearni program v standardni obliki $$ \begin{aligned} \max \ c^\top x \\[1ex] \text{p.p.} \quad A x &\le b \\ x &\ge 0 \end{aligned} $$ kjer velja * $A \in \mathbb{R}^{m \times n}$, $b \in \mathbb{R}^m$, $c \in \mathbb{R}^n$ * $b \ge 0$ (če velja $b \not\ge 0$, uporabimo dvofazno simpleksno metodo, ki jo bomo spoznali kasneje) **_Primer._** Kmetija: $$ \begin{aligned} \max &\ & 400 x_1 + 600 x_2 + 480 x_3 \\[1ex] \text{p.p.} && x_1 + x_2 + x_3 &\le 50 \\ && 60 x_1 + 80 x_2 + 100 x_3 &\le 5000 \\ && 240 x_1 + 400 x_2 + 320 x_3 &\le 24000 \\ && x_1, x_2, x_3 &\ge 0 \end{aligned} $$ Ciljno funkcijo in omejitve lahko skaliramo brez vpliva na pomen spremenljivk: $$ \begin{aligned} \max &\ & 10 x_1 + 15 x_2 + 12 x_3 \\[1ex] \text{p.p.} && x_1 + x_2 + x_3 &\le 50 \\ && 3 x_1 + 4 x_2 + 5 x_3 &\le 250 \\ && 3 x_1 + 5 x_2 + 4 x_3 &\le 300 \\ && x_1, x_2, x_3 &\ge 0 \end{aligned} $$ Neenakosti spremenimo v enakosti z uvedbo novih **nenegativnih** spremenljivk. Prvi slovar: $$ \begin{aligned} x_4 &= 50 - x_1 - x_2 - x_3 \\ x_5 &= 250 - 3 x_1 - 4 x_2 - 5 x_3 \\ x_6 &= 300 - 3 x_1 - 5 x_2 - 4 x_3 \\ \hline z &= 10 x_1 + 15 x_2 + 12 x_3 \end{aligned} $$ V zgornjem sistemu enačb nastopajo sledeče spremenljivke: * _prvotne spremenljivke_: $x_1, x_2, \dots, x_n$ * _dopolnilne spremenljivke_: $x_{n+1}, x_{n+2}, \dots, x_{n+m}$ * _funkcional_ $z$ _Slovar_ je izražava $m$ izmed spremenljivk $x_1, x_2, \dots, x_{n+m}$ (_bazne spremenljivke_) in funkcionala $z$ z ostalimi izmed spremenljivk (_nebazne spremenljivke_). V _prvem slovarju_ velja: * nebazne spremenljivke so prvotne spremenljivke, in * bazne spremenljivke so dopolnilne spremenljivke. Slovar je _dopusten_, če so konstantni koeficienti baznih spremenljivk nenegativni. Prvi slovar je dopusten zaradi predpostavke $b \ge 0$. Dopusten slovar nam da bazno dopustno rešitev, ki jo dobimo tako, da nebaznim spremenljivkam dodelimo vrednost $0$. $$ \begin{aligned} x_4 &= 50 - x_1 - x_2 - x_3 & \leftarrow x_2 &\le 50 \\ x_5 &= 250 - 3 x_1 - 4 x_2 - 5 x_3 & x_2 &\le {250 \over 4} = {125 \over 2} \\ x_6 &= 300 - 3 x_1 - 5 x_2 - 4 x_3 & x_2 &\le {300 \over 5} = 60 \\ \hline z &= 10 x_1 + 15 \underline{x_2} + 12 x_3 \end{aligned} $$ Izberemo **nebazno** spremenljivko s **pozitivnim** koeficientom pri funkcionalu $z$. Če je kandidatov več, izberemo **poljubnega**. Pogosto uporabljamo: * pravilo največjega koeficienta * pravilo najmanjšega indeksa * pravilo največjega povečanja Izbrani spremenljivki pravimo _vstopna_ spremenljivka. V našem primeru smo izbrali $x_2$ (sta pa tudi $x_1$ in $x_3$ kandidata). Vrstici, ki izbrano vstopno spremenljivko **najbolj omejuje**, pravimo _pivotna_ vrstica, pripadajoči bazni spremenljivki pa _izstopna_ spremenljivka. Če imamo več pivotnih vrstic (tj., več baznih spremenljivk najbolj omejuje vstopno spremenljivko), potem za izstopno spremenljivko izberemo **poljubno** izmed njih. Vstopna spremenljivka vstopi v bazo, izstopna iz nje izstopi. Rešimo enačbo za vstopno spremenljivko in vstavimo v enačbe za ostale bazne spremenljivke in funkcional $z$: $$ \begin{aligned} x_2 &= 50 - x_1 - x_3 - x_4 \\ x_5 &= 250 - 3 x_1 - 4 (50 - x_1 - x_3 - x_4) - 5 x_3 \\ &= 50 + x_1 - x_3 + 4 x_4 \\ x_6 &= 300 - 3 x_1 - 5 (50 - x_1 - x_3 - x_4) - 4 x_3 \\ &= 50 + 2 x_1 + x_3 + 5 x_4 \\ \hline z &= 10 x_1 + 15 (50 - x_1 - x_3 - x_4) + 12 x_3 = \\ &= 750 - 5 x_1 - 3 x_3 - 15 x_4 \end{aligned} $$ Če so vsi koeficienti pri funkcionalu $z$ **nepozitivni**, smo našli **optimalno rešitev** in se simpleksna metoda ustavi. V nasprotnem primeru ponavljamo postopek. Vsi slovarji, ki smo jih dobili tekom reševanja, so **dopustni**. Če smo dobili kak nedopusten slovar, smo se zmotili (npr. izbrali napačno izstopno spremenljivko ali naredili računsko napako). Kaj se lahko še zgodi? * Konstantni koeficient bazne spremenljivke je enak $0$: $$ \begin{aligned} &\vdots \\ x_j &= 0 + \ldots - 3 x_i + \ldots & \leftarrow x_i \le 0 \\ &\vdots \\ \hline z &= 10 + \ldots + 4 \underline{x_i} + \ldots \end{aligned} $$ Vrednost v bazni dopustni rešitvi se **ne** poveča - _izrojen_ korak. * Nobena vrstica na omejuje vstopne spremenljivke: $$ \begin{aligned} &\vdots \\ x_j &= \ldots + 3 x_i + \ldots & x_i \le \infty \\ &\vdots \\ \hline z &= \ldots + 4 \underline{x_i} + \ldots \end{aligned} $$ Tedaj je linearni program **neomejen** - končamo simpleksno metodo. **Neomejeno družino** dopustnih rešitev dobimo tako, da vstopno spremenljivko pustimo kot nenegativen parameter brez zgornje meje, ostalim nebaznim spremenljivkam pa dodelimo vrednost $0$. Kako iz zadnjega slovarja za optimalni problem dobimo **vse** optimalne rešitve? * Nebaznim spremenljivkam z negativnim koeficientom dodelimo vrednost $0$. * Nebazne spremenljivke z **ničelnim koeficientom** pustimo kot parametre (tj., jim ne dodelimo nujno vrednosti $0$). * Upoštevamo, da so vse bazne spremenljivke nenegativne. **_Primer._** Denimo, da imamo sledeči zadnji slovar. $$ \begin{aligned} x_2 &= 40 - {2 \over 3} x_1 - {4 \over 5} x_3 - {1 \over 15} x_6 \\ x_4 &= 10 - {1 \over 3} x_1 - {1 \over 5} x_3 + {1 \over 15} x_6 \\ x_5 &= 90 - {1 \over 3} x_1 - {9 \over 5} x_3 + {4 \over 15} x_6 \\ \hline z &= 200 - {1 \over 3} x_1 - {1 \over 3} x_6 \end{aligned} $$ Potem velja: * $x_1^\ast = x_6^\ast = 0$ * $x_2^\ast = 40 - {4 \over 5} x_3^\ast \ge 0$, torej $x_3^\ast \le 50$ * $x_4^\ast = 10 - {1 \over 5} x_3^\ast \ge 0$, torej $x_3^\ast \le 50$ * $x_5^\ast = 90 - {9 \over 5} x_3^\ast \ge 0$, torej $x_3^\ast \le 50$ Optimalne rešitve so torej oblike $x_1^\ast = 0$, $x_2^\ast = 40 - {4 \over 5} x_3^\ast$, $0 \le x_3^\ast \le 50$, $z^\ast = 200$. --- Ali se simpleksna metoda vedno ustavi? **NE.** Možnih slovarjev je ${n+m \choose m}$. Če se simpleksna metoda ne ustavi, pomeni, da je prišlo do "ciklanja". V tem primeru so vsi koraki v ciklu izrojeni. Ciklanje je izjemno redko. Dokazati se da, da do ciklanja ne bo prišlo, če za vstopne in izstopne spremenljivke uporabimo pravilo najmanjšega indeksa (_Blandovo pravilo_). Časovne zahtevnosti algoritmov: * "Hitri" algoritmi: uporabijo polinomsko mnogo operacij. * "Počasni" algoritmi: uporabijo eksponentno mnogo operacij. Ali je simpleksna metoda hitra? * Tipično: $\approx m \log n$ korakov * Najslabši primer: simpleksna metoda **ni** polinomska **_Primer._** (Klee-Minty) Za $n = 3$: $$ \begin{aligned} \max &\ & 100 x_1 + 10 x_2 + x_3 \\[1ex] \text{p.p.} && x_1 &\le 1 \\ && 20 x_1 + x_2 &\le 100 \\ && 200 x_1 + 20 x_2 + x_3 &\le 10000 \\ && x_1, x_2, x_3 &\ge 0 \end{aligned} $$ * Če uporabimo metodo največjega koeficienta, potrebujemo $2^n - 1$ korakov. * Če uporabimo pravilo največjega povečanja, potrebujemo $1$ korak. Obstajajo algoritmi za reševanje linearnih programov, ki so dokazljivo polinomski. --- ### Dvofazna simpleksna metoda Uporabljamo jo za linearne programe v standardni obliki, za katere ne velja $b \ge 0$. 1. faza: ugotovi, ali je linearni program dopusten - če je, nam prva faza da dopusten začetni slovar za drugo fazo. 2. faza: identična simpleksni metodi. --- **_Primer._** Imamo dve vitaminski tableti, Polivit in Oligovit, ki vsebujejo različne količine vitaminov A, B in C. | | A | B | C | cena za tableto | | -------------- | - | -- | - | --------------- | | Polivit | 1 | 4 | 1 | 12 | | Oligovit | 1 | 1 | 2 | 10 | | dnevne potrebe | 7 | 13 | 8 | Kako najceneje zadostiti dnevnim potrebam? $$ \begin{aligned} \min &\ & 12 x_1 + 10 x_2 \\[1ex] \text{p.p.} && x_1 + x_2 &\ge 7 \\ && 4 x_1 + x_2 &\ge 13 \\ && x_1 + 2 x_2 &\ge 8 \\ && x_1, x_2 &\ge 0 \end{aligned} $$ Zapišimo ekvivalentni linearni program v standardni obliki. $$ \begin{aligned} \max &\ & -12 x_1 - 10 x_2 \\[1ex] \text{p.p.} && -x_1 - x_2 &\le -7 \\ && -4 x_1 - x_2 &\le -13 \\ && -x_1 - 2 x_2 &\le -8 \\ && x_1, x_2 &\ge 0 \end{aligned} $$ Ker v zgornjem linearnem programu velja $b \not\ge 0$, zapišimo še pomožni problem prve faze: $$ \begin{aligned} && \min \ x_0 \\[1ex] \text{p.p.} && -x_1 - x_2 &\le -7 + x_0 \\ && -4 x_1 - x_2 &\le -13 + x_0 \\ && -x_1 - 2 x_2 &\le -8 + x_0 \\ && x_0, x_1, x_2 &\ge 0 \end{aligned} $$ Pomožni problem je vedno dopusten ($x_0$ mora biti dovolj velik). Pomožni problem ima optimalno vrednost $0$ **natanko tedaj**, ko je prvotni problem dopusten. Zapišimo začetni slovar za prvo fazo - ta slovar **ni dopusten**: $$ \begin{aligned} x_3 &= -7 + x_0 + x_1 + x_2 \\ x_4 &= -13 + x_0 + 4 x_1 + x_2 \\ x_5 &= -8 + x_0 + x_1 + 2 x_2 \\ \hline w &= -x_0 \end{aligned} $$ V prvem koraku prve faze v bazo vstopi $x_0$, izstopi pa spremenljivka z najmanjšim (najbolj negativnim) konstantnim členom - v našem primeru $x_4$: $$ \begin{aligned} x_0 &= 13 - 4 x_1 - x_2 + x_4 & \leftarrow x_2 &\le 13 \\ x_3 &= 6 - 3 x_1 + x_4 & x_2 &\le \infty \\ x_5 &= 5 - 3 x_1 + x_2 + x_4 & x_2 &\le \infty \\ \hline w &= -13 + 4 x_1 + \underline{x_2} - x_4 \end{aligned} $$ Nadaljujemo enako kot pri osnovni simpleksni metodi. V našem primeru po metodi največjega povečanja izberemo $x_2$ za vstopno spremenljivko in $x_0$ za izstopno spremenljivko. $$ \begin{aligned} x_2 &= 13 - x_0 - 4 x_1 + x_4 \\ x_3 &= 6 - 3 x_1 + x_4 \\ x_5 &= 18 - x_0 - 7 x_1 + 2 x_4 \\ \hline w &= -x_0 \end{aligned} $$ Optimalna vrednost pomožnega problema je $0$ - prvotni problem je torej dopusten. Začetni slovar druge faze dobimo tako, da v zadnjem slovarju prve faze vzamemo $x_0 = 0$ in vstavimo prvotne bazne spremenljivke v funkcional $z$: $$ \begin{aligned} x_2 &= 13 - 4 x_1 + x_4 \\ x_3 &= 6 - 3 x_1 + x_4 \\ x_5 &= 18 - 7 x_1 + 2 x_4 \\ \hline z &= -12 x_1 - 10 (13 - 4 x_1 + x_4) \\ &= -130 + 28 x_1 - 10 x_4 \end{aligned} $$ $x_1$ vstopi, $x_3$ izstopi: $$ \begin{aligned} x_1 &= 2 - {1 \over 3} x_3 + {1 \over 3} x_4 \\ x_2 &= 13 - 4 \left(2 - {1 \over 3} x_3 + {1 \over 3} x_4\right) + x_4 \\ &= 5 + {4 \over 3} x_3 - {1 \over 3} x_4 \\ x_5 &= 18 - 7 \left(2 - {1 \over 3} x_3 + {1 \over 3} x_4\right) + 2 x_4 \\ &= 4 + {7 \over 3} x_3 - {1 \over 3} x_4 \\ \hline z &= -130 + 28 \left(2 - {1 \over 3} x_3 + {1 \over 3} x_4\right) - 10 x_4 \\ &= -74 - {28 \over 3} x_3 - {2 \over 3} x_4 \end{aligned} $$ Imamo zadnji slovar druge faze, preberemo optimalno rešitev: * $x_1^\ast = 2$ tableti Polivit * $x_2^\ast = 5$ tablet Oligovit * cena: $-z^\ast = 74$ ---- Prva faza se vedno konča, ko ne moremo več izbrati vstopne spremenljivke (ker je problem omejen). * $w^\ast < 0$: prvotni problem je nedopusten, končamo. * $w^\ast = 0$, $x_0$ je nebazna spremenljivka v zadnjem slovarju prve faze: nadaljujemo z drugo fazo * $w^\ast = 0$, $x_0$ je bazna spremenljivka v zadnjem slovarju prve faze: temu se izognemo s pravilom, da če $x_0$ lahko izstopi iz baze, jo izberemo za izstopno spremenljivko (ali pa naredimo izrojen korak, da $x_0$ izstopi) ```mermaid graph TD LP[LP Π] -- "b ≱ 0" --- dvofazna[dvofazna simpleksna metoda] LP -- "b ≥ 0" --- enofazna[simpleksna metoda] dvofazna -- "w* < 0" --- nedopusten[Π nedopusten] dvofazna -- "w* = 0" --- dopusten[Π dopusten] --- enofazna enofazna --- neomejen[Π neomejen] enofazna --- optimalen[Π optimalen] ``` **_Osnovni izrek linearnega programiranja._** 1. Če ima linearni program dopustno rešitev, ima bazno dopustno rešitev. 2. Če ima linearni program optimalno rešitev, ima bazno optimalno rešitev. 3. Za linearni program velja natanko ena od možnosti: * linearni program je nedopusten, * linearni program je neomejen, ali * linearni program je optimalen. --- ### Dualnost pri linearnem programiranju Naj bo $\Pi$ linearni program $$ \begin{aligned} \max &\ & 10 x_1 + 15 x_2 + 12 x_3 \\[1ex] \text{p.p.} && x_1 + x_2 + x_3 &\le 50 &/ \cdot y_4 \ge 0 \\ && 3 x_1 + 4 x_2 + 5 x_3 &\le 250 &/ \cdot y_5 \ge 0 \\ && 3 x_1 + 5 x_2 + 4 x_3 &\le 300 &/ \cdot y_6 \ge 0 \\ && x_1, x_2, x_3 &\ge 0 \end{aligned} $$ Iščemo zgornje meje za ciljno funkcijo: $$ (y_4 + 3 y_5 + 3 y_6) x_1 + (y_4 + 4 y_5 + 5 y_6) x_2 + (y_4 + 5 y_5 + 4 y_6) x_3 \le 50 y_4 + 250 y_5 + 300 y_6 $$ Če velja $$ \begin{aligned} y_4 + 3 y_5 + 3 y_6 &\ge 10, \\ y_4 + 4 y_5 + 5 y_6 &\ge 15, \\ y_4 + 5 y_5 + 4 y_6 &\ge 12, \end{aligned} $$ potem $$ 10 x_1 + 15 x_2 + 12 x_3 \le 50 y_4 + 250 y_5 + 300 y_6. $$ Hočemo čim manjšo zgornjo mejo. _Prvotnemu_ linearnemu programu $\Pi$ dodelimo _dualni_ linearni program $\Pi'$: $$ \begin{aligned} \min &\ & 50 y_4 + 250 y_5 + 300 y_6 \\[1ex] \text{p.p.} && y_4 + 3 y_5 + 3 y_6 &\ge 10 \\ && y_4 + 4 y_5 + 5 y_6 &\ge 15 \\ && y_4 + 5 y_5 + 4 y_6 &\ge 12 \\ && y_4, y_5, y_6 &\ge 0 \end{aligned} $$ **_Definicija._** Za prvotni linearni program $\Pi$ je njegov dualni linearni program $\Pi'$, kjer je | prvotni LP $\Pi$ | dualni LP $\Pi'$ | | ---------------- | ---------------- | | $$\begin{aligned} \max \ c^\top x \\[1ex] \text{p.p.} \quad A x &\le b \\ x &\ge 0 \end{aligned}$$ | $$\begin{aligned} \min \ b^\top y \\[1ex] \text{p.p.} \quad A^\top y &\ge c \\ y &\ge 0 \end{aligned}$$ | | $$\begin{aligned} \max \ \sum_{j=1}^n c_j x_j \\[1ex] \text{p.p.} \quad \sum_{j=1}^n a_{ij} x_j &\le b_i & (1 &\le i \le m) \\ x_j &\ge 0 & (1 &\le j \le n) \end{aligned}$$ | $$\begin{aligned} \min \ \sum_{i=1}^m b_i y_{n+i} \\[1ex] \text{p.p.} \quad \sum_{i=1}^m a_{ij} y_{n+i} &\ge c_j & (1 &\le j \le n) \\ y_{n+i} &\ge 0 & (1 &\le i \le m) \end{aligned}$$ | **_Trditev._** $\Pi'' = \Pi$. _Dokaz._ Zapišimo $\Pi'$ v standardni obliki. $$ \begin{aligned} \max \ -b^\top y \\[1ex] \text{p.p.} \quad -A^\top y &\le -c \\ y &\ge 0 \end{aligned} $$ Potem je $\Pi''$ sledeči linearni program: $$ \begin{aligned} \min \ -c^\top x \\[1ex] \text{p.p.} \quad -A x &\ge -b \\ x &\ge 0 \end{aligned} $$ Pretvorba v standardno obliko nam pokaže, da je $\Pi'' = \Pi$. --- **_Šibki izrek o dualnosti (ŠID)._** Naj bo $\Pi$ prvotni linearni program kot zgoraj in $\Pi'$ njegov dual. Če je $x$ dopustna rešitev za $\Pi$ in $y$ dopustna rešitev za $\Pi'$, potem velja $c^\top x \le b^\top y$. _Dokaz._ 1. varianta: $$ \begin{aligned} c^\top x &\le (A^\top y)^\top x & (A^\top y &\ge c, x \ge 0) \\ &= y^\top A x \\ &\le y^\top b & (Ax &\le b, y \ge 0) \\ &= b^\top y \end{aligned} $$ 2. varianta: $$ \begin{aligned} \sum_{j=1}^n c_j x_j &\le \sum_{j=1}^n \left(\sum_{i=1}^m a_{ij} y_{n+i}\right) x_j & \Big(\forall j: \sum_{i=1}^m a_{ij} y_{n+i} &\ge c_j, x_j \ge 0\Big) \\ &= \sum_{i=1}^m \left(\sum_{j=1}^n a_{ij} x_j\right) y_{n+i} \\ &\le \sum_{i=1}^m b_i y_{n+i} & \Big(\forall i: \sum_{j=1}^n a_{ij} x_j &\le b_i, y_{n+i} \ge 0\Big) \\ \end{aligned} $$ **_Posledica 1._** Če sta $x$ in $y$ dopustni rešitvi za $\Pi$ oziroma $\Pi'$, za kateri velja $c^\top x = b^\top y$, potem sta $x$ in $y$ optimalni rešitvi za $\Pi$ oziroma $\Pi'$. _Dokaz._ $b^\top y$ je zgornja meja za $c^\top x$, to zgornjo mejo dosežemo. $c^\top x$ je spodnja meja za $b^\top y$, to spodnjo mejo dosežemo. **Opomba.** S to posledico lahko preverimo optimalnost ponujenih dopustnih rešitev $x$, $y$, za kateri velja $c^\top x = b^\top y$. **_Posledica 2._** Če je $\Pi$ neomejen problem, je $\Pi'$ nedopusten problem. _Dokaz._ Če je $\Pi'$ dopusten, imamo zgornjo mejo za ciljno funkcijo $\Pi$, protislovje. --- **_Krepki izrek o dualnosti (KID)._** Naj bo $\Pi$ prvotni linearni program kot zgoraj in $\Pi'$ njegov dual. Če je $x^\ast$ optimalna rešitev za $\Pi$, potem obstaja optimalna rešitev $y^\ast$ za $\Pi'$ in velja $c^\top x^\ast = b^\top y^\ast$. ---- Zadnji slovar za problem kmetije: $$ \begin{aligned} x_2 &= 50 - x_1 - x_3 - x_4 \\ x_5 &= 50 + x_1 - x_3 + 4 x_4 \\ x_6 &= 50 + 2 x_1 + x_3 + 5 x_4 \\ \hline z &= 750 - 5 x_1 - 0 x_2 - 3 x_3 - 15 x_4 - 0 x_5 - 0 x_6 \end{aligned} $$ Zadnji slovar za dual problema kmetije: $$ \begin{aligned} y_1 &= 5 + y_2 - y_5 - 2 y_6 \\ y_3 &= 3 + y_2 + y_5 - y_6 \\ y_4 &= 15 + y_2 - 4 y_5 - 5 y_6 \\ \hline z &= -750 - 0 y_1 - 50 y_2 - 0 y_3 - 0 y_4 - 50 y_5 - 50 y_6 \end{aligned} $$ Videti je, da so koeficienti dopolnilnih spremenljivk v zadnjem slovarju ravno negacija optimalne rešitve dualnega problema. ---- _Dokaz KID._ Simpleksna metoda za $\Pi$ se konča z zadnjim slovarjem z $$ z = z^\ast + \sum_{j=1}^{n+m} c^\ast_j x_j = \sum_{j=1}^n c_j x^\ast_j + \sum_{j=1}^n c^\ast_j x_j + \sum_{i=1}^m c^\ast_{n+i} x_{n+i}, $$ kjer velja $c^\ast_j \le 0$ ($1 \le j \le n+m$) in $c^\ast_j = 0$, če je $x_j$ bazna spremenljivka. Naj bo $y^\ast_{n+i} = -c^\ast_{n+i}$ ($1 \le i \le m$). Pokazali bomo, da je $y^\ast$ optimalna rešitev $\Pi'$. Velja $$ \begin{aligned} z &= \sum_{j=1}^n c_j x^\ast_j + \sum_{j=1}^n c^\ast_j x_j + \sum_{i=1}^m (-y^\ast_{n+i}) \left(b_i - \sum_{j=1}^n a_{ij} x_j\right) \\ &= \left(\sum_{j=1}^n c_j x^\ast_j - \sum_{i=1}^m b_i y^\ast_{n+i}\right) + \sum_{j=1}^n c^\ast_j x_j + \sum_{j=1}^n \left(\sum_{i=1}^m a_{ij} y^\ast_{n+i}\right) x_j \\ &= \left(\sum_{j=1}^n c_j x^\ast_j - \sum_{i=1}^m b_i y^\ast_{n+i}\right) + \sum_{j=1}^n \left(c^\ast_j + \sum_{i=1}^m a_{ij} y^\ast_{n+i}\right) x_j \\ \end{aligned} $$ Ker velja $z = \sum_{j=1}^n c_j x_j$, sledi $$ \begin{aligned} \sum_{j=1}^n c_j x^\ast_j - \sum_{i=1}^m b_i y^\ast_{n+i} &= 0, \\ c^\ast_j + \sum_{i=1}^m a_{ij} y^\ast_{n+i} &= c_j & (1 \le j \le n). \end{aligned} $$ Ker velja $y^\ast_{n+i} = -c^\ast_{n+i} \ge 0$ ($1 \le i \le m$) in $\sum_{i=1}^m a_{ij} y^\ast_{n+i} = c_j - c^\ast_j \ge c_j$ ($1 \le j \le n$), je $y^\ast$ dopustna rešitev za $\Pi'$. Ker velja $c^\top x^\ast = b^\top y^\ast$, je po Posledici 1 $y^\ast$ optimalna rešitev za $\Pi'$. --- Če povzamemo: * **_ŠID:_** $x, y$ dopustni za $\Pi, \Pi' \Rightarrow c^\top x \le b^\top y$ * **_KID:_** $\Pi$ optimalen $\Rightarrow \Pi'$ optimalen z isto optimalno vrednostjo Imamo torej sledeče možnosti: | $\Pi$ \ $\Pi'$ | nedopusten | neomejen | optimalen | | -------------- | ---------- | ----------- | ----------- | | nedopusten | ✔ | ✔ | ✗ (KID) | | neomejen | ✔ | ✗ (ŠID) | ✗ (KID/ŠID) | | optimalen | ✗ (KID) | ✗ (KID/ŠID) | ✔ | **_Primer_** nedopustnih $\Pi$ in $\Pi'$: | $\Pi$ | $\Pi'$ | | ----- | ------ | | $$\begin{aligned} \max &\ & 2x_1 - x_2 \\ \text{p.p.} && -x_1 + x_2 &\le -2 \\ && x_1 - x_2 &\le 1 \\ && x_1, x_2 &\ge 0 \end{aligned}$$ | $$\begin{aligned} \min &\ & -2y_3 + y_4 \\ \text{p.p.} && -y_3 + y_4 &\ge 2 \\ && y_3 - y_4 &\ge -1 \\ && y_3, y_4 &\ge 0 \end{aligned}$$ | **_Izrek._** Za linearna programa $\Pi$ in $\Pi'$ velja natanko ena od sledečih možnosti: * oba sta optimalna, * oba sta nedopustna, ali * eden je neomejen, drugi pa nedopusten. --- **_Izrek o dualnem dopolnjevanju_** (angl. _complementary slackness_). Naj bo $\Pi$ prvotni linearni program kot zgoraj in $\Pi'$ njegov dual, ter naj bosta $x$ in $y$ dopustni rešitvi za $\Pi$ oziroma $\Pi'$. Potem sta $x$ in $y$ optimalni rešitvi za $\Pi$ oziroma $\Pi'$ natanko tedaj, ko velja $$ \begin{aligned} \forall i &\in \{1, \dots, m\}: & \Big(\sum_{j=1}^n a_{ij} x_j &= b_i &&\lor& y_{n+i} &= 0\Big) \quad \text{in} \\ \forall j &\in \{1, \dots, n\}: & \Big(x_j &= 0 &&\lor& \sum_{i=1}^m a_{ij} y_{n+i} &= c_j\Big). \end{aligned} $$ Ekvivalentno: potem sta $x$ in $y$ optimalni rešitvi za $\Pi$ oziroma $\Pi'$ natanko tedaj, ko velja $$ \begin{aligned} \forall i &\in \{1, \dots, m\}: & \Big(\sum_{j=1}^n a_{ij} x_j &< b_i &&\Rightarrow& y_{n+i} &= 0\Big) \quad \text{in} \\ \forall j &\in \{1, \dots, n\}: & \Big(x_j &> 0 &&\Rightarrow& \sum_{i=1}^m a_{ij} y_{n+i} &= c_j\Big). \end{aligned} $$ _Dokaz._ $$ L = \sum_{j=1}^n c_j x_j \le \sum_{j=1}^n \left(\sum_{i=1}^m a_{ij} y_{n+i}\right) x_j = \sum_{i=1}^m \left(\sum_{j=1}^n a_{ij} x_j\right) y_{n+i} \le \sum_{i=1}^m b_i y_{n+i} = D $$ Po Posledici 1 in KID sta $x, y$ optimalni za $\Pi, \Pi'$ natanko tedaj, ko velja $L = D$, kar je enakovredno $$ \begin{aligned} \forall j: c_j x_j = \left(\sum_{i=1}^m a_{ij} y_{n+i}\right) x_j &\ \land \ \forall i: \left(\sum_{j=1}^n a_{ij} x_j\right) y_{n+i} = b_i y_{n+i} \\ \Leftrightarrow \quad \forall j: \left(c_j - \sum_{i=1}^m a_{ij} y_{n+i}\right) x_j = 0 &\ \land \ \forall i: \left(b_i - \sum_{j=1}^n a_{ij} x_j\right) y_{n+i} = 0 \end{aligned} $$ **_Primer._** Pokaži, da je $x = (0, 50, 0)$ optimalna rešitev problema kmetije. 1. korak: preverimo, da je ponujena rešitev dopustna. $$ \begin{aligned} 0 + 50 + 0 &= 50 \\ 3 \cdot 0 + 4 \cdot 50 + 5 \cdot 0 &< 250 \\ 3 \cdot 0 + 5 \cdot 50 + 4 \cdot 0 &< 300 \end{aligned} $$ 2. korak: za vsako neenakost, ki je izpolnjena z $<$, pripadajoči dualni spremenljivki dodelimo vrednost $0$. $$ y_5 = y_6 = 0 $$ 3. korak: za vsako pozitivno vrednost v rešitvi postavimo enačaj v pripadajoči neenakosti. $$ y_4 + 4 y_5 + 5 y_6 = 15 $$ 4. korak: rešimo sistem iz korakov 2 in 3 ter preverimo dopustnost rešitve. * Če je rešitev več (parametrična rešitev), zadostuje, da poiščemo tako vrednost parametrov, da bo dobljena rešitev dopustna. $$ \begin{aligned} y_4 = 15 \qquad y_5 &= 0 \qquad y_6 = 0 \\[1ex] 15 + 3 \cdot 0 + 3 \cdot 0 &\ge 10 \\ 15 + 5 \cdot 0 + 4 \cdot 0 &\ge 12 \end{aligned} $$ --- ### Ekonomski pomen dualnih spremenljivk **_Primer._** Problem kmetije: $$ \begin{aligned} x_1^\ast = 0 \qquad x_2^\ast = 50 \qquad x_3^\ast &= 0 \\[1ex] z^\ast = 10 \cdot 0 + 15 \cdot 50 + 12 \cdot 0 &= 750 & \text{(zaslužek v 40 €)} \\[1ex] 0 + 50 + 0 &= 50 & \text{(zemlja v ha)} \\ 3 \cdot 0 + 4 \cdot 50 + 5 \cdot 0 &< 250 & \text{(delovna sila v 20 človek-urah)} \\ 3 \cdot 0 + 5 \cdot 50 + 4 \cdot 0 &< 300 & \text{(kapital v 80 €)} \end{aligned} $$ Ne izplača se nam najeti več delovne sile ali vzeti kredita. Morda se nam izplača dokupiti dodatno zemljo. $$ y_4^\ast = 15 \qquad y_5^\ast = 0 \qquad y_6^\ast = 0 $$ **_Izrek._** Naj bo $\Pi$ prvotni linearni program kot zgoraj z neizrojeno bazno optimalno rešitvijo (tj., v pripadajočem slovarju so vsi konstantni členi pri baznih spremenljivkah pozitivni), in $\Pi'$ njegov dual. Potem obstaja $\epsilon > 0$, da velja $$ |\Delta b| < \epsilon \ \Rightarrow \ \Delta z^\ast = \sum_{i=1}^m y_{n+i}^\ast \Delta b_i, $$ kjer je $y^\ast$ optimalna rešitev $\Pi'$ ter sta $\Delta b$ in $\Delta z^\ast$ spremembi desne strani in optimalne vrednosti. V našem primeru: $\Delta z^\ast = 15 \, \Delta b_1$ za $|\Delta b| < \epsilon$. Zemljo se nam splača kupiti po ceni največ $15 \cdot 40$ €/ha = $600$ €/ha. Torej: optimalne vrednosti duala nam dajo "tržno"/"pošteno"/sprejemljivo ceno surovin. --- ### Dual splošnega linearnega programa **_Izrek._** Naj bo $\Pi$ linearni program v spodnji obliki. Potem je njegov dual $\Pi'$: | prvotni LP $\Pi$ | dualni LP $\Pi'$ | | ---------------- | ---------------- | | $$\begin{aligned} \max \ \sum_{j=1}^n c_j x_j \\[1ex] \text{p.p.} \quad \sum_{j=1}^n a_{ij} x_j &\le b_i & (1 &\le i \le m') \\ \sum_{j=1}^n a_{ij} x_j &= b_i & (m'+1 &\le i \le m) \\ x_j &\ge 0 & (1 &\le j \le n') \end{aligned}$$ | $$\begin{aligned} \min \ \sum_{i=1}^m b_i y_{n+i} \\[1ex] \text{p.p.} \quad \sum_{i=1}^m a_{ij} y_{n+i} &\ge c_j & (1 &\le j \le n') \\ \sum_{i=1}^m a_{ij} y_{n+i} &= c_j & (n'+1 &\le j \le n) \\ y_{n+i} &\ge 0 & (1 &\le i \le m') \end{aligned}$$ | **_Izrek o dualnem dopolnjevanju_** za $\Pi$ in $\Pi'$ kot zgoraj.<br /> Naj bosta $x$ in $y$ dopustni rešitvi za $\Pi$ oziroma $\Pi'$. Potem sta $x$ in $y$ optimalni rešitvi za $\Pi$ oziroma $\Pi'$ natanko tedaj, ko velja $$ \begin{aligned} \forall i &\in \{1, \dots, m'\}: & \Big(\sum_{j=1}^n a_{ij} x_j &= b_i &&\lor& y_{n+i} &= 0\Big) \quad \text{in} \\ \forall j &\in \{1, \dots, n'\}: & \Big(x_j &= 0 &&\lor& \sum_{i=1}^m a_{ij} y_{n+i} &= c_j\Big). \end{aligned} $$ Torej: * neenakost $\le \quad \leftrightarrow \quad$ nenegativna spremenljivka * enakost $\quad \leftrightarrow \quad$ neomejena spremenljivka **_Primer._** | prvotni LP $\Pi$ | dualni LP $\Pi'$ | | ---------------- | ---------------- | | $$\begin{aligned} \max \ 3 x_1 - 2 x_2 \\[1ex] \text{p.p.} \quad x_1 + 4 x_2 &\le 5 \\ 3 x_1 + x_2 &= 4 \\ x_1 &\ge 0 \end{aligned}$$ | $$\begin{aligned} \min \ 5 y_3 + 4 y_4 \\[1ex] \text{p.p.} \quad y_3 + 3 y_4 &\ge 3 \\ 4 y_3 + y_4 &= -2 \\ y_3 &\ge 0 \end{aligned}$$ | _Dokaz._ Pretvorimo $\Pi$ v standardno obliko: $$ \begin{aligned} \max \ \sum_{j=1}^{n'} c_j x_j + \sum_{j=n'+1}^n c_j x^+_j - \sum_{j=n'+1}^n c_j x^-_j \\[1ex] \text{p.p.} \quad \sum_{j=1}^{n'} a_{ij} x_j + \sum_{j=n'+1}^n a_{ij} x^+_j - \sum_{j=n'+1}^n a_{ij} x^-_j &\le b_i & (1 &\le i \le m') \\ \sum_{j=1}^{n'} a_{ij} x_j + \sum_{j=n'+1}^n a_{ij} x^+_j - \sum_{j=n'+1}^n a_{ij} x^-_j &\le b_i & (m'+1 &\le i \le m) \\ -\sum_{j=1}^{n'} a_{ij} x_j - \sum_{j=n'+1}^n a_{ij} x^+_j + \sum_{j=n'+1}^n a_{ij} x^-_j &\le -b_i & (m'+1 &\le i \le m) \\ x_j &\ge 0 & (1 &\le j \le n') \\ x^+_j, x^-_j &\ge 0 & (n'+1 &\le j \le n) \end{aligned} $$ Zapišimo še dual: $$ \begin{aligned} \min \ \sum_{i=1}^{m'} b_i y_{n+i} + \sum_{i=m'+1}^m b_i y^+_{n+i} - \sum_{i=m'+1}^m b_i y^-_{n+i} \\[1ex] \text{p.p.} \quad \sum_{i=1}^{m'} a_{ij} y_{n+i} + \sum_{i=m'+1}^m a_{ij} y^+_{n+i} - \sum_{i=m'+1}^m a_{ij} y^-_{n+i} &\ge c_j & (1 &\le j \le n') \\ \sum_{i=1}^{m'} a_{ij} y_{n+i} + \sum_{i=m'+1}^m a_{ij} y^+_{n+i} - \sum_{i=m'+1}^m a_{ij} y^-_{n+i} &\ge c_j & (n'+1 &\le j \le n) \\ -\sum_{i=1}^{m'} a_{ij} y_{n+i} - \sum_{i=m'+1}^m a_{ij} y^+_{n+i} + \sum_{i=m'+1}^m a_{ij} y^-_{n+i} &\ge -c_j & (n'+1 &\le j \le n) \\ y_{n+i} &\ge 0 & (1 &\le i \le m') \\ y^+_{n+i}, y^-_{n+i} &\ge 0 & (m'+1 &\le i \le m) \end{aligned} $$ Vidimo, da je dobljeni dual enakovreden našemu zapisu $\Pi'$. --- ## Problem razvoza (angl. _transshipment problem_) **_Primer._** Imamo 3 mesta, v mestu $a$ proizvedejo 7 enot mleka, v $b$ ga porabijo 4 enote, v $c$ pa ga porabijo 3 enote. Prevoz po cesti ima določeno ceno na enoto: * $a \to b: 1$ * $a \to c: 3$ * $b \to c: 1$ * $c \to b: 6$ Kako najceneje prenesti mleko od proizvajalcev do porabnikov? ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 a [label=-7,xlabel=a] b [label=4,xlabel=b] c [label=3,xlabel=c] a -> b [taillabel=" 1\n\n", tailport=ne] a -> c [taillabel="\n 3", tailport=se] b -> c [headlabel=" 1", label=" ", tailport=se, constraint=false] c -> b [headlabel="6 ", tailport=nw, constraint=false] } ``` Možni rešitvi: * Rešitev 1: ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red, labelfontcolor=black] a [label=-7,xlabel=a] b [label=4,xlabel=b] c [label=3,xlabel=c] a -> b [taillabel=" 1\n\n", label=4, tailport=ne, color=red] a -> c [taillabel="\n 3", label=3, tailport=se, color=red] b -> c [headlabel=" 1", label=" ", tailport=se, constraint=false] c -> b [headlabel="6 ", tailport=nw, constraint=false] } ``` Cena: $4 \cdot 1 + 3 \cdot 3 = 13$ * Rešitev 2: ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red, labelfontcolor=black] a [label=-7,xlabel=a] b [label=4,xlabel=b] c [label=3,xlabel=c] a -> b [taillabel=" 1\n\n", label=7, tailport=ne, color=red] a -> c [taillabel="\n 3", tailport=se] b -> c [headlabel=" 1", label=" 3", tailport=se, constraint=false, color=red] c -> b [headlabel="6 ", tailport=nw, constraint=false] } ``` Cena: $7 \cdot 1 + 3 \cdot 1 = 10$ ---- Imamo usmerjen utežen graf $G = (V, E)$, kjer je $V$ množica vozlišč in $E$ množica usmerjenih povezav, ter uteži na vozliščih $b_v \in \mathbb{R}$ ($v \in V$) in uteži na povezavah $c_{uv} \in \mathbb{R}$ ($uv \in E$), kjer: * $b_v \ge 0$, če je v vozlišču $v$ poraba $b_v$, in * $b_v < 0$, če je v vozlišču $v$ proizvodnja $-b_v$. Predpostavimo $\sum_{v \in V} b_v = 0$. Iščemo $x_{uv} \ge 0$ za vsako povezavo $uv \in E$, tako da velja **_Kirchhoffov zakon_**: $$ \forall v \in V: \sum_{uv \in E} x_{uv} - \sum_{vu \in E} x_{vu} = b_v. $$ Radi bi minimizirali ceno $\sum_{uv \in E} c_{uv} x_{uv}$. ---- V našem primeru: $$ \begin{aligned} \min &\ & x_{ab} + 3 x_{ac} + x_{bc} + 6 x_{cb} \\[1ex] \text{p.p.} && -x_{ab} - x_{ac} &= -7 \\ && x_{ab} + x_{cb} - x_{bc} &= 4 \\ && x_{ac} + x_{bc} - x_{cb} &= 3 \\ && x_{ab}, x_{ac}, x_{bc}, x_{cb} &\ge 0 \end{aligned} $$ To je linearni program, lahko ga rešimo z dvofazno simpleksno metodo. Spoznali bomo prilagojen algoritem: **simpleksna metoda na omrežjih**. ---- Naj bo $A \in \mathbb{R}^{V \times E}$ _incidenčna matrika_ usmerjenega grafa $G = (V, E)$, tj., $A = (a_{ve})_{v \in V, e \in E}$, kjer je $$ a_{ve} = \begin{cases} 1 & \operatorname{konec}(e) = v, \\ -1 & \operatorname{začetek}(e) = v, \text{in} \\ 0 & \text{sicer,} \end{cases} $$ ter $b \in \mathbb{R}^V$ in $c \in \mathbb{R}^E$ vektorja uteži vozlišč in povezav. Potem lahko _problem razvoza_ $\Pi$ zapišemo kot $$ \begin{aligned} \min \ c^\top x \\[1ex] \text{p.p.} \quad A x &= b \\ x &\ge 0 \end{aligned} $$ ali ekvivalentno kot $$ \begin{aligned} \max \ -c^\top x \\[1ex] \text{p.p.} \quad -A x &= -b \\ x &\ge 0 \end{aligned} $$ Dual $\Pi'$ problema razvoza $\Pi$ je potem $$ \begin{aligned} \min \ -b^\top y \\[1ex] \text{p.p.} \quad -A^\top y &\ge -c \end{aligned} $$ in ga ekvivalentno lahko zapišemo kot $$ \begin{aligned} \max \ b^\top y \\[1ex] \text{p.p.} \quad A^\top y &\le c \end{aligned} $$ Ker ima matrika $A$ vrednosti v stolpcu, ki ustreza povezavi $uv$, vrednosti $-1$ in $1$ v vrsticah, ki ustrezata vozliščema $u$ oziroma $v$, in $0$ drugod, lahko dual problema razvoza zapišemo tudi kot $$ \begin{aligned} \max \ \sum_{v \in V} b_v y_v \\[1ex] \text{p.p.} \quad \forall uv \in E: \ y_u + c_{uv} &\ge y_v \end{aligned} $$ Opazimo, da če je $y$ dopustna (optimalna) rešitev $\Pi'$, potem je tudi $y + \epsilon$ ($\epsilon \in \mathbb{R}$) dopustna (optimalna) rešitev $\Pi'$, saj velja $$ \sum_{v \in V} b_v (y_v + \epsilon) = \sum_{v \in V} b_v y_v + \epsilon \sum_{v \in V} b_v = \sum_{v \in V} b_v y_v. $$ Vemo tudi (dualno dopolnjevanje): če sta $x$ in $y$ dopustni rešitvi za $\Pi$ oziroma $\Pi'$, potem sta $x, y$ tudi optimalni natanko tedaj, ko velja $$ \forall uv \in E: \ (x_{uv} = 0 \ \lor \ y_u + c_{uv} = y_v) $$ ---- * Rešitev 1 je dopustna, ni pa optimalna: $$ \begin{aligned} y_a &= 0 \\ y_b = y_a + 1 &= 1 \\ y_c = y_a + 3 &= 3 \\ y_b + 1 &\not\ge y_c \\ y_c + 6 &\ge y_b \end{aligned} $$ * Rešitev 2 je dopustna in tudi optimalna: $$ \begin{aligned} y_a &= 0 \\ y_b = y_a + 1 &= 1 \\ y_c = y_b + 1 &= 2 \\ y_a + 3 &\ge y_c \\ y_c + 6 &\ge y_b \end{aligned} $$ --- Kdaj je sistem $\forall uv \in E': \ y_u + c_{uv} = y_v$ ($E' \subseteq E$) rešljiv? ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] a [xlabel=a] b [xlabel=b] c [xlabel=c] a -> b [taillabel=" 2\n\n", tailport=ne] a -> c [taillabel="\n 1", tailport=se] b -> c [headlabel=" 5", label=" ", tailport=se, constraint=false] } ``` $$ \begin{aligned} y_a &= 0 \\ y_b = y_a + 2 &= 2 \\ y_c = y_a + 1 &= 1 \\ y_c \ne y_b + 5 &= 7 \end{aligned} $$ ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] a [xlabel=a] b [xlabel=b] c [xlabel=c] d [xlabel=d] e [xlabel=e] f [xlabel=f] a -> c [taillabel=5] b -> c [taillabel=1] c -> e [taillabel=2] d -> e [taillabel=-3] e -> f [taillabel=4] } ``` $$ \begin{alignedat}{3} &&&& y_a &= 0 \\ && y_c &=& y_a + 5 &= 5 \\ y_c &= y_b + 1 &&\Rightarrow&\ y_b &= 4 \\ && y_e &=& y_c + 2 &= 7 \\ y_e &= y_d + (-3) &&\Rightarrow&\ y_d &= 10 \\ && y_f &=& y_e + 4 &= 11 \end{alignedat} $$ Problem so cikli! Tak sistem enačb je vedno rešljiv na drevesu (tj., povezanem grafu brez ciklov). V drevesu je med vsakima vozliščema natanko ena pot. **_Definicija._** Dopustna rešitev $x$ za problem razvoza $\Pi$ na grafu $G = (V, E)$ je _drevesna dopustna rešitev_, če v grafu $G$ obstaja vpeto drevo $T = (V, E')$, da velja $x_e = 0$ za vsak $e \in E \setminus E'$. ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red] node [label=""] a [xlabel=a] b [xlabel=b] c [xlabel=c] d [xlabel=d] e [xlabel=e] f [xlabel=f] a -> b [color=red] a -> c [label=0] b -> c [label=0, constraint=false] d -> b [color=red, constraint=false] c -> d [color=red] c -> e [color=red] d -> e [label=0, constraint=false] d -> f [label=0] f -> d [color=red, constraint=false] f -> e [label=0, constraint=false, tailport=s] } ``` **_Trditev._** Če ima problem razvoza $\Pi$ dopustno rešitev, ima tudi drevesno dopustno rešitev. **_Definicija._** Naj bo $G$ usmerjen graf in $C$ cikel v $G$, ki vsebuje povezavo $f$. Potem je povezava $e$ v ciklu $C$ (glede na povezavo $f$) _prema_, če kaže v isto smer kot $f$, in _obratna_ sicer. ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] a -> b [label=obratna] a -> c [label=prema] d -> b [label=prema,constraint=false] c -> d [style=invis] c -> e [color=red,label=f,fontcolor=red] d -> e [label="obratna ",constraint=false] } ``` _Dokaz._ Naj bo $x$ dopustna rešitev za problem razvoza $\Pi$ na grafu $G = (V, E)$. Naj bo $E^{(0)} = E$ in $x^{(0)} = x$. Definirali bomo zaporedje $\{(E^{(i)}, x^{(i)})\}_{i=0}^k$, tako da v $i$-tem koraku dobimo $E^{(i)}$ tako, da iz $E^{(i-1)}$ odstranimo eno povezavo in določimo novo dopustno rešitev $x^{(i)}$ tako, da velja $x_e^{(i)} = 0$ za vsako povezavo $e \in E \setminus E^{(i)}$, dokler ne dobimo vpetega drevesa $T = (V, E^{(k)})$. Denimo, da ima graf $G^{(i-1)} = (V, E^{(i-1)})$ cikel $C$, in naj bo $f$ povezava na $C$ z najmanjšo vrednostjo $x_f^{(i-1)}$. Določimo novo dopustno rešitev $$ x_e^{(i)} = \begin{cases} x_e^{(i-1)} - x_f^{(i-1)} & \text{$e$ prema v $C$ glede na $f$,} \\ x_e^{(i-1)} + x_f^{(i-1)} & \text{$e$ obratna v $C$ glede na $f$,} \\ x_e^{(i-1)} & \text{sicer} \end{cases} $$ in novo množico povezav $E^{(i)} = E^{(i-1)} \setminus \{f\}$. Opazimo, da velja $x^{(i)} \ge 0$, $x_f^{(i)} = 0$ in $x_e^{(i)} = 0$ za vsako povezavo $e \in E \setminus E^{(i-1)}$, torej rešitev ustreza pogojem in je dopustna, saj še vedno velja Kirchhoffov zakon: ```graphviz digraph G { rankdir=TD node [label=""] xu [style=invis] x [style=invis] xd [style=invis] au [style=invis] ad [style=invis] bu [style=invis] bd [style=invis] cu [style=invis] cd [style=invis] du [style=invis] dd [style=invis] xu -> x -> xd [style=invis] xd -> xu [constraint=false] au -> a -> ad [label=" +p"] bu -> b -> bd [style=invis] bd -> b -> bu [label=" -p", constraint=false] cu -> c [label=" +p"] c -> cd [style=invis] cd -> c [label=" -p", constraint=false] du -> d [style=invis] d -> du [label=" -p", constraint=false] d -> dd [label=" +p"] } ``` ---- **_Primer._** ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red] node [label=""] a -> b [label=<<font color="black"><s>6</s></font>>, xlabel=7] a -> c [label=<<font color="black"><s>3</s></font>>, xlabel=2] d -> b [label=<<font color="black"><s>5</s></font>>, xlabel=4, constraint=false] c -> d [style=invis] c -> e [label=<<font color="black"><s>1</s></font>>, xlabel=0, color=red] d -> e [label=<<font color="black"><s>4</s></font>>, xlabel=" 5", constraint=false] } ``` ---- **Opomba.** Drevo določa dopustno rešitev, če ta obstaja. Naj bo $u$ list v drevesu $T$ in $e$ povezava v $T$ s krajiščem $u$. Potem je $x_e$ enolično določen. Postopek ponovimo za drevo $T - u$, dokler imamo še kakšno povezavo. ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] a [label=-3,xlabel=a] b [label=-5,xlabel=b] c [label="",xlabel=c] d [label=-2,xlabel=d] e [label=6,xlabel=e] f [label=4,xlabel=f] a -> c [taillabel=5, label=3] b -> c [taillabel=1, label=5] c -> e [taillabel=2, label=8] d -> e [taillabel=-3, label=2] e -> f [taillabel=4, label=4] } ``` ---- **Simpleksna metoda na omrežjih.** 1. Začnemo z neko drevesno dopustno rešitvijo $x$ (jo uganemo; kasneje sistematično) na vpetem drevesu $T = (V, E')$: $x_e = 0$ za vsako povezavo $e \in E \setminus E'$. 2. Rešimo sistem $\forall uv \in E': \ y_u + c_{uv} = y_v$ (vrednosti $y_v$, $v \in V$ so _razvozne cene_). * Preverimo, ali velja $y_u + c_{uv} \ge y_v$ za vsako povezavo $uv \in E \setminus E'$. Če velja, je $x$ optimalna rešitev (po dualnem dopolnjevanju). * Sicer obstaja povezava $e = uv \in E \setminus E'$, za katero velja $y_u + c_e < y_v$. Ta povezava (_vstopna povezava_) je v natanko enem (edinem) ciklu $C$ v grafu $H = (V, E' \cup \{e\})$. Naj bo $f$ obratna povezava v $C$ glede na $e$ z najmanjšo vrednostjo $x_f$ (_izstopna povezava_). Razvoz povečamo za $x_f$ na premih povezavah na $C$ glede na $e$ (obratnih glede na $f$) in zmanjšamo za $x_f$ na obratnih povezavah na $C$ glede na $e$ (premih glede na $f$). V novi rešitvi ima povezava $f$ ničeln razvoz in jo odstranimo iz drevesa. * Če obratne povezave na $C$ ni, potem je problem neomejen. 3. Ponavljamo, dokler ne pridemo do optimalne rešitve (ali ugotovimo, da je problem neomejen). ---- **_Primer._** ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 splines=false edge [fontcolor=red,labelfontcolor=black] a [label=5, xlabel=<<font color="blue">20</font>>] b [label=-5, xlabel=<<font color="blue">15</font>>] c [label=-3, xlabel=<<font color="blue">0</font>>] d [label=-2, xlabel=<<font color="blue">21</font>>] e [label="", xlabel=<<font color="blue">27</font>>] f [label=2, xlabel=<<font color="blue">26 </font>>] g [label=3, xlabel=<<font color="blue">28</font>>] a -> b [style=invis] a -> c [style=invis] b -> a [taillabel=5, xlabel=2, color=red, constraint=false] c -> a [taillabel=20, label=3, color=red, constraint=false] c -> b [taillabel=5, label="0+5 < 15", color=green, fontcolor=black constraint=false] b -> d [taillabel=6, xlabel=<<font color="blue">f</font>>, label=3, color=red, style=dashed] c -> e [taillabel=11, label="0+11 < 27", xlabel=<<font color="blue">e</font>>, color=blue, fontcolor=black] d -> e [taillabel=1, label="21+1 < 27", color=green, fontcolor=black, constraint=false] d -> f [taillabel=5, label=5, color=red] e -> g [taillabel=1, label=3, color=red] f -> e [taillabel="1 ", xlabel="3 ", color=red, constraint=false] g -> f [taillabel=1, constraint=false] } ``` Povezavam na ciklu spremenimo razvoz za $3$: ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 splines=false edge [fontcolor=red,labelfontcolor=black] a [label=5, xlabel=<<font color="blue">36</font>>] b [label=-5, xlabel=<<font color="blue">31</font>>] c [label=-3, xlabel=<<font color="blue">16</font>>] d [label=-2, xlabel=<<font color="blue">21</font>>] e [label="", xlabel=<<font color="blue">27</font>>] f [label=2, xlabel=<<font color="blue">26 </font>>] g [label=3, xlabel=<<font color="blue">28</font>>] a -> b [style=invis] a -> c [style=invis] b -> a [taillabel=5, xlabel=5, color=red, constraint=false] c -> a [taillabel=20, label=0, xlabel=<<font color="blue">f</font>>, color=red, style=dashed, constraint=false] c -> b [taillabel=5, label="16+5 < 31", xlabel=<<font color="blue"> e</font>>, color=blue, fontcolor=black, constraint=false] b -> d [taillabel=6] c -> e [taillabel=11, label=3, color=red] d -> e [taillabel=1, label="21+1 < 27", color=green, fontcolor=black, constraint=false] d -> f [taillabel=5, label=2, color=red] e -> g [taillabel=1, label=3, color=red] f -> e [taillabel="1 ", xlabel="0 ", color=red, constraint=false] g -> f [taillabel=1, constraint=false] } ``` Izstopna povezava je imela razvoz $0$ - razvozi se ne spremenijo, spremeni se le drevo in razvozne cene (_izrojen korak_): ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 splines=false edge [fontcolor=red,labelfontcolor=black] a [label=5, xlabel=<<font color="blue">26</font>>] b [label=-5, xlabel=<<font color="blue">21</font>>] c [label=-3, xlabel=<<font color="blue">16</font>>] d [label=-2, xlabel=<<font color="blue">21</font>>] e [label="", xlabel=<<font color="blue">27</font>>] f [label=2, xlabel=<<font color="blue">26 </font>>] g [label=3, xlabel=<<font color="blue">28</font>>] a -> b [style=invis] a -> c [style=invis] b -> a [taillabel=5, xlabel=5, color=red, constraint=false] c -> a [taillabel="20 ", constraint=false] c -> b [taillabel=5, label=0, color=red, constraint=false] b -> d [taillabel=6] c -> e [taillabel=11, label=3, color=red] d -> e [taillabel=1, label="21+1 < 27", xlabel=<<font color="blue"> e</font>>, color=blue, fontcolor=black, constraint=false] d -> f [taillabel=5, label=2, color=red] e -> g [taillabel=1, label=3, color=red] f -> e [taillabel="1 ", xlabel=<0 <font color="blue">f</font>>, color=red, style=dashed, constraint=false] g -> f [taillabel=1, constraint=false] } ``` Še en izrojen korak: ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 splines=false edge [fontcolor=red,labelfontcolor=black] a [label=5, xlabel=<<font color="blue">26</font>>] b [label=-5, xlabel=<<font color="blue">21</font>>] c [label=-3, xlabel=<<font color="blue">16</font>>] d [label=-2, xlabel=<<font color="blue">26</font>>] e [label="", xlabel=<<font color="blue">27</font>>] f [label=2, xlabel=<<font color="blue">31 </font>>] g [label=3, xlabel=<<font color="blue">28</font>>] a -> b [style=invis] a -> c [style=invis] b -> a [taillabel=5, xlabel=5, color=red, constraint=false] c -> a [taillabel="20 ", constraint=false] c -> b [taillabel=5, label=0, color=red, constraint=false] b -> d [taillabel=6] c -> e [taillabel=11, label=3, color=red] d -> e [taillabel=1, label=0, color=red, constraint=false] d -> f [taillabel=5, label=2, xlabel=<<font color="blue">f</font>>, color=red, style=dashed] e -> g [taillabel=1, label=3, color=red] f -> e [taillabel="1 ", constraint=false] g -> f [taillabel=1, label="28+1 < 31", xlabel=<<font color="blue"> e</font>>, color=blue, fontcolor=black, constraint=false] } ``` Povezavam na ciklu spremenimo razvoz za $2$: ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 splines=false edge [fontcolor=red,labelfontcolor=black] a [label=5, xlabel=<<font color="blue">26</font>>] b [label=-5, xlabel=<<font color="blue">21</font>>] c [label=-3, xlabel=<<font color="blue">16</font>>] d [label=-2, xlabel=<<font color="blue">26</font>>] e [label="", xlabel=<<font color="blue">27</font>>] f [label=2, xlabel=<<font color="blue">29 </font>>] g [label=3, xlabel=<<font color="blue">28</font>>] a -> b [style=invis] a -> c [style=invis] b -> a [taillabel=5, xlabel=5, color=red, constraint=false] c -> a [taillabel=20, label="16+20 &ge; 26", fontcolor=black, constraint=false] c -> b [taillabel=5, label=0, color=red, constraint=false] b -> d [taillabel=6, label="21+6 &ge; 26", fontcolor=black] c -> e [taillabel=11, label=3, color=red] d -> e [taillabel=1, label=2, color=red, constraint=false] d -> f [taillabel=5, label="26+5 &ge; 29", fontcolor=black] e -> g [taillabel=1, label=5, color=red] f -> e [taillabel="1 ", xlabel="29+1 &ge; 27 ", fontcolor=black, constraint=false] g -> f [taillabel=1, label=2, color=red, constraint=false] } ``` Ni več kandidatov za vstop - dobili smo optimalno rešitev s ceno $$ \sum_{e \in E} c_e x_e = 5 \cdot 5 + 5 \cdot 0 + 11 \cdot 3 + 1 \cdot 2 + 1 \cdot 5 + 1 \cdot 2 = 67. $$ Preverimo še optimalno vrednost dualnega problema: $$ \sum_{v \in V} b_v y_v = 5 \cdot 26 + (-5) \cdot 21 + (-3) \cdot 16 + (-2) \cdot 26 + 0 \cdot 27 + 2 \cdot 29 + 3 \cdot 28 = 67 $$ ---- **Opomba.** Če je $y_u + c_{uv} < y_v$ in je $C$ cikel v $H$, ki vsebuje $uv$, to pomeni, da je $$ \sum_{e \in C \text{ prema}} c_e - \sum_{e \in C \text{ obratna}} c_e < 0. $$ ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] a [xlabel=a] b [xlabel=b] c [xlabel=c] d [xlabel=d] e [xlabel=e] a -> b a -> c [style=dashed, color=blue] d -> b [constraint=false] c -> d [style=invis] c -> e d -> e [constraint=false] } ``` $$ \begin{aligned} y_b &= y_a + c_{ab} \\ y_d &= y_b - c_{db} \\ &= y_a + c_{ab} - c_{db} \\ y_e &= y_d + c_{de} \\ &= y_a + c_{ab} - c_{db} + c_{de} \\ y_c &= y_e - c_{ce} \\ &= y_a + c_{ab} - c_{db} + c_{de} - c_{ce} \\[1ex] y_a + c_{ac} &< y_a + c_{ab} - c_{db} + c_{de} - c_{ce} \\ 0 &> c_{ac} + c_{ce} - c_{de} + c_{db} - c_{ab} \end{aligned} $$ Ko razvoz na premih povezavah povečamo za $p$ in ga na obratnih povezavah zmanjšamo za $p$, se cena poveča za $$ p (c_{ac} + c_{ce} - c_{de} + c_{db} - c_{ab}) $$ oziroma v splošnem za $$ p \left(\sum_{e \in C \text{ prema}} c_e - \sum_{e \in C \text{ obratna}} c_e\right). $$ Če je $p > 0$, se cena torej zmanjša. **Opomba.** Če ne moremo izbrati izstopne povezave, so vse povezave na $C$ preme in velja $\sum_{e \in C} c_e < 0$. Našli smo negativen cikel, problem razvoza je torej neomejen. **_Trditev._** Če velja $\forall uv \in E: \ y_u + c_{uv} \ge y_v$ (z enakostjo pri vseh povezavah $uv \in E'$ vpetega drevesa $T = (V, E')$), je rešitev optimalna. _Dokaz._ Naj bo $x'$ še ena dopustna rešitev. Potem velja $$ \forall uv \in E: \ (y_u + c_{uv} - y_v) x_{uv}' \ge (y_u + c_{uv} - y_v) x_{uv} = 0, $$ saj * če $uv \in E'$, potem $y_u + c_{uv} - y_v = 0$, in * če $uv \not\in E'$, potem $x_{uv} = 0$, $(y_u + c_{uv} - y_v) x_{uv}' \ge 0$. Če seštejemo za vse povezave, dobimo $$ \begin{aligned} 0 &\le \sum_{uv \in E} c_{uv} (x_{uv}' - x_{uv}) - \sum_{uv \in E} (y_v - y_u) (x_{uv}' - x_{uv}) = c^\top (x' - x) - (A^\top y)^\top (x' - x) = \\ &= c^\top x' - c^\top x - y^\top A x' + y^\top A x = c^\top x' - c^\top x - y^\top b + y^\top b . \end{aligned} $$ Velja torej $c^\top x' \ge c^\top x$. **Opomba.** Tudi pri simpleksni metodi za omrežja lahko pride do ciklanja. Temu se lahko izognemo z uporabo _Cunninghamovega pravila_: * izberemo _koren_ $r \in V$; * ko izbiramo izstopno povezavo v ciklu $C$ z vstopno povezavo $e = uv$, določimo vozlišče $z$ na $C$, ki leži na poteh (v drevesu - brez $e$) od $r$ do $u$ oziroma $v$, in za izstopno povezavo izberemo prvega kandidata na $C$ od $z$ naprej v smeri $uv$. ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] r -> a a -> b [style=invis] b -> a [constraint=false] b -> z z -> c [color=green] z -> d c -> e [style=invis] e -> c [constraint=false] d -> f [label=e, color=blue, fontcolor=blue] e -> g [color=green] g -> f [label=f, fontcolor=blue, color=green, style=dashed, constraint=false] r [xlabel=r] z [xlabel=z] d [xlabel=u] f [xlabel=v] } ``` --- Kako pridemo do začetne dopustne rešitve oziroma dokažemo, da je problem nedopusten? Uporabimo **dvofazno simpleksno metodo na omrežjih**. Definiramo pomožni problem: * Izberemo _koren_ $r \in V$. * Za vsako vozlišče $v \in V \setminus \{r\}$: - če $b_v \ge 0$ in povezava $rv$ ne obstaja, jo dodamo; - če $b_v < 0$ in povezava $vr$ ne obstaja, jo dodamo. * Dobimo nov graf $\tilde{G} = (V, \tilde{E})$. Dodanim povezavam (iz $\tilde{E} \setminus E$) pravimo _umetne povezave_, povezavam iz $E$ pa _prvotne povezave_. * Definiramo nove cene $\tilde{c}$, in sicer - prvotne povezave $e \in E$ imajo ceno $\tilde{c}_e = 0$, in - umetne povezave $e \in \tilde{E} \setminus E$ imajo ceno $\tilde{c}_e = 1$. Ta problem je vedno dopusten: * $x_{rv} = b_v$ za vse $v \in V \setminus \{r\}$ z $b_v \ge 0$, * $x_{vr} = -b_v$ za vse $v \in V \setminus \{r\}$ z $b_v < 0$, * $x_e = 0$ za vse ostale povezave $e \in \tilde{E}$. Kirchhofovi zakoni: * $v \ne r$, $b_v \ge 0$: $x_{rv} = b_v$ * $v \ne r$, $b_v < 0$: $-x_{vr} = b_v$ * $v = r$: $-\sum_{\substack{u \ne r \\ b_u \ge 0}} x_{ru} + \sum_{\substack{u \ne r \\ b_u < 0}} x_{ur} = -\sum_{\substack{u \ne r \\ b_u \ge 0}} b_u + \sum_{\substack{u \ne r \\ b_u < 0}} (-b_u) = -\sum_{u \ne r} b_u = b_r$ Prvotni problem je dopusten natanko tedaj, ko je optimalna vrednost pomožnega problema enaka $0$. Ker so vse cene v pomožnem problemu nenegativne, je problem omejen. **_Primer._** Dokaži, da je problem nedopusten. ```graphviz digraph G { rankdir=TD nodesep=1 ranksep=1 a [label=1] b [label=-3] c [label=-2] r [label=0, xlabel="r "] d [label=4] a -> c [style=invis] a -> r [taillabel=" 1"] b -> a [taillabel=3, constraint=false] b -> r [taillabel="4 "] b -> d [taillabel=2] c -> a [taillabel=" 1", headport=sw, constraint=false] c -> r [taillabel=2, constraint=false] d -> r [taillabel=1, constraint=false] } ``` Narišimo graf za pomožni problem in določimo začetno drevesno rešitev. ```graphviz digraph G { rankdir=TD nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] a [label=1, xlabel=<<font color="blue">1</font>>] b [label=-3, xlabel=<<font color="blue">0</font>>] c [label=-2, xlabel=<<font color="blue">0</font>>] r [label=0, xlabel=<<font color="blue">0</font>>] d [label=4, xlabel=<<font color="blue">1</font>>] a -> c [style=invis] a -> r [taillabel="\n 0"] b -> a [taillabel=0, xlabel=<<font color="blue">e</font>>, color=blue, constraint=false] b -> r [taillabel="0 ", label=3, color=red] b -> d [taillabel=0, color=green] c -> a [taillabel=" 0", color=green, constraint=false] c -> r [taillabel=0, label=2, color=red, constraint=false] d -> r [taillabel=" 0", constraint=false] r -> a [taillabel="1 ", label=1, xlabel=<<font color="blue">f </font>>, style=dashed, color=red, constraint=false] r -> d [taillabel=1, label=4, color=red, constraint=false] } ``` ```graphviz digraph G { rankdir=TD nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] a [label=1, xlabel=<<font color="blue">0</font>>] b [label=-3, xlabel=<<font color="blue">0</font>>] c [label=-2, xlabel=<<font color="blue">0</font>>] r [label=0, xlabel=<<font color="blue">0</font>>] d [label=4, xlabel=<<font color="blue">1</font>>] a -> c [style=invis] a -> r [taillabel="\n 0"] b -> a [taillabel=0, label=1, color=red, constraint=false] b -> r [taillabel="0 ", label=2, xlabel=<<font color="blue">f</font>>, style=dashed, color=red] b -> d [taillabel=0, xlabel=<<font color="blue">e </font>>, color=blue] c -> a [taillabel=0, constraint=false] c -> r [taillabel=0, label=2, color=red, constraint=false] d -> r [taillabel=" 0", constraint=false] r -> a [taillabel="1 ", constraint=false] r -> d [taillabel=1, label=4, color=red, constraint=false] } ``` ```graphviz digraph G { rankdir=TD nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] a [label=1, xlabel=<<font color="blue">1</font>>] b [label=-3, xlabel=<<font color="blue">1</font>>] c [label=-2, xlabel=<<font color="blue">0</font>>] r [label=0, xlabel=<<font color="blue">0</font>>] d [label=4, xlabel=<<font color="blue">1</font>>] a -> c [style=invis] a -> r [taillabel="\n 0"] b -> a [taillabel=0, label=1, xlabel=<<font color="blue">f</font>>, style=dashed, color=red, constraint=false] b -> r [taillabel="0 "] b -> d [taillabel=0, label=2, color=red] c -> a [taillabel=0, xlabel=<<font color="blue">e</font>>, color=blue, constraint=false] c -> r [taillabel=0, label=2, color=red, constraint=false] d -> r [taillabel=" 0", constraint=false] r -> a [taillabel="1 ", constraint=false] r -> d [taillabel=1, label=2, color=red, constraint=false] } ``` ```graphviz digraph G { rankdir=TD nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] a [label=1, xlabel=<<font color="blue">0</font>>] b [label=-3, xlabel=<<font color="blue">1</font>>] c [label=-2, xlabel=<<font color="blue">0</font>>] r [label=0, xlabel=<<font color="blue"> 0</font>>] d [label=4, xlabel=<<font color="blue">1</font>>] a -> c [style=invis] a -> r [taillabel="\n0"] b -> a [taillabel=0, constraint=false] b -> r [taillabel="0 "] b -> d [taillabel=0, label=3, color=red] c -> a [taillabel=0, xlabel=1, color=red, constraint=false] c -> r [taillabel=0, label=1, color=red, constraint=false] d -> r [taillabel=" 0", constraint=false] r -> a [taillabel="1 ", constraint=false] r -> d [taillabel=1, label=1, color=red, constraint=false] } ``` Ni več kandidatov za vstop - imamo optimalno rešitev pomožnega problema. Ker ta vključuje umetno povezavo s pozitivnim razvozom, je prvotni problem nedopusten. ---- **Opomba.** Če je $\sum_{v \in V} b_v > 0$, ne moremo zadostiti vsem potrebam. Če je $\sum_{v \in V} b_v < 0$, dodamo umetno vozlišče $s \not\in V$ ("skladišče") in povezavo od vseh izvorov (vozlišč $v \in V$ z $b_v < 0$) do $s$ s ceno $0$ ter določimo $b_s = -\sum_{v \in V} b_v$. **_Izrek o celoštevilskih rešitvah._** Dan je problem razvoza s celoštevilskimi vrednostmi $b_v$ ($v \in V$). 1. Če obstaja dopustna rešitev, obstaja tudi celoštevilska dopustna rešitev. 2. Če obstaja optimalna rešitev, obstaja tudi celoštevilska optimalna rešitev. _Dokaz._ Naredimo dvofazno simpleksno metodo na omrežjih. Na vsakem koraku imamo celoštevilsko rešitev; če je problem dopusten, dobimo celoštevilsko dopustno rešitev. Tedaj naredimo še drugo fazo, na vsakem koraku imamo celoštevilsko rešitev. Če pridemo do optimalne rešitve, bo ta celoštevilska. --- **_Definicija._** Matrika $A = (a_{ij})_{i,j=1}^n \in \mathbb{R}^{n \times n}$ je _dvojno stohastična_, če velja $a_{ij} \ge 0$ ($1 \le i, j \le n$) ter $\sum_{j=1}^n a_{ij} = 1$ ($1 \le i \le n$) in $\sum_{i=1}^n a_{ij} = 1$ ($1 \le j \le n$). **_Primer_** dvojno stohastične matrike: $$ \begin{bmatrix} 0 & 0.9 & 0.1 \\ 0.4 & 0.1 & 0.5 \\ 0.6 & 0 & 0.4 \end{bmatrix} $$ **_Definicija._** Matrika $P = (p_{ij})_{i,j=1}^n \in \{0, 1\}^{n \times n}$ je _permutacijska matrika_, če je v vsaki vrstici in v vsakem stolpcu natanko ena enica. **_Primeri_** za $n = 3$: $$ \begin{array}{cccccc} \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}, & \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{bmatrix}, & \begin{bmatrix} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix}, & \begin{bmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{bmatrix}, & \begin{bmatrix} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{bmatrix}, & \begin{bmatrix} 0 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 0 \end{bmatrix} \\ 123 & 132 & 213 & 231 & 312 & 321 \end{array} $$ Imamo $n!$ permutacijskih matrik velikosti $n \times n$. Permutacijske matrike so dvojno stohastične. **_Trditev._** Naj bo $A \in \mathbb{R}^{n \times n}$ dvojno stohastična matrika. Potem obstaja permutacijska matrika $P \in \{0, 1\}^{n \times n}$, tako da velja $p_{ij} = 1 \Rightarrow a_{ij} > 0$ ($1 \le i, j \le n$). _Dokaz._ Naj bo $G = (V, E)$ usmerjen graf z množico vozlišč $V = \{v_i, s_i \mid 1 \le i \le n\}$ in množico povezav $E = \{v_i s_j \mid a_{ij} > 0\}$. Postavimo še $b_{v_i} = -1$, $b_{s_i} = 1$ ($1 \le i \le n$) in $c_{v_i s_j} = 0$ ($v_i s_j \in E$). Dobljeni problem razvoza je dopusten, saj obstaja dopustna rešitev z $x_{v_i s_j} = a_{ij}$ ($v_i s_j \in E$): $$ \begin{alignedat}{4} v_i&:& -\sum_{v_i s_j \in E} x_{v_i s_j} &=& -\sum_{j=1}^n a_{ij} &=& -1 &= b_{v_i} \\ s_j&:& \sum_{v_i s_j \in E} x_{v_i s_j} &=& \sum_{i=1}^n a_{ij} &=& 1 &= b_{s_j} \end{alignedat} $$ Ker obstaja dopustna rešitev $x$, obstaja tudi celoštevilska dopustna rešitev $x'$: $$ \begin{alignedat}{3} v_i&:& -\sum_{v_i s_j \in E} x_{v_i s_j}' &=& -1 &= b_{v_j}, \\ s_j&:& \sum_{v_i s_j \in E} x_{v_i s_j}' &=& 1 &= b_{s_j}, \end{alignedat} $$ kjer je v zgornjih vsotah natanko eden od $x_{v_i s_j}'$ enak $1$, ostali pa so enaki $0$. Tako lahko dobimo permutacijsko matriko $P$, kjer je $p_{ij} = 1$, če je $x_{v_i s_j}' = 1$, in $p_{ij} = 0$ sicer. Očitno potem velja $p_{ij} = 1 \Rightarrow a_{ij} > 0$ ($1 \le i, j \le n$). Tako permutacijsko matriko lahko najdemo z dvofazno simpleksno metodo na omrežjih. V našem primeru: ```graphviz digraph G { rankdir=TD nodesep=0.5 ranksep=1 edge [fontcolor=red] v1 [label=-1] v2 [label=-1] v3 [label=-1] s1 [label=1] s2 [label=1] s3 [label=1] v1 -> s2 [label=0.9] v1 -> s3 [label=0.1] v2 -> s1 [label=0.4] v2 -> s2 [label=0.1] v2 -> s3 [label=" 0.5"] v3 -> s1 [label=" 0.6"] v3 -> s3 [label=0.4] } ``` **_Definicija._** Naj bo $G = (V, E)$ neusmerjen graf. Množici $M \subseteq E$ pravimo _prirejanje_, če nobeni dve povezavi iz $M$ nimata skupnega krajišča (tj., $\forall e, f \in M: (e \ne f \Rightarrow e \cap f = \emptyset)$). Prirejanje $M$ je _popolno prirejanje_, če je vsako vozlišče grafa $G$ krajišče povezave iz $M$ (tj., $\forall v \in V \ \exists e \in M: v \in e$). **_Kőnigov izrek o plesnih parih._** Naj bo $G = (V, E)$ dvodelen regularen graf (tj., lahko zapišemo $V = X + Y$, tako da $\forall xy \in E: (x \in X \land y \in Y)$, ter $\exists r \in \mathbb{N} \ \forall v \in V: \deg(v) = r$). Potem obstaja popolno prirejanje $M \subseteq E$ v grafu $G$. **Opomba.** Če imamo $n$ deklet in $n$ fantov ter vsako dekle pozna $r$ fantov in vsak fant pozna $r$ deklet, potem lahko vsako dekle pleše s fantom, ki ga pozna. ```graphviz graph G { rankdir=TD nodesep=0.5 ranksep=1 node [label=""] d1 -- f1 [color=red] d1 -- f2 [style=invis] d1 -- f3 d1 -- f4 [style=invis] d2 -- f1 [style=invis] d2 -- f2 [style=invis] d2 -- f3 [color=red] d2 -- f4 d3 -- f1 d3 -- f2 [color=red] d3 -- f3 [style=invis] d3 -- f4 [style=invis] d4 -- f1 [style=invis] d4 -- f2 d1 -- f3 [style=invis] d4 -- f4 [color=red] } ``` _Dokaz._ Naj bo $X = \{x_1, x_2, \dots x_n\}$ in $Y = \{y_1, y_2, \dots y_n\}$. Definirajmo matriko $A = (a_{ij})_{i,j=1}^n$ z $$ a_{ij} = \begin{cases} {1 \over r} & x_i \sim y_j, \\ 0 & \text{sicer.} \end{cases} $$ Matrika $A$ je dvojno stohastična, saj velja $$ \begin{aligned} \sum_{j=1}^n a_{ij} &= {1 \over r} \cdot r = 1 & (1 \le i \le n) \\ \sum_{i=1}^n a_{ij} &= {1 \over r} \cdot r = 1 & (1 \le j \le n) \end{aligned} $$ Po prejšnji trditvi obstaja permutacijska matrika $P = (p_{ij})_{i,j=1}^n$, tako da $$ p_{ij} = 1 \ \Rightarrow\ a_{ij} > 0 \ \Rightarrow\ a_{ij} = {1 \over r} \ \Rightarrow\ x_i \sim y_j \quad (1 \le i, j \le n) $$ Matrika $P$ določa popolno prirejanje $M$: $$ p_{ij} = 1 \ \Leftrightarrow\ x_i y_j \in M \quad (1 \le i, j \le n) $$ --- ### Problem razvoza z omejitvami Imamo usmerjen utežen graf $G = (V, E)$, kjer je $V$ množica vozlišč in $E$ množica usmerjenih povezav, ter uteži na vozliščih $b_v \in \mathbb{R}$ ($v \in V$), tako da velja $\sum_{v \in V} b_v = 0$, uteži na povezavah $c_{uv} \in \mathbb{R}$ ($uv \in E$), in omejitve na povezavah $d_{uv} \in [0, \infty]$ ($uv \in E$). Problem lahko zapišemo kot linearni program $$ \begin{aligned} \min \ c^\top x \\[1ex] \text{p.p.} \quad A x &= b \\ 0 \le x &\le d, \end{aligned} $$ kjer je $A \in \mathbb{R}^{V \times E}$ incidenčna matrika grafa $G$. Uporabili bomo podoben algoritem kot pri problemu razvoza. **_Definicija._** Naj bo $x$ dopustna rešitev problema razvoza z omejitvami. Potem je (pri rešitvi $x$) povezava $e \in E$ _prazna_, če velja $x_e = 0$, in _nasičena_, če velja $x_e = d_e < \infty$. **_Definicija._** Naj bo $x$ dopustna rešitev problema razvoza z omejitvami. Rešitev $x$ je _drevesna dopustna rešitev_, če obstaja vpeto drevo $T = (V, E')$ v grafu $G = (V, E)$, da velja $\forall e \in E \setminus E': (x_e = 0 \lor x_e = d_e)$ (torej, povezave izven drevesa so prazne ali nasičene). **_Trditev._** Naj bo $x$ drevesna dopustna rešitev problema razvoza z omejitvami za vpeto drevo $T = (V, E')$ v grafu $G = (V, E)$ ter $y$ razvozne cene (tj., $\forall uv \in E': y_u + c_{uv} = y_v$). Če za vsako povezavo $uv \in E \setminus E'$ velja $$ (x_{uv} = 0 \land y_u + c_{uv} \ge y_v) \lor (x_{uv} = d_{uv} \land y_u + c_{uv} \le y_v), $$ potem je $x$ optimalna rešitev. _Dokaz._ Naj bo $x'$ dopustna rešitev problema razvoza z omejitvami. Potem velja $$ \forall uv \in E: \ (y_u + c_{uv} - y_v) x_{uv}' \ge (y_u + c_{uv} - y_v) x_{uv}, $$ saj * če $uv \in E'$, potem $y_u + c_{uv} - y_v = 0$, * če $uv \not\in E'$ in $x_{uv} = 0$, potem $(y_u + c_{uv} - y_v) x_{uv}' \ge 0$, in * če $uv \not\in E'$ in $x_{uv} = d_{uv}$, potem $x_{uv}' \le x_{uv}$ in $y_u + c_{uv} - y_v \le 0$. Če seštejemo za vse povezave, dobimo $$ \begin{alignedat}{3} \sum_{uv \in E} c_{uv} x_{uv}' - \sum_{uv \in E} (y_v - y_u) x_{uv}' &= c^\top x' - (A^\top y)^\top x' &&= c^\top x' - y^\top A x' &&= c^\top x' - y^\top b \\ \sum_{uv \in E} c_{uv} x_{uv} - \sum_{uv \in E} (y_v - y_u) x_{uv} &= c^\top x - (A^\top y)^\top x &&= c^\top x - y^\top A x &&= c^\top x - y^\top b \end{alignedat} $$ Velja torej $c^\top x' \ge c^\top x$. --- **Simpleksna metoda na omrežjih za problem razvoza z omejitvami.** 1. Začnemo z neko drevesno dopustno rešitvijo $x$ na vpetem drevesu $T = (V, E')$: $x_e = 0$ ali $x_e = d_e$ za vsako povezavo $e \in E \setminus E'$. 2. Rešimo sistem $\forall uv \in E': \ y_u + c_{uv} = y_v$ (tj., poiščemo razvozne cene). * Preverimo, ali za vsako povezavo $uv \in E \setminus E'$ velja $x_{uv} = 0$ in $y_u + c_{uv} \ge y_v$ oziroma $x_{uv} = d_{uv}$ in $y_u + c_{uv} \le y_v$. Če velja, je $x$ optimalna rešitev (po prejšnji trditvi). * Sicer obstaja povezava $e = uv \in E \setminus E'$ (_vstopna povezava_ - v edinem ciklu $C$ v grafu $H = (V, E' \cup \{e\})$), za katero velja: - $x_{uv} = 0$ in $y_u + c_e < y_v$: nastavimo $p = \min(\{x_f \mid f \in C \text{ obratna}\} \cup \{d_f - x_f \mid f \in C \text{ prema}\})$ ter premim povezavam povečamo razvoz za $p$, obratnim pa zmanjšamo za $p$; ali - $x_{uv} = d_{uv}$ in $y_u + c_e > y_v$: nastavimo $p = \min(\{x_f \mid f \in C \text{ prema}\} \cup \{d_f - x_f \mid f \in C \text{ obratna}\})$ ter premim povezavam zmanjšamo razvoz za $p$, obratnim pa povečamo za $p$. * Naj bo $f$ povezava v $C$, za katero je dosežena vrednost $p$ (_izstopna povezava_). V novi rešitvi je $f$ prazna ali nasičena in jo odstranimo iz drevesa. * Če je $p = \infty$, potem je problem neomejen. 3. Ponavljamo, dokler ne pridemo do optimalne rešitve (ali ugotovimo, da je problem neomejen). **_Primer._** ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] a [label=-8, xlabel=<<font color="blue">0</font>>] b [label=2, xlabel=<<font color="blue">3</font>>] c [label=3, xlabel=<<font color="blue">&nbsp;&nbsp;&nbsp;&nbsp;1</font>>] d [label=3, xlabel=<<font color="blue">7</font>>] a -> b [taillabel=3, label=<8 <font color="black">&le; 9</font>>, color=red, constraint=false] a -> c [taillabel=1, label=<0 <font color="black">&le; 2</font>>, color=red, style=dashed, xlabel=<<font color="blue">f</font>>] b -> c [taillabel=2, label=<3 <font color="black">&le; 3</font>>, style=bold, color=blue, xlabel=<<font color="blue"> e </font><br></br> 3+2 &gt; 1>, fontcolor=black] b -> d [taillabel=4, label=<3 <font color="black">&le; 4</font>>, color=red] c -> d [taillabel=1, label=<<font color="black"> &le; 5</font>>, xlabel="\n1+1 < 7\n ", color=green, fontcolor=black, constraint=false] } ``` Ker vstopi nasičena povezava, imamo $p = \min\{3, 2-0, 8\} = 2$. Izstopna povezava je obratna, tako da bomo na njej povečali razvoz na $2$ in jo tako zasitili. ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] a [label=-8, xlabel=<<font color="blue">0</font>>] b [label=2, xlabel=<<font color="blue">3</font>>] c [label=3, xlabel=<<font color="blue">&nbsp;&nbsp;&nbsp;&nbsp;5</font>>] d [label=3, xlabel=<<font color="blue">7</font>>] a -> b [taillabel=3, label=<6 <font color="black">&le; 9</font>>, color=red, constraint=false] a -> c [taillabel=1, label=<2 <font color="black">&le; 2</font>>, style=bold] b -> c [taillabel=2, label=<1 <font color="black">&le; 3</font>>, color=red, style=dashed, xlabel=<<font color="blue">f</font>>] b -> d [taillabel=4, label=<3 <font color="black">&le; 4</font>>, color=red] c -> d [taillabel=1, label=<<font color="black"> &le; 5</font>>, xlabel=<<font color="blue">e</font><br></br> 5+1 &lt; 7>, color=blue, fontcolor=black, constraint=false] } ``` Ker vstopi prazna povezava, imamo $p = \min\{5-0, 3, 3-1\} = 2$. Izstopna povezava je prema, tako da bomo na njej povečali razvoz na $2$ in jo tako zasitili. ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] a [label=-8, xlabel=<<font color="blue">0</font>>] b [label=2, xlabel=<<font color="blue">3</font>>] c [label=3, xlabel=<<font color="blue">&nbsp;&nbsp;&nbsp;&nbsp;6</font>>] d [label=3, xlabel=<<font color="blue">7</font>>] a -> b [taillabel=3, label=<6 <font color="black">&le; 9</font>>, color=red, constraint=false] a -> c [taillabel=1, label=<2 <font color="black">&le; 2</font>>, style=bold, xlabel="0+1 < 6 ", fontcolor=black] b -> c [taillabel=2, label=<3 <font color="black">&le; 3</font>>, style=bold, xlabel="3+2 < 6 ", fontcolor=black] b -> d [taillabel=4, label=<1 <font color="black">&le; 4</font>>, color=red] c -> d [taillabel=1, label=<2 <font color="black">&le; 5</font>>, color=red, constraint=false] } ``` Ni več kandidatov za vstop - dobili smo optimalno rešitev s ceno $$ \sum_{e \in E} c_e x_e = 3 \cdot 6 + 1 \cdot 2 + 2 \cdot 3 + 4 \cdot 1 + 1 \cdot 2 = 32 $$ **Opomba.** Lahko se zgodi, da je $e = f$, torej je ista povezava tako vstopna kot izstopna. Tedaj preide iz prazne v nasičeno povezavo ali obratno. ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red] node [label=""] a -> b [label=<2 <font color="black">&le; 3</font>>, color=red] a -> c [label=<<font color="black">&le; 1</font>>, xlabel=<<font color="blue">e = f</font>>, color=blue, style=dashed] c -> b [label=<1 <font color="black">&le; 5</font>>, color=red, constraint=false] } ``` Ker vstopi prazna povezava, imamo $p = \min\{1-0, 5-1, 2\} = 1$. Imamo $e = f$, izstopna povezava je prema in jo tako zasitimo. ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red] node [label=""] a -> b [label=<1 <font color="black">&le; 3</font>>, color=red] a -> c [label=<1 <font color="black">&le; 1</font>>, style=bold] c -> b [label=<2 <font color="black">&le; 5</font>>, color=red, constraint=false] } ``` **Opomba.** Cunninghamovo pravilo (preprečuje "ciklanje"): * izberemo _koren_ $r \in V$; * ko izbiramo izstopno povezavo v ciklu $C$ z vstopno povezavo $e = uv$, določimo vozlišče $z$ na $C$, ki leži na poteh (v drevesu - brez $e$) od $r$ do $u$ oziroma $v$, in za izstopno povezavo izberemo prvega (zadnjega) kandidata na $C$ od $z$ naprej v smeri $uv$, če je ta prazna (nasičena). --- Kako poiščemo začetno drevesno dopustno rešitev oziroma dokažemo, da je problem nedopusten? Uporabimo **dvofazno simpleksno metodo na omrežjih za problem razvoza z omejitvami**. Definiramo pomožni problem: * Izberemo _koren_ $r \in V$. * Za vsako vozlišče $v \in V \setminus \{r\}$: - če $b_v \ge 0$ in povezava $rv$ ne obstaja, jo dodamo; če obstaja in $d_{rv} < b_v$, dodamo še eno tako povezavo; - če $b_v < 0$ in povezava $vr$ ne obstaja, jo dodamo; če obstaja in $d_{vr} < -b_v$, dodamo še eno tako povezavo. * Dobimo nov graf $\tilde{G} = (V, \tilde{E})$. Dodanim povezavam (iz $\tilde{E} \setminus E$) pravimo _umetne povezave_, povezavam iz $E$ pa _prvotne povezave_. * Definiramo nove cene $\tilde{c}$, in sicer - prvotne povezave $e \in E$ imajo ceno $\tilde{c}_e = 0$, in - umetne povezave $e \in \tilde{E} \setminus E$ imajo ceno $\tilde{c}_e = 1$. * Definiramo nove omejitve $\tilde{d}$: - prvotne povezave $e \in E$ imajo nespremenjene omejitve $\tilde{d}_e = d_e$, in - umetne povezave $e \in \tilde{E} \setminus E$ niso omejene: $\tilde{d}_e = \infty$. Pomožni problem je optimalen, optimalna vrednost je $0$ natanko tedaj, ko je prvotni problem dopusten. --- ## Pretoki in prerezi **_Primer._** Letalo iz San Francisca v New York je polno. Imamo pa proste sedeže na drugih letih: * San Francisco - Denver: 5 mest * San Francisco - Houston: 6 mest * Denver - Atlanta: 2 mesti * Denver - Chicago: 5 mest * Houston - Atlanta: 5 mest * Atlanta - New York: 7 mest * Chicago - New York: 4 mesta Koliko dodatnih potnikov lahko prepeljejo? ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 SFO [xlabel=s] JFK [xlabel=t] SFO -> DEN [headlabel=" 5 "] SFO -> IAH [headlabel=" 6 "] DEN -> ATL [headlabel="2 "] DEN -> ORD [headlabel=5] IAH -> ATL [headlabel=5] ATL -> JFK [headlabel=7] ORD -> JFK [headlabel=4] } ``` Imamo usmerjen graf $G = (V, E)$ in pretočnosti $d_e$ za vsako povezavo $e \in E$. Iščemo maksimalni pretok: $$ \forall e \in E: \ 0 \le x_e \le d_e $$ Imamo dve posebni vozlišči: * začetno vozlišče $s$ (angl. _source_) * končno vozlišče $t$ (angl. _terminal_) Predpostavimo, da v $s$ in iz $t$ ne gre nobena povezava. Za ostala vozlišča veljajo Kirchhoffovi zakoni: $$ \forall w \in V \setminus \{s, t\}: \ \sum_{uw \in E} x_{uw} = \sum_{wv \in E} x_{wv} $$ Seštejmo Kirchhoffove zakone po vseh $w \in V \setminus \{s, t\}$: $$ \begin{aligned} \sum_{w \in V \setminus \{s, t\}} \sum_{uw \in E} x_{uw} &= \sum_{w \in V \setminus \{s, t\}} \sum_{wv \in E} x_{wv} \\ \sum_{\substack{e \in E \\ \operatorname{konec}(e) \ne t}} x_e &= \sum_{\substack{e \in E \\ \operatorname{začetek}(e) \ne s}} x_e \end{aligned} $$ _Prostornina pretoka_ je enaka $$ F \quad = \sum_{\substack{e \in E \\ \operatorname{konec}(e) = t}} x_e = \sum_{\substack{e \in E \\ \operatorname{začetek}(e) = s}} x_e $$ Iščemo _pretok_ z maksimalno prostornino: $$ \begin{alignedat}{2} \max &\ & \sum_{\substack{e \in E \\ \operatorname{začetek}(e) = s}} x_e \\[1ex] \text{p.p.} \quad \forall w \in V \setminus \{s, t\}&:& \ \sum_{uw \in E} x_{uw} &= \sum_{wv \in E} x_{wv} \\ \forall uv \in E&:& \ 0 \le x_{uv} &\le d_{uv}, \end{alignedat} $$ To je poseben primer problema razvoza z omejitvami: vzamemo $b_v = 0$ ($v \in V$), $c_e = 0$ ($e \in E$) ter dodamo povezavo $ts$ s $c_{ts} = -1$, $d_{ts} = \infty$. ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] edge [taillabel=0] SFO [xlabel=s] JFK [xlabel="t "] SFO -> DEN [xlabel=<&le; 5>] SFO -> IAH [xlabel=<&le; 6>] DEN -> ATL [xlabel=<&le; 2>] DEN -> ORD [xlabel=<&le; 5>] IAH -> ATL [xlabel=<&le; 5>] ATL -> JFK [xlabel=<&le; 7>] ORD -> JFK [xlabel=<&le; 4>] JFK -> SFO [taillabel=-1, constraint=false] } ``` Ta problem lahko rešimo s simpleksno metodo na omrežjih za problem razvoza z omejitvami. ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] node [label="", fontcolor=blue] SFO [xlabel=0] DEN [xlabel=0] IAH [xlabel=0] ATL [xlabel=0] ORD [xlabel=0] JFK [xlabel=0] SFO -> DEN [taillabel=" 0 ", label=<0 <font color="black">&le; 5</font>>, color=red] SFO -> IAH [taillabel=0, label=<0 <font color="black">&le; 6</font>>, color=red] DEN -> ATL [taillabel=" 0", label=<<font color="black">&le; 2</font>>] DEN -> ORD [taillabel=0, label=<0 <font color="black">&le; 5</font>>, color=red] IAH -> ATL [taillabel=0, label=<0 <font color="black">&le; 5</font>>, xlabel=<<font color="blue">f</font>>, color=red, style=dashed] ATL -> JFK [taillabel=0, label=<0 <font color="black">&le; 7</font>>, color=red] ORD -> JFK [taillabel=0, label=<<font color="black">&le; 4</font>>] JFK -> SFO [taillabel=-1, xlabel=<e<br></br> 0+(-1) &lt; 0>, color=blue, fontcolor=blue, constraint=false] } ``` ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] node [label="", fontcolor=blue] SFO [xlabel=0] DEN [xlabel=0] IAH [xlabel=0] ATL [xlabel=1] ORD [xlabel=0] JFK [xlabel=1] SFO -> DEN [taillabel=" 0 ", label=<0 <font color="black">&le; 5</font>>, color=red] SFO -> IAH [taillabel=0, label=<5 <font color="black">&le; 6</font>>, color=red] DEN -> ATL [taillabel=" 0", label=<<font color="black">&le; 2</font>>, color=green] DEN -> ORD [taillabel=0, label=<0 <font color="black">&le; 5</font>>, color=red] IAH -> ATL [taillabel=0, label=<5 <font color="black">&le; 5</font>>, style=bold] ATL -> JFK [taillabel=0, label=<5 <font color="black">&le; 7</font>>, color=red] ORD -> JFK [taillabel=0, label=<<font color="black">&le; 4</font>>, xlabel="e = f", color=blue, fontcolor=blue, style=dashed] JFK -> SFO [taillabel=-1, label=5, color=red, constraint=false] } ``` ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] node [label="", fontcolor=blue] SFO [xlabel=0] DEN [xlabel=0] IAH [xlabel=0] ATL [xlabel=1] ORD [xlabel=0] JFK [xlabel=1] SFO -> DEN [taillabel=" 0 ", label=<4 <font color="black">&le; 5</font>>, xlabel=<<font color="blue">f</font>>, color=red, style=dashed] SFO -> IAH [taillabel=0, label=<5 <font color="black">&le; 6</font>>, color=red] DEN -> ATL [taillabel=" 0", label=<<font color="black">&le; 2</font>>, xlabel=e, color=blue, fontcolor=blue] DEN -> ORD [taillabel=0, label=<4 <font color="black">&le; 5</font>>, color=red] IAH -> ATL [taillabel=0, label=<5 <font color="black">&le; 5</font>>, style=bold] ATL -> JFK [taillabel=0, label=<5 <font color="black">&le; 7</font>>, color=red] ORD -> JFK [taillabel=0, label=<4 <font color="black">&le; 4</font>>, style=bold] JFK -> SFO [taillabel=-1, label=9, color=red, constraint=false] } ``` ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 edge [fontcolor=red,labelfontcolor=black] node [label=""] SFO [xlabel=<<font color="blue">0</font>>] DEN [xlabel=<<font color="blue">1</font>>] IAH [xlabel=<<font color="blue">0</font>>] ATL [xlabel=<<font color="blue">1</font>>] ORD [xlabel=<<font color="blue">1</font>>] JFK [xlabel=<<font color="blue">1</font>>] SFO -> DEN [taillabel=" 0 ", label=<5 <font color="black">&le; 5</font>>, style=bold] SFO -> IAH [taillabel=0, label=<5 <font color="black">&le; 6</font>>, color=red] DEN -> ATL [taillabel=" 0", label=<1 <font color="black">&le; 2</font>>, color=red] DEN -> ORD [taillabel=0, label=<4 <font color="black">&le; 5</font>>, color=red] IAH -> ATL [taillabel=0, label=<5 <font color="black">&le; 5</font>>, style=bold] ATL -> JFK [taillabel=0, label=<6 <font color="black">&le; 7</font>>, color=red] ORD -> JFK [taillabel=0, label=<4 <font color="black">&le; 4</font>>, style=bold] JFK -> SFO [taillabel=-1, label=10, color=red, constraint=false] } ``` V praksi uporabljamo **Ford-Fulkersonov algoritem**. **_Definicija._** Naj bo $x$ dopustna rešitev za problem maksimalnega pretoka na usmerjenem grafu $G = (V, E)$ s pretočnostmi $d_e$ ($e \in E$) ter začetnim vozliščem $s$ in končnim vozliščem $t$. Rečemo, da je $v_0 v_1 \dots v_k$ ($v_i \in V, 0 \le i \le k$) _povečujoča pot_, če je $v_0 = s$, $v_k = t$ ter, za $1 \le i \le k$, * $v_{i-1} v_i \in E$ in $x_{v_{i-1} v_i} < d_{v_{i-1} v_i}$ (_prema povezava_), ali * $v_i v_{i-1} \in E$ in $x_{v_i v_{i-1}} > 0$ (_obratna povezava_). Ideja: vzamemo povečujočo pot z množico povezav $P$. Pretok na tej poti povečamo za $$ p = \min(\{x_e \mid e \in P \text{ obratna}\} \cup \{d_e - x_e \mid e \in P \text{ prema}\}) $$ (tj., povečamo na premih in zmanjšamo na obratnih povezavah). ```graphviz digraph G { rankdir=LR node [label=""] au [style=invis] ad [style=invis] bu [style=invis] bd [style=invis] cu [style=invis] cd [style=invis] du [style=invis] dd [style=invis] s [xlabel=s] x [style=invis] t [xlabel=t] au -> a -> ad [label=" +p"] bu -> b -> bd [style=invis] bd -> b -> bu [label=" -p", constraint=false] cu -> c [label=" +p"] c -> cd [style=invis] cd -> c [label=" -p", constraint=false] du -> d [style=invis] d -> du [label=" -p", constraint=false] d -> dd [label=" +p"] s -> x -> t [label="+p"] } ``` **_Primer._** ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] SFO [xlabel=s] JFK [xlabel=t] SFO -> DEN [taillabel=1, headlabel=0, color=red] SFO -> IAH [taillabel=2, headlabel=0] DEN -> ATL [taillabel=2, headlabel=0, color=red] DEN -> ORD [taillabel=3, headlabel=0] IAH -> ATL [taillabel=3, headlabel=0] ATL -> JFK [taillabel=1, headlabel=0, color=red] ORD -> JFK [taillabel=2, headlabel=0] } ``` Povečamo pretok na izbrani poti za 1: ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 SFO [label="", xlabel=s] DEN [label=""] IAH [label=""] ATL [label=""] ORD [label=""] JFK [label="", xlabel=t] SFO -> DEN [taillabel=0, headlabel=1, style=bold] SFO -> IAH [taillabel=2, headlabel=0, color=red] DEN -> ATL [taillabel=1, headlabel=1, color=red] DEN -> ORD [taillabel=3, headlabel=0, color=red] IAH -> ATL [taillabel=3, headlabel=0, color=red] ATL -> JFK [taillabel=0, headlabel=1, style=bold] ORD -> JFK [taillabel=2, headlabel=0, color=red] } ``` Najbolj nas omejuje obratna povezava - spet povečamo pretok za $1$: ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] SFO [xlabel=s] JFK [xlabel=t] SFO -> DEN [taillabel=0, headlabel=1, style=bold] SFO -> IAH [taillabel=1, headlabel=1] DEN -> ATL [taillabel=2, headlabel=0] DEN -> ORD [taillabel=2, headlabel=1] IAH -> ATL [taillabel=2, headlabel=1] ATL -> JFK [taillabel=0, headlabel=1, style=bold] ORD -> JFK [taillabel=1, headlabel=1] } ``` Takih poti ni več - imamo optimalno rešitev. --- **_Definicija._** Za problem maksimalnega pretoka na usmerjenem grafu $G = (V, E)$ ter začetnim vozliščem $s$ in končnim vozliščem $t$ je množica $C \subseteq V$ je _prerez_, če velja $s \in C$, $t \not\in C$. Za vsaki vozlišči $u, v \in V$, tako da velja $uv \not\in E$, naj velja $x_{uv} = 0$. Potem lahko Kirchhoffove zakone pišemo kot $$ \forall w \in V \setminus \{s, t\}: \ \sum_{u \in V} x_{uw} = \sum_{v \in V} x_{wv} $$ Seštejmo za vsak $w \in C \setminus \{s\}$: $$ \sum_{\substack{u \in V \\ v \in C \setminus \{s\}}} x_{uv} = \sum_{\substack{u \in C \setminus \{s\} \\ v \in V}} x_{uv} $$ Členi $x_{uv}$, kjer $u, v \in C \setminus \{s\}$, se pojavijo na obeh straneh in se jih lahko znebimo: $$ \sum_{\substack{u \not\in C \setminus \{s\} \\ v \in C \setminus \{s\}}} x_{uv} = \sum_{\substack{u \in C \setminus \{s\} \\ v \not\in C \setminus \{s\}}} x_{uv} $$ Ker $s$ ni končno vozlišče nobene povezave, velja $$ \sum_{\substack{u \in C \\ v \not\in C}} x_{uv} - \sum_{\substack{u \not\in C \\ v \in C}} x_{uv} = \sum_{v \not\in C} x_{sv} + \sum_{\substack{u \in C \setminus \{s\} \\ v \not\in C \setminus \{s\}}} x_{uv} - \left(\sum_{\substack{u \not\in C \setminus \{s\} \\ v \in C \setminus \{s\}}} x_{uv} - \sum_{v \in C} x_{sv}\right) = \sum_{v \in V} x_{sv} = F $$ Prostornina pretoka torej zadošča enakosti $$ F = \sum_{\substack{u \in C \\ v \not\in C}} x_{uv} - \sum_{\substack{u \not\in C \\ v \in C}} x_{uv} $$ Definirajmo še _kapaciteto prereza_ $C$ kot $$ K = \sum_{\substack{u \in C \\ v \not\in C}} d_{uv} $$ **_Trditev_.** Naj bosta $x$ in $C$ pretok s prostornino $F$ in prerez s kapaciteto $K$ za problem maksimalnega pretoka. Potem velja $F \le K$. _Dokaz._ $$ F = \sum_{\substack{u \in C \\ v \not\in C}} x_{uv} - \sum_{\substack{u \not\in C \\ v \in C}} x_{uv} \le \sum_{\substack{u \in C \\ v \not\in C}} d_{uv} - \sum_{\substack{u \not\in C \\ v \in C}} 0 = K $$ **Opomba.** Primerjaj s šibkim izrekom o dualnosti! **_Posledica._** Če velja $F = K$, je $x$ maksimalen pretok, $C$ pa minimalen prerez. Govorimo torej o **problemu maksimalnega pretoka in minimalnega prereza** (angl. _maximal flow/minimal cut_). **_Izrek._** Za problem maksimalnega pretoka in minimalnega prereza velja natanko ena od sledečih možnosti. 1. Problem maksimalnega pretoka je neomejen, kapaciteta vsakega prereza je $\infty$. 2. Obstajata maksimalen pretok $x$ in minimalen prerez $C$, tako da je prostornina $x$ enaka kapaciteti $C$. **Opomba.** Primerjaj s krepkim izrekom o dualnosti! _Dokaz._ Problem maksimalnega pretoka na usmerjenem grafu $G = (V, E)$ s pretočnostmi $d_e$ ($e \in E$) ter začetnim vozliščem $s$ in končnim vozliščem $t$ je dopusten linearni program, saj je ničelni pretok dopustna rešitev. Če je neomejen, po zgornji trditvi ne obstaja prerez s končno kapaciteto (sicer bi imeli zgornjo mejo za prostornino). V nasprotnem primeru naj bo $x$ optimalna drevesna rešitev pridruženega problema razvoza z omejitvami za drevo $T = (V, E')$. Naj bodo $y$ razvozne cene. Ker velja $d_{ts} = \infty$, povezava $ts$ ni nasičena. Ker velja $c_{ts} = -1$, sledi $y_t \ge y_s + 1 > y_s$. Potem je $$ C = \{v \in V \mid y_v \le y_s\} $$ prerez, saj velja $s \in C$ in $t \not\in C$. Določimo prostornino pretoka $x$. * Če $u \in C$, $v \not\in C$, potem $y_u + c_{uv} \le y_s < y_v$, torej $uv \not\in E'$ in $x_{uv} = d_{uv}$ (nasičena povezava). * Če $u \not\in C$, $v \in C$, potem $y_u + c_{uv} > y_s \ge y_v$, torej $uv \not\in E'$ in $x_{uv} = 0$ (prazna povezava). Tako velja $$ F = \sum_{\substack{u \in C \\ v \not\in C}} x_{uv} - \sum_{\substack{u \not\in C \\ v \in C}} x_{uv} = \sum_{\substack{u \in C \\ v \not\in C}} d_{uv} = K $$ Sledi, da je $x$ maksimalni pretok in $C$ minimalni prerez. --- Spomnimo se: povečujoča pot sestoji iz premih povezav, ki niso nasičene, in obratnih povezav, ki niso prazne. Kako najdemo povečujočo pot? Začnemo s $C = \{s\}$, nato pa ponavljamo za vsak $v \in C$: ali obstaja $w \not \in C$, da velja $x_{vw} < d_{vw}$ ali $x_{wv} > 0$ - če obstaja, dodamo $w$ v $C$. * Če v nekem koraku dobimo $t \in C$, smo našli povečujočo pot od $s$ do $t$, tako da lahko povečamo pretok. * Če v nekem koraku tak $w$ ne obstaja, povečujoče poti ni - našli smo maksimalni pretok $x$ in minimalni prerez $C$. Običajno problem pretoka rešujemo na pridruženem grafu: ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 u1 [label=u] v1 [label=v] x1 [style=invis] x2 [style=invis] u2 [label=u] v2 [label=v] u1 -> v1 [taillabel=<d<sub>uv</sub>>] v1 -> x1 [style=invis] x1 -> x2 x2 -> u2 [style=invis] u2 -> v2 [taillabel=<d<sub>uv</sub> - x<sub>uv</sub>>, headlabel=<x<sub>uv</sub>>, arrowhead=none] } ``` **_Primer._** ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] SFO [xlabel=s] JFK [xlabel=t] SFO -> DEN [headlabel=" 0 ", taillabel=5] SFO -> IAH [headlabel=" 0 ", taillabel=6, color=red] DEN -> ATL [headlabel="0 ", taillabel=2] DEN -> ORD [headlabel=0, taillabel=5] IAH -> ATL [headlabel=0, taillabel=<<font color="red">5</font>>, color=red] ATL -> JFK [headlabel=0, taillabel=7, color=red] ORD -> JFK [headlabel=0, taillabel=4] } ``` ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] SFO [xlabel=s] JFK [xlabel=t] SFO -> DEN [headlabel="0 ", taillabel=5, color=red] SFO -> IAH [headlabel="5 ", taillabel=1] DEN -> ATL [headlabel="0 ", taillabel=2] DEN -> ORD [headlabel=0, taillabel=5, color=red] IAH -> ATL [headlabel=5, taillabel=0, style=bold] ATL -> JFK [headlabel=5, taillabel=2] ORD -> JFK [headlabel=0, taillabel=<<font color="red">4</font>>, color=red] } ``` ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] SFO [xlabel=s] JFK [xlabel=t] SFO -> DEN [headlabel=" 4 ", taillabel=<<font color="red">1</font>>, color=red] SFO -> IAH [headlabel=" 5 ", taillabel=1] DEN -> ATL [headlabel="0 ", taillabel=2, color=red] DEN -> ORD [headlabel=4, taillabel=1] IAH -> ATL [headlabel=5, taillabel=0, style=bold] ATL -> JFK [headlabel=5, taillabel=2, color=red] ORD -> JFK [headlabel=4, taillabel=0, style=bold] } ``` ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] SFO [xlabel=s, style=filled] IAH [style=filled] JFK [xlabel=t] SFO -> DEN [headlabel=" 5 ", taillabel=0, style=bold, color=blue] SFO -> IAH [headlabel=" 5 ", taillabel=1] DEN -> ATL [headlabel="1 ", taillabel=1] DEN -> ORD [headlabel=4, taillabel=1] IAH -> ATL [headlabel=5, taillabel=0, style=bold, color=blue] ATL -> JFK [headlabel=6, taillabel=1] ORD -> JFK [headlabel=4, taillabel=0, style=bold] } ``` * Prostornina pretoka: $F = 5 + 5 = 6 + 4 = 10$ * Kapaciteta prereza: $K = 5 + 5 = 10$ Optimalna rešitev: ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] SFO [xlabel=s, style=filled] IAH [style=filled] JFK [xlabel=t] SFO -> DEN [label=5, style=bold, color=blue] SFO -> IAH [label=5] DEN -> ATL [label=1] DEN -> ORD [label=4] IAH -> ATL [label=5, style=bold, color=blue] ATL -> JFK [label=6] ORD -> JFK [label=4, style=bold] } ``` **Opomba.** Ali se Ford-Fulkersonov algoritem vedno ustavi? **NE.** Obstajajo primeri, kjer lahko (če "nerodno" izbiramo povečujoče poti) v neskončno ponavljamo postopek (če so nekatere pretočnosti iracionalne), pri čemer prostornina pretoka konvergira proti številu, ki je manjše od prostornine maksimalnega pretoka. Da zagotovimo, da se algoritem ustavi, v vsakem koraku izberemo najkrajšo povečujočo pot (Edmonds-Karpov algoritem). **Opomba.** Disjunktne povečujoče poti (po povezavah) lahko obravnavamo hkrati, npr. ```graphviz digraph G { rankdir=LR nodesep=0.5 ranksep=1 node [label=""] SFO [xlabel=s] JFK [xlabel=t] SFO -> DEN [headlabel=" 0 ", taillabel=5, color=green] SFO -> IAH [headlabel=" 0 ", taillabel=6, color=red] DEN -> ATL [headlabel="0 ", taillabel=2] DEN -> ORD [headlabel=0, taillabel=5, color=green] IAH -> ATL [headlabel=0, taillabel=<<font color="red">5</font>>, color=red] ATL -> JFK [headlabel=0, taillabel=7, color=red] ORD -> JFK [headlabel=0, taillabel=<<font color="green">4</font>>, color=green] } ```