1. Programowanie liniowe
Transkrypt
1. Programowanie liniowe
Justyna Kosakowska i Piotr Malicki Badania operacyjne (Kurs letni 2009) Materiały dydaktyczne dla studentów I-go roku matematyki Wydział Matematyki i Informatyki Uniwersytet Mikołaja Kopernika Toruń 2009 Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego Podczas przygotowywania niniejszych notatek korzystaliśmy z następującej literatury: [1] M. S. Bazaraa, C. M. Shetty, ”Nonlinear Programming Theory and Algorithms”, New York 1979. [2] T. H. Cormen, Ch. E. Leiserson, R. L. Rivest, „Wprowadzenie do algorytmów”, WN-T, Warszawa 2001. [3] M. M. Sysło, „Algorytmy”, WSiP, Warszawa 1997. [4] M. M. Sysło, N. Deo, J. S. Kowalik, „Algorytmy optymalizacji dyskretnej”, PWN, Warszawa 1995. Literatura uzupełniająca: [1] R. Faure, J.-P. Boss, A. Le Garff, „Badania operacyjne”, PWN 1982. [2] S. I. Gass, „Programowanie liniowe”, PWN 1980. [3] K. Manteuffel, E. Seiffart, „Wstęp do algebry liniowej i programowania liniowego”, PWN 1975. SPIS TREŚCI 3 Spis treści 1 Programowanie liniowe 1.1 Wstęp . . . . . . . . . . . . . . . . . . . . . . . 1.2 Zbiory wypukłe i ich własności . . . . . . . . . . 1.3 Punkty i wektory ekstremalne . . . . . . . . . . 1.4 Metoda sympleksowa . . . . . . . . . . . . . . . 1.4.1 Dualna metoda programowania liniowego 1.5 Elementy programowania całkowitoliczbowego . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 6 12 22 29 31 2 Strategie zachłanne 39 2.1 Problem wyboru zajęć . . . . . . . . . . . . . . . . . . . . . . 40 2.2 Problem plecakowy . . . . . . . . . . . . . . . . . . . . . . . . 42 3 Programowanie dynamiczne 44 3.1 Problem plecakowy - programowanie dynamiczne . . . . . . . 45 4 Grafy - podstawowe definicje 49 4.1 Reprezentacje grafów . . . . . . . . . . . . . . . . . . . . . . . 53 4.1.1 Macierze sąsiedztwa . . . . . . . . . . . . . . . . . . . . 53 4.1.2 Listy sąsiedztwa . . . . . . . . . . . . . . . . . . . . . . 54 5 Minimalne drzewa rozpinające 55 5.1 Algorytm Kruskala . . . . . . . . . . . . . . . . . . . . . . . . 56 6 Problem najkrótszych dróg 60 6.1 Algorytm Dijkstry . . . . . . . . . . . . . . . . . . . . . . . . 61 6.2 Algorytm Bellmana-Forda . . . . . . . . . . . . . . . . . . . . 65 1. PROGRAMOWANIE LINIOWE 4 1. Programowanie liniowe 1.1. Wstęp W roku 1827 matematyk francuski J.B.J. Fourier opublikował metodę rozwiązywania układu nierówności liniowych. Publikacja ta jest zwykle uważana za początek programowania liniowego. W 1939 roku rosyjski matematyk L.V. Kantorovich sformułował problem przydziału środków jako problem programowania liniowego. Mniej więcej w tym samym okresie duński ekonomista T.C. Koopmans sformułował model programowania liniowego dla pewnych klasycznych zagadnień występujących w ekonomii. W czasie trwania II wojny światowej modele programowania liniowego były stosowane do rozwiązywania problemów związanych z planowaniem wojskowym. W roku 1947 matematyk amerykański G.B. Dantzig odkrył metodę sympleks. Zbiegło się to z rozwojem komputeryzacji, a zatem z możliwością zastosowania metod programowania liniowego do rozwiązywania problemów występujących w rzeczywistości. W roku 1975 Kantorovich oraz Koopmans otrzymali za swoje prace nagrodę Nobla w dziedzinie nauk ekonomicznych. Przykład 1.1. Załóżmy, że pewna firma produkuje dwa rodzaje zapałek: grillowe (długie) i normalne (krótkie). Zysk z każdego pudła zapałek grillowych wynosi 300 EUR, a z każdego pudła zapałek normalnych wynosi 200 EUR. Firma posiada jedną maszynę robiącą długie lub krótkie zapałki. Maszyna ta może wyprodukować w jednym roku maksymalnie 900 000 pudeł zapałek długich lub krótkich. Do produkcji zapałek firma potrzebuje drewna oraz pudeł. Do otrzymania jednego pudła zapałek grillowych potrzeba 3 m3 drewna, natomiast do otrzymania jednego pudła zapałek normalnych potrzeba 1 m3 drewna. Firma posiada 1 800 000 m3 drewna na rok następny, ponadto nasza firma ma 700 000 pudeł na zapałki grillowe oraz 600 000 pudeł na zapałki normalne. Naszym celem jest zmaksymalizowanie zysków firmy w roku następnym, przy czym zakładamy, że firma może sprzedać wszystko co wyprodukuje. Zapiszmy powyższy problem za pomocą nierówności. Niech x1 oraz x2 oznaczają odpowiednio ilość pudeł (× 100 000) zapałek długich oraz ilość pudeł (× 100 000) zapałek krótkich wyprodukowanych w roku następnym. Zysk z jednego pudła zapałek długich wynosi 300 EUR (3×100 EUR), zatem zysk z x1 pudeł zapałek długich wynosi 3x1 (stu euro jednostek). Podobnie zysk z x2 1. PROGRAMOWANIE LINIOWE 5 pudeł zapałek krótkich wynosi 2x2 (stu euro jednostek). Przy formułowaniu naszego zagadnienia musimy wziąć pod uwagę następujące ograniczenia: • wydajność maszyny jest ograniczona przez 9 (× 100 000) pudeł na rok, czyli x1 + x2 ≤ 9; • ograniczenie związane z ilością drewna, to 3x1 + x2 ≤ 18; • ograniczenie związane z ilością dostępnych pudeł, to x1 ≤ 7, x2 ≤ 6; • ograniczenie związane z sensownością rozważań, to x1 ≥ 0, x2 ≥ 0. Możemy teraz napisać model dla naszej firmy: max(3x1 + 2x2 ) przy warunkach: x1 + x2 ≤ 9, 3x1 + x2 ≤ 18, x1 ≤ 7, x2 ≤ 6, x1 , x2 ≥ 0. Jest to przykład modelu programowania liniowego (w skrócie PL-modelu). Funkcję 3x1 + 2x2 nazywamy funkcją celu. W dalszej części wypracujemy metody ogólne, pozwalające rozwiązywać podobne problemy. Powyższy problem rozwiążmy graficznie. 1. PROGRAMOWANIE LINIOWE 6 0, v1 , v2 , v3 , v4 nazywamy dopuszczalObszar wyznaczony przez punkty x1 nym, zawiera on punkty spełniające ograniczenia. Same zaś punkty x2 0, v1 , v2 , v3 , v4 nazywamy wierzchołkami obszaru dopuszczalnego. Łatwo 6 4, 5 3 0 policzyć, że v1 = , v2 = , v3 = , v4 = . Zauważmy, że nierów0 4, 5 6 6 ność x1 ≤ 7 nie ma wpływu na obszar dopuszczalny. Szkicując funkcję celu 4, 5 . widzimy, że osiąga ona wartość maksymalną dla wierzchołka v2 = 4, 5 Wartość funkcji celu w tym wierzchołku wynosi 22, 5, zatem maksymalny zysk dla firmy wynosi 22 500 EUR. 1.2. Zbiory wypukłe i ich własności Definicja 1.2. Niepusty zbiór S ⊆ Rn nazywamy wypukłym, jeśli dla dowolnych dwóch elementów x1 , x2 ∈ S oraz dowolnego λ ∈ [0, 1] zachodzi λx1 + (1 − λ)x2 ∈ S. Przykład 1.3. (i) Płaszczyzna w R3 , S = {(x1 , x2 , x3 ) ∈ R3 ; 2x1 + x2 − 3x3 = 7} lub ogólniej hiperpłaszczyzna w Rn , S = {cT x = α}, gdzie 0 6= c ∈ Rn , α ∈ R. (ii) Półprzestrzeń w R3 , S = {(x1 , x2 , x3 ) ∈ R3 ; 2x1 + x2 − 3x3 ≤ 7} lub ogólniej półprzestrzeń w Rn , S = {cT x ≤ α}, gdzie 0 6= c ∈ Rn , α ∈ R. (iii) Zbiór S pochodzący z Przykładu 1.1 1 1 9 x1 3 1 x 18 0 x1 1 2 ∈ R ; S= ≤ . ≥ , 7 x2 x2 1 0 x2 0 0 1 6 Uwaga 1.4. (i) Niech S1 , S2 ⊆ Rn będą zbiorami wypukłymi. Wówczas zbiory S1 + S2 = {x1 + x2 ; x1 ∈ S1 , x2 ∈ S2 }, S1 − S2 = {x1 − x2 ; x1 ∈ S1 , x2 ∈ S2 } są również zbiorami wypukłymi. T (ii) Niech St ⊆ Rn , t ∈ T będą zbiorami wypukłymi. Wówczas zbiór t∈T St jest również wypukły. Definicja 1.5. Niech ∅ = 6 S ⊆ Rn . Otoczką wypukłą zbioru S nazywamy najmniejszy zbiór wypukły w Rn zawierający S i oznaczamy go przez conv (S). 1. PROGRAMOWANIE LINIOWE 7 conv (S) Lemat 1.6. Dowolny zbiór ∅ = 6 S ⊆ Rn posiada otoczkę wypukłą. Dowód. Niech ∅ = 6 S ⊆ Rn , A = {T ∈ RnT ; S ⊆ T, T −wypukły}. Odn notujmy, T ∈A T = conv (S). Mamy T że A 6= ∅, bo R ∈ A. Definiujemy T S ⊆ T ∈A T , bo ∀T ∈A S ⊆ T . Ponadto T ∈A T 6= ∅, ponieważ z założenia S T 6= ∅. Z faktu, że dowolny zbiór T T∈ A jest wypukły, dostajemy że zbiór T ∈A T jest wypukły. Załóżmy, że T ∈A T nie jest najmniejszym zbiorem wypukłymTzawierającym S. Wówczas istnieje zbiór wypukły T0 zawierający S taki, że T ∈A T 6⊆ T0 . Otrzymujemy zatem sprzeczność, bo T0 ∈ A (czyli T T ∈A T ⊆ T0 ). Twierdzenie 1.7. Niech ∅ = 6 S ⊆ Rn . Wówczas x ∈ convP (S) wtedy i tylko wtedy, gdy istnieją x1 , x2 , . . . , xk ∈ S, λ1 , λ2 , . . . , λk ≥ 0, ki=1 λi = 1 P takie, że x = ki=1 λi xi . Dowód. Dla ustalonego ∅ = 6 S ⊆ Rn oznaczmy ( C(S) = x ∈ Rn ; ∃x1 ,x2 ,...,xk ∈S ∃λ1 ,...,λk ≥0,Pk i=1 λi =1 x= k X i=1 λi xi ) . Aby wykazać inkluzję conv (S) ⊂ C(S) wystarczy pokazać, że S ⊂ C(S) oraz że zbiór C(S) jest wypukły. Oczywiście S ⊂ C(S), ponieważ jeśli x ∈ S, to x = 1x (k = 1, λ1 = 1, x1 = x). Pokażemy, że C(S) jest zbiorem wypukłym. Niech v, w ∈ C(S). Istnieją zatem v1 , v2 , . . . , vk , w1 , w2, . . . , wl ∈ S oraz λ1 , λ2 , . . . , λk , µ1 , µ2 , . . . , µl ≥ 0 1. PROGRAMOWANIE LINIOWE 8 Pl Pk Pl Pk takie, że v = i=1 µi = 1. i=1 λi = 1, i=1 µi wi oraz i=1 λi vi , w = Musimy wykazać, że dla dowolnego t ∈ [0, 1], tv + (1 − t)w ∈ C(S). Mamy tv + (1 − t)w = t k X λi vi + (1 − t) i=1 l X µi wi = i=1 k X tλi vi + i=1 l X (1 − t)µi wi . i=1 Jest to kombinacja liniowa wektorów v1 , v2 , . . . , vk , w1 , w2 , . . . , wl ∈ S oraz tλi ≥ 0 dla i = 1, 2, . . . , k, (1 − t)µi ≥ 0 dla i = 1, 2, . . . , l. Ponadto k X tλi + i=1 l X (1 − t)µi = t i=1 k X λi + (1 − t) l X µi = t + 1 − t = 1. i=1 i=1 ostatecznie otrzymujemy, że conv (S) ⊂ C(S). Pozostała nam jeszcze do udowodnienia inkluzja C(S) ⊂ conv (S). Niech S ⊆ T ⊆ Rn będzie dowolnymP zbiorem wypukłym. że C(S) ⊂ T . PPokażemy, k k Weźmy x ∈ C(S), zatem x = i=1 λi xi , xi ∈ S, i=1 λi = 1. Dowód faktu, że x ∈ T przeprowadzimy indukcyjnie ze względu na k. Jeśli k = 1, to x = x1 ∈ S ⊆ T . Czyli x ∈ T . Załóżmy, że x ∈ T dla k − 1. Wówczas x= k X i=1 λi xi = k−1 X λi xi + λk xk = i=1 i=1 (1 − λk ) k−1 X k−1 X i=1 (1 − λk ) λi xi + λk xk = 1 − λk λi xi + λk xk . 1 − λk Możemy założyć, Pk−1że λλi k 6= 1 (w przeciwnym razie k = 1). Zauważmy, że element x′ = i=1 x należy do T , gdyż 1−λk i k−1 X i=1 Pk−1 λi 1 − λk λi = i=1 = =1 1 − λk 1 − λk 1 − λk oraz xi ∈ S. Zatem x = (1 − λk )x′ + λk xk , gdzie x′ ∈ T, xk ∈ S ⊆ T należy do T , ponieważ T jest zbiorem wypukłym. Z dowolności T dostajemy C(S) ⊂ conv (S). Ostatecznie otrzymujemy równość C(S) = conv (S). Definicja 1.8. Otoczkę wypukłą skończonego zbioru {x1 , x2 , . . . , xk } ⊂ R nazywamy wielościanem. Jeśli ponadto wektory x2 −x1 , x3 −x1 , . . . , xk − x1 są liniowo niezależne, to wielościan nazywamy sympleksem. n 1. PROGRAMOWANIE LINIOWE wielościan 9 sympleks Twierdzenie 1.9 (Carathe’odory). Niech ∅ = 6 S ⊆ Rn będzie dowolnym zbiorem. Wówczas x ∈ conv (S) wtedy i tylko wtedy, gdy istnieją x1 , x2 , . . ., xn+1 ∈ S takie, że x ∈ conv ({x1 , x2 , . . . , xn+1 }). Dowód. Oczywiście jeżeli istnieją elementy x1 , x2 , . . . , xn+1 ∈ S takie, że x ∈ conv ({x1 , x2 , . . . , xn+1 }),to x ∈ conv Pk(S). Niech x ∈ conv (S). Wówczas x = i=1 λi xi , przy czym x1 , x2 , . . . , xk ∈ P S, λ1 , λ2 , . . . , λk ≥ 0, ki=1 λi = 1. Jeżeli k ≤ n+1, to odpowiednia implikacja jest prawdziwa z Twierdzenia 1.7. Jeśli k > n + 1, to wektorów x2 − x1 , x3 − n x1 , . . . , xk − x1 jest co najmniej n + 1, zatem są one liniowo Pk zależne (w R ). Dlatego istnieją liczby µi ∈ R, i = 2, 3, . . . , k takie, że i=2 µi (xi − x1 ) = 0 P P oraz ki=2 µ2i 6= 0. Niech µ1 = − ki=2 µi . Wówczas k X µi xi = µ1 x1 + i=1 k X µi xi = − i=2 k X µi x1 + k X µi xi = µi (xi − x1 ) = 0. i=2 i=2 i=2 k X P P Ponadto ki=1 µi = 0 oraz ki=1 µ2i 6= 0. Rozpatrzmy zbiór A = { µλii ; µi > 0}. Zauważmy, że A 6= ∅ (istnieje i ∈ {1, 2, . . . , k}, dla którego µi > 0, ponieważ jeśli dla każdego i ≥ 2, µi ≤ 0, to µ1 > 0). Niech α = min{ λi λs ; µi > 0} = >0 µi µs dla pewnego s ∈ {1, 2, . . . , k}. Mamy x= k X i=1 λi xi + 0 = k X i=1 λi xi − α k X i=1 µi xi = k X (λi − αµi )xi . i=1 1. PROGRAMOWANIE LINIOWE 10 Jeśli µi ≤ 0, to λi − αµi > 0. Jeśli µi > 0, to λµii ≥ µλss = α. Czyli λi − αµi ≥ 0. Ponadto k k k X X X (λi − αµi) = λi − α µi = 1 − α0 = 1. i=1 i=1 i=1 λs µ µs s Równocześnie λs − αµs = λs − = 0. Wobec powyższych zależności Pk x = i=1,i6=s (λi − αµi )xi , czyli x ∈ conv ({(xi )i , 1 ≤ i ≤ k, i 6= s}). Zatem x posiada przedstawienie w postaci wypukłej kombinacji k − 1 elementów ze zbioru S. Jeżeli k − 1 > n + 1, to postępujemy analogicznie. Proces ten kontynuujemy, dopóty dopóki x nie okaże się wypukłą kombinacją n + 1 elementów ze zbioru S. Twierdzenie 1.10. Niech S ⊆ Rn będzie zbiorem wypukłym takim, że S = S oraz niech y 6∈ S. Wówczas istnieje dokładnie jeden punkt x ∈ S taki, że odległość y od x jest minimalna, tzn. ||y − x|| = minx∈S {||y − x||}. Ponadto punkt x jest jedynym punktem zbioru S spełniającym nierówność: (x − x)T (x − y) ≥ 0 dla wszystkich x ∈ S. Dowód. Niech γ = inf x∈S {||y − x||}. Ponieważ zbiór S jest domknięty, to γ > 0. Rzeczywiście, gdyby γ = 0, to istniałby ciąg (xn ) ⊂ S taki, że limn→∞ xn = y, czyli y ∈ S i w konsekwencji y ∈ S, co daje sprzeczność. Wobec tego istnieje ciąg (xn ) ⊂ S taki, że limn→∞ ||xn − y|| = γ. Pokażemy, że ciąg (xn ) jest zbieżny. Niech k, n ∈ N. Mamy ||xk −xn ||2 = ||xk −y−(xn −y)||2 = 2||xk −y||2 +2||y−xn ||2 −||xk +xn −2y||2 = 2 xk + xn 2 2 − y . 2||xk − y|| + 2||xn − y|| − 4 2 x +x n k n − y 2 ≥ γ 2 . Ponieważ xk , xn ∈ S, to xk +x ∈ S. Z określenia γ mamy 2 2 Stąd ||xk − xn ||2 ≤ 2||xk − y||2 + 2||xn − y||2 − 4γ 2 . Wiemy, że limk→∞ ||xk − y|| = γ, czyli limk→∞ ||xk − y||2 = γ 2 . Istnieje zatem N takie, że dla m ≥ N ε ||xm − y||2 < γ 2 + . 4 Stąd dla k, n ≥ N ||xk − xn ||2 < 2γ 2 + ε ε + 2γ 2 + − 4γ 2 = ε. 2 2 1. PROGRAMOWANIE LINIOWE 11 Zatem (xn ) jest ciągiem Cauchy’ego. Z zupełności Rn dostajemy, że ciąg (xn ) jest zbieżny. Niech x = limn→∞ xn , odnotujmy że x ∈ S, ponieważ S = S. Mamy ||y − x|| = ||y − lim xn || = lim ||y − xn || = γ. n→∞ n→∞ Aby pokazać jedyność załóżmy, że istnieje element x′ ∈ S taki, że ||y − x′ || = ′ γ. Pokażemy, iż x′ = x. Ponieważ zbiór S jest wypukły, to x+x ∈ S. Mamy 2 ′ ′ y − x + x = y − x + y − x ≤ 1 ||y − x|| + 1 ||y − x′ || = γ. 2 2 2 2 2 2 2 ′ = γ, ale Z określenia γ wynika, że y − x+x 2 2 x + x′ + ||x′ − x||2 = 2||y − x||2 + 2||y − x′ ||2 . 4 y − 2 Czyli 4γ 2 + ||x′ − x||2 = 2γ 2 + 2γ 2 , a zatem ||x′ − x|| = 0 i x′ = x. Pokażemy teraz, że (x − x)T (x − y) ≥ 0 dla dowolnego x ∈ S. Weźmy x ∈ S, wówczas ||y −x||2 ≤ ||y −x||2 (x jest najbliżej y). Zbiór S jest wypukły oraz x, x ∈ S zatem dla λ ∈ [0, 1], λx + (1 − λ)x ∈ S. Mamy ponadto ||y − x||2 ≤ ||y − x − λ(x − x)||2 = ||y − x||2 + λ2 ||x − x||2 + 2λ(y − x)T (x − x). Stąd λ2 ||x − x||2 + 2λ(x − x)T (x − y) ≥ 0 i dla λ > 0, λ||x − x||2 + 2(x − x)T (x − y) ≥ 0. Gdy λ zmierza do zera otrzymujemy (x − x)T (x − y) ≥ 0. Pokażemy teraz, że x jest jedynym punktem spełniającym powyższą nierówność. Niech x′ ∈ S oraz niech dla dowolnego x ∈ S zachodzi (x−x′ )T (x′ − y) ≥ 0. Wówczas ||y − x||2 = ||y − x′ + x′ − x||2 = ||y − x′ ||2 + ||x′ − x||2 + 2(y − x′ )T (x′ − x). Ponieważ ||x′ − x||2 ≥ 0 oraz (x − x′ )T (x′ − y) ≥ 0, to ||y − x||2 ≥ ||y − x′ ||2 dla dowolnego x ∈ S. Zatem ostatecznie x′ = x, bo tylko x posiada tę własność. Twierdzenie 1.11. Niech S ⊆ Rn będzie wypukłym i domkniętym zbiorem oraz niech y 6∈ S. Wówczas istnieje wektor c ∈ Rn oraz α ∈ R takie, że cT y > α oraz cT x ≤ α dla każdego x ∈ S. 1. PROGRAMOWANIE LINIOWE 12 Dowód. Z Twierdzenia 1.10 wiemy, że istnieje w zbiorze S taki element x, że ||y −x|| = minx∈S ||y −x|| oraz dla dowolnego x ∈ S, (x−x)T (y −x) ≤ 0. Stąd xT (y − x) ≤ xT (y − x), ||y − x||2 = (y − x)T (y − x) = y T (y − x) − xT (y − x) ≤ y T (y − x) − xT (y − x) = (y − x)T (y − x) = cT (y − x), gdzie c = y − x 6= 0. Mamy cT y ≥ cT x + ||y − x||2 dla dowolnego x ∈ S. Niech α = sup{cT x; x ∈ S}, wówczas cT y ≥ α + ||y − x||2 > α oraz cT x ≤ α z definicji α. 1.3. Punkty ekstremalne i wektory kierunkowe ekstremalne Niech X ⊂ Rn będzie zbiorem wypukłym. Punkt x ∈ X nazywamy ekstremalnym, jeśli ∀x,y∈X ∀λ∈(0,1) p = (1 − λ)x + λy ⇒ x = y = p. Przykład 1.12. Oznaczmy przez E zbiór punktów ekstremalnych zbioru X. 9 1 1 0 x 18 x 3 1 x1 1 1 2 pocho≥ ≤ , ∈ R ; (i) Dla zbioru X = 0 x2 7 1 0 x2 x2 1 6 0 0 3 4, 5 6 0 . , , , , dzącego z Przykładu 1.1, E = 6 6 4, 5 0 0 (ii) X = {(x1 , x2 ) ∈ R2 ; x21 + x22 ≤ 1}, E = {(x1 , x2 ) ∈ R2 ; x21 + x22 = 1}. Jeśli zbiór X jest domknięty i ograniczony, to dowolny punkt tego zbioru może być przedstawiony jako wypukła kombinacja punktów ekstremalnych. Wektor 0 6= v ∈ Rn nazywamy kierunkowym zbioru X, jeśli ∀x∈X ∀λ≥0 x + λv ∈ X. Dwa wektory kierunkowe v, w zbioru X nazywamy równymi, jeśli ∃λ>0 v = λw. 1. PROGRAMOWANIE LINIOWE 13 Wektor kierunkowy v zbioru X nazywamy ekstremalnym, jeżeli ∀w1 ,w2 ∀λ1 ,λ2 >0 v = λ1 w1 + λ2 w2 ⇒ ∃λ>0 w1 = λw2 , gdzie w1 , w2 są wektorami kierunkowymi zbiory X. W dalszej części rozważać będziemy zbiory X postaci X = {x ∈ Rn ; Ax = b, x ≥ 0}, gdzie A oznacza macierz wymiaru m × n, b ∈ Rm . Zakładamy ponadto, że rz(A) = m. Niech A = [BN] (po ewentualnej permutacji kolumn), gdzie B jest m × m macierzą, N jest m × (n − m) macierzą, natomiast rz (B) = m. Wtedy Ax = b, x ≥ 0 ⇒ BxB + NxN = b, gdzie xB ≥ 0, xN ≥ 0. Niech A będzie jak wyżej. Wówczas przez C(A) oznaczamy zbiór takich macierzy nieosobliwych B wymiaru m × m, dla których istnieje macierz N wymiaru m × (n − m) taka, że [BN] da się uzyskać z macierzy A poprzez przestawienie kolumn. Twierdzenie 1.13 (o charakteryzacji punktów ekstremalnych). Niech X = {x ∈ Rn ; Ax = b, x ≥ 0}, gdzie A ∈ Mm×n (R), b ∈ Rm , rz(A) = m. Punkt x ∈ X jest punktem ekstremalnym wtedy i tylko wtedy, gdy x = −1 B b x = B dla pewnego B ∈ C(A) takiego, że B −1 b ≥ 0. 0 xN −1 B b −1 Dowód. Weźmy B ∈ C(A) takie, że B b ≥ 0. Niech x = . Za0 −1 B b uważmy, że x ∈ X. Rzeczywiście dla A = [BN] mamy Ax = [BN] = 0 b + N0 = b, zarazem x ≥ 0. Załóżmy, że x = λx1 + (1 − λ)x2 dla x1 , x2 ∈ X oraz λ ∈ (0, 1). Niech xT1 = [xT11 , xT12 ], xT2 = [xT21 , xT22 ]. Wtedy −1 B b x11 x =λ + (1 − λ) 21 . 0 x12 x22 Ponieważ x12 , x22 ≥ 0, λ ∈ (0, 1), λ, 1 − λ > 0, to mamy x12 = x22 = 0. Ponadto, b = Ax1 = Bx11 , a więc x11 = B −1 b. Podobnie x21 = B −1 b. Wobec równości x11 = x21 = B −1 b mamy x1 = x2 = x, zatem x jest punktem ekstremalnym w X. 1. PROGRAMOWANIE LINIOWE 14 Niech teraz x ∈ Rn będzie punktem ekstremalnym. Załóżmy, że x = [x1 , x2 , . . . , xk , 0, 0, . . . , 0]T , gdzie xi > 0 dla i = 1, 2, . . . , k. Pokażemy, że kolumny a1 , a2 , . . . , ak są liniowo GdybyP tak nie było, to istniałyby Pk niezależne. 2 liczby λ1 , λ2 , . . . , λk ∈ R, i=1 λi 6= 0 takie, że ki=1 λi ai = 0. Niech λ = [λ1 , λ2 , . . . , λk , 0, 0, . . . , 0]T . Rozpatrzmy wektory x(1) = x + rλ, x(2) = x − rλ, gdzie r > 0, x(1) , x(2) ≥ 0. Zauważmy, że Ax(i) = k X j=1 aj (xj + (−1)i−1 rλj ) = k X aj xj + (−1)i−1 r j=1 k X aj λj = b. j=1 Zatem x(1) , x(2) ∈ X, a ponieważ r > 0, to x(1) 6= x(2) . Ponadto x = 12 x(1) + 1 (2) x , co przeczy temu, że x jest punktem ekstremalnym. Zatem kolumny 2 a1 , a2 , . . . , ak są liniowo niezależne. Czyli z n − k kolumn można wybrać m − k kolumn tak, aby razem z pierwszymi k kolumnami tworzyły m liniowo niezależnych wektorów. Załóżmy, że tymi kolumnami są ak+1 , ak+2, . . . , am . Wobec tego macierz A może być zapisana w postaci A = [BN], gdzie B = [a1 , a2 , . . . , am ] ∈ C(A), rz (B) = m. −1 Mamy b = Ax = BxB + NxN = BxB , a B b stąd xB = B −1 b, czyli x = . 0 Wniosek 1.14. Niech X = {x ∈ Rn ; Ax = b, x ≥ 0}, gdzie A ∈ Mm×n (R), b ∈ Rm , rz (A) = m. Zbiór X posiada skończenie wiele punktów ekstremalnych. Dowód. Wynika z faktu, że |C(A)| < ∞. Twierdzenie 1.15 (o istnieniu punktów ekstremalnych). Niech X = {x ∈ Rn ; Ax = b, x ≥ 0}, gdzie A ∈ Mm×n (R), b ∈ Rm , rz (A) = m. Wówczas niepusty zbiór X posiada co najmniej jeden punkt ekstremalny. Dowód. Ustalmy x ∈ X. Niech x = [x1 , x2 , . . . , xk , 0, 0, . . . , 0]T , gdzie xi > 0, i = 1, 2, . . . , k. Rozpatrzmy kolumny a1 , a2 , . . . , ak macierzy A. Gdy są one liniowo niezależne, to punkt x jest ekstremalny. Załóżmy, że aP 1 , a2 , . . . , ak są liniowo zależne, to znaczy istnieją liczby λ1 , λ2 , . . . , λk ∈ R, ki=1 λ2i 6= 0 P x oraz ki=1 λi ai = 0. Niech r = mini=1,2,...,k { λxii ; λi > 0} = λjj . Możemy założyć, że zbiór i ∈ {1, 2, . . . , k} takich, że λi > 0 jest niepusty. Niech x′ ∈ Rn , gdzie xi − rλi dla i = 1, 2, . . . , k ′ xi = 0 dla i = k + 1, k + 2, . . . , n 1. PROGRAMOWANIE LINIOWE 15 1. x′ ≥ 0, bo inaczej dla pewnego j ∈ {1, 2, . . . , k} mielibyśmy xj − rλj < x 0, a stąd r > λjj i otrzymujemy sprzeczność z minimalnością. P P P 2. Ax′ = b, rzeczywiście Ax′ = ki=1 (xi −rλi )ai = ki=1 xi ai −r ki=1 λi ai = Ax = b. Zatem x′ ∈ X. 3. x′i0 = 0 dla pewnego indeksu i0 ∈ {1, 2, . . . , k}. Wiemy, że istnieje x i0 ∈ {1, 2, . . . , k} taki, że r = λii0 . Zatem x′i0 = xi0 − rλi0 = 0. 0 Jeśli kolumny a1 , a2 , . . . , ak bez ai0 są liniowo niezależne, to punkt x′ jest ekstremalny. Lemat 1.16. Niech X = {x ∈ Rn ; Ax = b, x ≥ 0}, gdzie A ∈ Mm×n (R), b ∈ Rm , rz (A) = m. Wektor v ∈ Rn jest wektorem kierunkowym niepustego zbioru X wtedy i tylko wtedy, gdy Av = 0 i v ≥ 0, v 6= 0. Dowód. Niech v ∈ Rn będzie wektorem kierunkowym zbioru X. Weźmy x ∈ X, wtedy x+v ∈ X. Mamy Av = A(x+v−x) = A(x+v)−Ax = b−b = 0, bo v ≥ 0 jest wektorem kierunkowym. Załóżmy teraz, że Av = 0, v ≥ 0. Niech x ∈ X, λ > 0. Mamy A(x+ λv) = Ax + λAv = Ax = b. Ponieważ x ≥ 0, λ > 0, v ≥ 0, to x + λv ≥ 0 czyli x + λv ∈ X. Twierdzenie 1.17 (o charakteryzacji kierunków ekstremalnych). Niech X = {x ∈ Rn ; Ax = b, x ≥ 0}, gdzie A ∈ Mm×n (R), b ∈ Rm , rz (A) = m. Wektor v jest kierunkiem ekstremalnym zbioru X wtedy i tylko wtedy, gdy istnieją B ∈ C(A), kolumna aj macierzy A nie występująca w macierzy B oraz λ > 0 takie, że (i) B −1 aj ≤ 0, (ii) v = λ((−B −1 aj )T , eTj )T , gdzie ej jest wektorem mającym n − m współrzędnych z których tylko j-ta współrzędna jest różna od zera i równa się jeden. Dowód. Niech v = λ((−B −1 aj )T , eTj )T i B −1 aj ≤ 0. Pokażemy, że v jest wektorem kierunkowym. Zauważmy, że v ≥ 0, v 6= 0 oraz −B −1 aj Av = [BN]λ = λB(−B −1 aj ) + λNej = λ(−aj + aj ) = 0. ej Zatem na mocy Lematu 1.16 wektor v jest kierunkowy. Niech v1 , v2 będą wektorami kierunkowymi oraz niech v = λ1 v1 + λ2 v2 , gdzie λ1 , λ2 > 0. Zauważmy, że n − m − 1 współrzędnych wektora v jest 1. PROGRAMOWANIE LINIOWE 16 równe 0. Zatem odpowiednie współrzędne wektorów v1 i v2 są również zerowe T T i wektory te mogą być zapisane w postaci v1T = α1 [v11 , eTj ], v2T = α2 [v21 , eTj ], gdzie α1 , α2 > 0. Wiemy, że Av1 = Av2 = 0 zatem mamy T T T , eTj ]T = α1 (Bv11 + NeTj ) = α1 (Bv11 + aTj ), 0 = Av1 = [BN]α1 [v11 stąd v11 = −B −1 aj . Podobnie v21 = −B −1 aj , mamy więc v11 = v21 , a w konsekwencji v1 = λv2 , gdzie λ = αα12 . Ostatecznie otrzymujemy, że wektor v jest ekstremalny. Niech v będzie wektorem ekstremalnym, v = [v1 , v2 , . . . , vk , 0, . . . , 0, vj , 0, . . . , 0]T , vi > 0 dla i = 1, 2, . . . , k oraz i = j. Pokażemy, że kolumny a1 , a2 , . . . , ak macierzy A są liniowo P niezależne. Załóżmy, że tak nie jest tzn. Pk k 2 istnieją λ1 , λ2 , . . . , λk ∈ R takie, że i=1 λi 6= 0, i=1 λi ai = 0. Niech λ = [λ1 , λ2 , . . . , λk , 0, 0, . . . , 0]T . Rozpatrzmy wektory v (1) = v + rλ, v (2) v = v − rλ, gdzie r > 0, v (1) , v (2) ≥ 0, r = mini=1,2,...,k { λvii ; λi > 0} = λjj . Zauważmy, że Av (i) = A(v + (−1)i−1 rλ) = Av + (−1)i−1 rAλ = 0 + (−1)i−1 r k X ai λi = 0, i=1 Ponieważ r > 0, to v (1) 6= v (2) 6= v. Zatem v = 21 v (1) + 21 v (2) , co przeczy temu, że v jest wektorem ekstremalnym. Czyli kolumny a1 , a2 , . . . , ak są liniowo niezależne. Dodatkowo rz (A) = m, stąd k ≤ m więc możemy wybrać m − k wektorów ze zbioru {ai ; i = k + 1, k + 2, . . . , m, i 6= j}, które razem z kolumnami a1 , a2 , . . . , ak są liniowo niezależne. Oznaczmy B = [a1 , a2 , . . . , am ] ∈ C(A). Zauważmy, że aj 6∈ B, bo a1 , a2 , . . . , ak , aj są liniowo zależne. Mamy 0 = Av = [BN]v = BvB + NvN = BvB + aj vj , a stąd vB = vj (−B −1 aj ), −1 −B aj czyli v = vj . Ponieważ v ≥ 0, vj > 0 więc B −1 aj ≤ 0. ej Wniosek 1.18. Niech X = {x ∈ Rn ; Ax = b, x ≥ 0}, gdzie A ∈ Mm×n (R), b ∈ Rm , rz (A) = m. Zbiór X posiada skończenie wiele kierunków ekstremalnych. Twierdzenie 1.19 (o reprezentacji). Niech X = {x ∈ Rn ; Ax = b, x ≥ 0}, gdzie A ∈ Mm×n (R), b ∈ Rm , rz (A) = m. Niech x1 , x2 , . . . , xk będą wszystkimi punktami ekstremalnymi zbioru X, natomiast v1 , v2 , . . . , vl wszystkimi wektorami ekstremalnymi zbioru X. Wówczas x ∈ X wtedy i tylko 1. PROGRAMOWANIE LINIOWE 17 wtedy, gdy istnieją takie liczby λ1 , λ2 , . . . , λk ≥ 0, których suma jest równa jeden oraz takie liczby µ1 , µ2, . . . , µl ≥ 0, że x= k X λi xi + i=1 l X µi vi . i=1 Dowód. Niech n Y = {x ∈ R ; ∃λ1 ,λ2 ,...,λk ≥0, Pk i=1 λi =1 , ∃µ1 ,µ2 ,...,µl ≥0 x= k X i=1 λi xi + l X µi vi }. i=1 Pokażemy, że X = Y . Zauważmy, że Y 6= ∅, bo z twierdzenia 1.15 istnieje co najmniej jeden punkt ekstremalny. P P P (i) Y ⊂ X. Niech x ∈ Y , x = ki=1 λi xi + li=1 µi vi , λi , µj ≥ 0, ki=1 λi = Pk ′ 1, i = 1, 2, . . . , k, j = 1, 2, . . . , l. Mamy x′ = i=1 λi xi ∈ X. Niech xi = ′ ′ ′ ′ ′ xi−1 + µi vi , gdzie x0 = x . Wówczas ∀i xi ∈ X czyli x = xl ∈ X. (ii) X ⊂ Y . Zauważmy, że Y jest wypukły i domknięty. Załóżmy, że X \ Y 6= ∅ i niech z ∈ X \ Y , czyli z 6∈ Y . Na mocy Twierdzenia 1.11 istnieją wówczas: wektor p ∈ Rn i α > 0 takie, że pT z > α oraz T (∗) p ( k X i=1 λi xi + l X µi vi ) ≤ α, i=1 Pk dla dowolnych λi , µj takich, że i=1 λi = 1, λi , µj ≥ 0, i = 1, 2, . . . , k, j = 1, 2, . . . , l. Ponieważ µj można wybrać dowolnie duże, to nierówność (∗) jest prawdziwa tylko wtedy, gdy pT vi ≤ 0 dla i = 1, 2, . . . , l. Kładąc µi = 0 dla wszystkich i, λi = 1 i λj = 0 dla j 6= i dostajemy z (∗), że pT xi ≤ α dla i = 1, 2, . . . , k. Ponieważ pT z > α, to pT z > pT xi dla dowolnego i. Z powyższych rozważań wynika, że istnieje niezerowy wektor p, dla którego zachodzą następujące nierówności: (∗∗) pT z > pT xi dla i = 1, 2, . . . , k, (∗ ∗ ∗) pT vi ≤ 0 dla i = 1, 2, . . . , l. Rozważmy punkt ekstremalny x określony następująco: pT x = max pT xi . 1≤i≤k 1. PROGRAMOWANIE LINIOWE 18 B −1 b , Ponieważ x jest punktem ekstremalnym, to z Twierdzenia 1.13 x = 0 gdzie A = [BN] oraz B −1 b ≥ 0. Ponieważ z ∈ X, to Az = b oraz z ≥ 0. Zatem BzB + NzN = b i zB = B −1 (b − NzN ) = B −1 b − B −1 NzN . Niech T z T = [zBT , zN ]. Z (∗∗) mamy pT z − pT x > 0, ponadto niech pT = [pTB , pTN ]. Wówczas 0 < pT z − pT x = pTB zB + pTN zN − pTB xB − pTN xN = pTB (B −1 b − B −1 NzN )+ pTN − pTB B −1 b = pTB B −1 b − pTB B −1 NzN + pTN − pTB B −1 b = (pTN − pTB B −1 N)zN , bo zN ≥ 0, z ∈ X. Wobec tego istnieje indeks i0 > m taki, że zi0 > 0 oraz pi0 − pTB B −1 ai0 > 0. Pokażemy, że nierówność B −1 ai0 ≤ 0 nie jest prawdziwa. Załóżmy, że B −1 ai0 ≤ 0. Wówczas viT0 = ((−B −1 ai0 )T , eTi0 ), gdzie ei0 jest wektorem o n − m współrzędnych z jedynką (jako jedynym niezerowym elementem) na miejscu o indeksie i0 , jest ekstremalnym wektorem kierunkowym zbioru X na mocy Twierdzenia 1.17. Z (∗ ∗ ∗) wynika, że pT vi0 ≤ 0 czyli pi0 − pTB B −1 ai0 ≤ 0, co daje sprzeczność. Zatem B −1 ai0 6≤ 0. Zdefiniujmy wektor x następująco: −1 −B −1 ai0 B b , +λ x= ei0 0 gdzie λ = min1≤i≤m { ybii ; yij > 0} = ybrr > 0, b = B −1 b, yi0 = B −1 ai0 . j j Zauważmy, że x posiada nie więcej niż m dodatnich współrzędnych oraz xr = 0, xi0 = λ. Wektor x ∈ X, ponieważ mamy Ax = [BN]x = BB −1 b + λ(−BB −1 ai0 + Nei0 ) = BB −1 b = b. Zauważmy, że układ a1 , a2 , . . . , ar−1 , ar+1 , ar+2 , . . . , am , ai0 jest liniowo niezależny. Mamy yi0 = B −1 ai0 zatem ai0 = Byi0 . Wówczas ai0 = α1 a1 + α2 a2 + · · · + αm am oraz αr 6= 0. Zatem zbiór wektorów {a1 , a2 , . . . , am }\{ar }, ai0 jest liniowo niezależny. Niech B = [a1 , a2 , . . . , ar−1 , ar+1 , ar+2 , . . . , am , ai0 ]. Mamy B ∈ C(A), A = [B, N], b = Ax = [B, N]x = BxB + N xN = BxB . 1. PROGRAMOWANIE LINIOWE 19 B −1 b i z Twierdzenia 1.13 x jest punktem Stąd xB = B b ≥ 0. Zatem x = 0 ekstremalnym. Ponadto b − λyi0 T T T p x = [pB , pN ] = pTB (b − λyi0 ) + pTN λei0 = pTB b − λpTB yi0 + λpi0 = λei0 −1 = pTB B −1 b + λ(pi0 − pTB B −1 ai0 ) = pTB x + λ(pi0 − pTB B −1 ai0 ). Ponieważ λ > 0 oraz pi0 −pTB B −1 ai0 > 0, to pT x > pT xi0 . Zatem skonstruowaliśmy punkt ekstremalny x, dla którego pT x > pT x, co daje sprzeczność, ponieważ pT x = max1≤i≤k pT xi . Wniosek 1.20 (o istnieniu kierunkowych wektorów ekstremalnych). Niech X = {x ∈ Rn ; Ax = b, x ≥ 0}, gdzie A ∈ Mm×n (R), b ∈ Rm , rz(A) = m. Wówczas X posiada kierunkowy wektor ekstremalny wtedy i tylko wtedy, gdy X jest nieograniczony. Dowód. Oczywiście jeśli zbiór X posiada kierunkowy wektor ekstremalny, to X jest nieograniczony. Pokażemy implikację przeciwną. W tym celu załóżmy, żePX nie posiada Pk kierunkowych wektorów ekstremalnych. Niech k x ∈ X, x = i=1 λi xi , i=1 λi = 1, λi ≥ 0 oraz niech x1 , x2 , . . . , xk będą punktami ekstremalnymi. Mamy k x k=k k X i=1 λi xi k≤ k X i=1 |λi | k xi k≤ max {k xi k}. 1≤i≤k Zatem X jest ograniczony. Otrzymana sprzeczność dowodzi, że zbiór X posiada kierunkowy wektor ekstremalny. Twierdzenie 1.21. Niech X = {x ∈ Rn ; Ax = b, x ≥ 0}, gdzie A ∈ Mm×n (R), b ∈ Rm , rz (A) = m i niech x1 , x2 , . . . , xk będą wszystkimi punktami ekstremalnymi, zaś v1 , v2 , . . . , vl wszystkimi wektorami ekstremalnymi zbioru X, c ∈ Rn . Wówczas inf{cT x; x ∈ X} ∈ R ⇔ ∀j=1,2,...,l cT vj ≥ 0. Jeżeli ∀j=1,2,...,l cT vj ≥ 0, to ∃i∈{1,2,...,k} inf{cT x; x ∈ X} = cT xi . Dowód. Z Twierdzenia 1.19 wiemy, że dowolny P element x spełnia waP runki Ax = b, x ≥ 0 wtedy i tylko wtedy, gdy x = ki=1 λi xi + lj=1 µj vj , Pk λi = 1, i = 1, 2, . . . , k, j = 1, 2, . . . , l. Zatem cT x = λi , µj ≥ 0, i=1 P P P k l cT ( i=1 λi xi + j=1 µj vj ), gdzie λi , µj ≥ 0, ki=1 λi = 1, i = 1, 2, . . . , k, 1. PROGRAMOWANIE LINIOWE 20 j = 1, 2, . . . , l. Jeśli dla pewnego j, cT vj < 0, to nasze wyrażenie jest nieograniczone, ponieważ µj możemy wybrać dowolnie duże. Zatem inf{cT x; x ∈ X} ∈ R wtedy i tylko wtedy, gdy cT vj ≥ 0 dla dowolnego j = 1, 2, . . . , l. Jeśli cT vj ≥ 0 dla dowolnego j = 1, 2, . . . , l, to w celu osiągnięcia najmniejszej wartości możemy przyjąć µj = 0 dla j = 1, 2, . . . , l. Zatem T inf{c ( k X λi xi + i=1 l X j=1 µj vj )} = inf{c T k X i=1 λi xi ; λi ≥ 0, k X λi = 1}. i=1 Niech λi0 = 1 oraz λi = 0 dla i 6=Pi0 , gdzie indeks i0 jest taki, że cT xi0 = min1≤i≤k {cT xi }. Wówczas cT xi0 ≤ ki=1 λi cT xi , co kończy dowód. Niech X = {x ∈ R; Ax = b, x ≥ 0}, gdzie A ∈ Mm×n (R), b ∈ Rm , rz (A) = m. Zajmiemy się szukaniem inf{cT x; x ∈ X}. Niech x będzie punktem ekstremalnym zbioru X. Z Twierdzenia 1.13 wiemy, że istnieje B ∈ C(A), −1 xB B b −1 . . Weźmy dowolny x ∈ X, x = B b ≥ 0 oraz A = [BN], x = xN 0 x Wówczas Ax = b tzn. [BN] B = b, skąd dostajemy BxB + NxN = b. xN −1 −1 Zatem xB = B b − B NxN . Policzmy cT x cT x = cTB xB + cTN xN = cT B −1 b − cTB B −1 NxN + cTN xN = cTB xB + cTN xN + −cTB B −1 NxN + cTN xN = cT x + (cTN − cTB B −1 N)xN . Przypadek 1: cTN − cTB B −1 N ≥ 0. Ponieważ x ≥ 0, to xN ≥ 0 i w konsekwencji cT x ≥ cT x. Zatem x jest szukanym punktem. Przypadek 2: cTN − cTB B −1 N 6≥ 0. W szczególności niech dla pewnego indeksu j będzie cTj − cTB B −1 aj < 0 (stąd cT x < cT x). Przypadek 2a: 1. PROGRAMOWANIE LINIOWE 21 −B −1 aj Zakładamy, że B aj ≤ 0. Wówczas biorąc vj = , gdzie ej jest ej wektorem o n − m współrzędnych mającym jedynkę na miejscu j, a na pozostałych miejscach zero, otrzymujemy kierunkowy wektor ekstremalny. Wobec tego x = x + vj , x ∈ X. Z równości cT x = cT x + cT vj oraz cT x = cT x + (cTN − cTB B −1 N)xN dostajemy −1 cT vj = (cTN − cTB B −1 N)xN = cTj − cTB B −1 aj < 0, czyli problem nie posiada rozwiązania. Przypadek 2b: −B −1 aj Zakładamy, że B aj 6≤ 0. Weźmy vj = i oznaczmy y = B −1 aj , ej −1 b = B −1 b. Niech λ = min1≤i≤m { ybii ; yi > 0} = bi0 , yi0 x = x + λvj . Pokażemy, że −B −1 aj = x ∈ X. Wiemy, że Ax = b, natomiast Avj = [BN]vj = [BN] ej −aj + aj = 0, zatem Ax = b. Musimy jeszcze udowodnić, że x ≥ 0. Dla i = 1, 2, . . . , m mamy x = xi + λ(vj )i = (B −1 b)i + bi0 bi (−B −1 aj )i = bi − 0 yi . yi0 yi0 Rozważmy dwa przypadki: 1. jeśli yi ≤ 0, to oczywiście xi ≥ 0, b 2. jeśli yi > 0, to ybii ≥ yii0 , a stąd xi ≥ 0. 0 Dla i = m + 1, m + 2, . . . , n oraz i 6= j mamy xi = 0. Dla i = j mamy xi = λ > 0. Wektor x posiada niezerowe współrzędne co najwyżej na miejscach 1, 2, . . . , i0 − 1, i0 + 1, . . . , m, j. Pokażemy, że a1 , a2 , . . . , ai0 −1 , ai0 +1 , . . . , am , aj są P liniowo niezależne. Wówczas x będzie punktem ekstremalnym. Załóżmy, że i∈{1,...,m,j}\{i0 } αi ai = 0, mamy 0= X αi ai = i∈{1,...,m,j}\{i0 } = X αi ai +αj aj = i∈{1,...,m}\{i0 } X i∈{1,...,m}\{i0 } αi ai + αj X αi ai +αj By = i∈{1,...,m}\{i0 } m X i=1 yi ai = m X i=1 (αi + αj yi )ai , 1. PROGRAMOWANIE LINIOWE 22 gdzie αi0 = 0. Wtedy αi + αj yi = 0 oraz αj yi0 = 0. Zatem αj = 0, a stąd αi = 0. Niech B ′ = [a1 , a2 , . . . , ai0 −1 , ai0 +1 , . . . , am , aj ] oraz A = [B′ N ′ ]. Wówczas ′−1 −B b oraz Ax = b, stąd b = B ′ xB + N ′ xN = B ′ xB , czyli xB = B ′−1 b tzn. 0 B ′−1 b ≥ 0. Ponadto −1 aj T T T T −B T T = cT x+ c x = c (x + λvj ) = c x + c λvj = c x + λc ej +λ(cTj − cTB B −1 aj ) ≤ cT x. 1.4. Metoda sympleksowa Przypomnijmy, że chcemy zminimalizować cT x przy warunkach Ax = b, x ≥ 0. Algorytm sympleks Krok 1. Wziąć dowolny punkt ekstremalny x zbioru X o zmiennych bazowych xB . Krok 2. Wyliczyć α = cTB B −1 N − cTN . Jeżeli α ≤ 0, to zakończyć algorytm (punkt x jest szukanym punktem). W przeciwnym wypadku przejść do kroku 3. Krok 3. Wybrać maksymalną dodatnią współrzędną α. Niech tą współrzędną będzie αj , zatem αj = cTB B −1 aj − cTj . Jeśli yj = B −1 aj ≤ 0, to zakończyć algorytm (brak rozwiązania). W przeciwnym wypadku przejść do kroku 4. Krok 4. Skonstruować nowy punkt ekstremalny o zmiennych bazowych xB zgodnie z opisanym powyżej procesem. Przejść do kroku 2. Przykład 1.22. Znaleźć minimum funkcji f (x1 , x2 ) = 2x1 − 9x2 przy warunkach x1 + x2 ≤ 6, −x1 + 3x2 ≤ 3, 1. PROGRAMOWANIE LINIOWE 23 x1 ≥ 0, x2 ≥ 0. Zmiana warunków funkcji f (x1 , x2 ) = 2x1 − 9x2 : x1 + x2 + x3 = 6, −x1 + 3x2 + x4 = 3, x1 ≥ 0, x2 ≥ 0, x3 ≥ 0, x4 ≥ 0, gdzie x3 , x4 są zmiennymi dopełniającymi. Mamy 1 1 1 0 6 A= , b= , c = [2, −9, 0, 0]T . −1 3 0 1 3 1 0 , Szukamy macierzy B, dla której B b ≥ 0. Weźmy B = [a3 , a4 ] = 0 1 wówczas B −1 = B i B −1 b = b ≥ 0. Liczymy cTB B −1 N − cTN : 1 1 1 0 T −1 T − [2, −9] = [−2, 9] 6≤ 0. cB B N − cN = [0, 0] 0 1 −1 3 1 0 1 1 1 −1 Obliczamy y2 = B a2 = = . Ponieważ 6≤ 0, to konstru0 1 3 3 3 ujemy nowy punkt ekstremalny. Mamy bi 6 3 = 1, ; y2i > 0 = min , λ = min i=3,4 i=3,4 y2i 1 3 0 0 0 e2 0 1 = 1 . , x = x + λv2 = + 1 v2 = −1 −1 5 6 −B a2 0 −3 3 1 1 0 31 Teraz B = [a2 , a3 ] = , wówczas B −1 = . Ponownie liczymy 3 0 1 − 31 cTB B −1 N − cTN : 1 0 0 31 T −1 T − [2, 0] = [1, −3] 6≤ 0. cB B N − cN = [−9, 0] 1 − 13 −1 1 −1 1. PROGRAMOWANIE LINIOWE 24 1 1 0 13 1 −3 − Obliczamy y1 = B a1 = = 4 . Ponieważ 43 6≤ 0, to 1 − 31 −1 3 3 konstruujemy kolejny punkt ekstremalny. Mamy 15 bi 5 ; y1i > 0 = min 4 = , λ = min i=2,3 y1i 4 3 15 0 1 4 1 15 1 9 3 4 x = x + λv1 = 5 + 4 − 4 = 0 . 3 0 0 0 3 − 14 1 1 −1 4 Teraz przyjmujemy B = [a1 , a2 ] = , wobec tego B = 1 1 . −1 3 4 4 Liczymy cTB B −1 N − cTN : 3 3 11 − 14 1 0 T −1 T 4 cB B N − cN = [2, −9] 1 1 − [0, 0] = [− , − ] < 0. 0 1 4 4 4 4 −1 Zatem kończymy obliczenia i otrzymujemy wartość optymalną f (x1 , x2 ) = − 9 49 = − 51 . 2x1 − 9x2 = 2 15 4 4 Lemat 1.23. Niech B, B ∈ Mm×m (R) będą macierzami nieosobliwymi różniącymi się jedną kolumną, tzn. B = [a1 , a2 , . . . , al−1 , al , al+1 , . . . , am ], B = [a1 , a2 , . . . , al−1 , ak , al+1 , . . . , am ] oraz niech B −1 ak = y = [y1 , y2, . . . , ym ]T . −1 Wówczas B = F B −1 , gdzie macierz F posiada jedynki na głównej przekątnej, l-tą kolumnę postaci fl = y1l [−y1 , −y2 , . . . , −yl−1 , 1, −yl+1 , . . . , −ym ]T , a na pozostałych miejscach zera. Dowód. B = B + (ak − al )eTl = B + (ak − Bel )eTl = B(I + B −1 (ak − Bel )eTl ) = B(I + (B −1 ak − el )eTl ) = B(I + (y − el )eTl ), zatem B −1 = (I + (y − Iel )eTl )−1 B −1 . Trzeba pokazać, że F = (I + (y − Iel )eTl )−1 . Zauważmy, że I + (y − Iel )eTl jest macierzą jednostkową z l-tą kolumną y. Ponadto det(I + (y − Iel )eTl ) = yl 6= 0. Przykład 1.24. Znaleźć maksimum funkcji f (x1 , x2 ) = x1 + 2x2 przy warunkach x1 + x2 ≤ 5, 1. PROGRAMOWANIE LINIOWE 25 −x1 + x2 ≥ 0, 3x1 + 7x2 ≤ 27, x1 ≥ 0, x2 ≥ 0. Przeformułowanie i zmiana warunków funkcji: znaleźć minimum funkcji f (x1 , x2 ) = −x1 − 2x2 przy warunkach x1 + x2 + x3 = 5, x1 − x2 + x4 = 0, 3x1 + 7x2 + x5 = 27, x1 ≥ 0, x2 ≥ 0, x3 ≥ 0, x4 ≥ 0, x5 ≥ 0, gdzie x3 , x4 , x5 są 1 A= 1 3 zmiennymi dopełniającymi. Mamy 1 1 0 0 5 −1 0 1 0 , b = 0 , c = [−1, −2, 0, 0, 0]T . 7 0 0 1 27 −1 Szukamy macierzy B, dla której B b ≥ 0. Weźmy B = [a3 , a4 , a5 ] = 1 0 0 0 1 0, wówczas B −1 = B i B −1 b = b ≥ 0, xT = [0, 0, 5, 0, 27]. Liczymy 0 0 1 T −1 cB B N − cTN : 1 0 0 1 1 cTB B −1 N − cTN = [0, 0, 0] 0 1 0 1 −1 − [−1, −2] = [1, 2] 6≤ 0. 0 0 1 3 7 1 0 0 1 1 1 −1 −1 = −1 . Ponieważ −1 6≤ 0, Obliczamy y2 = B a2 = 0 1 0 0 0 1 7 7 7 to konstruujemy nowy punkt ekstremalny. Mamy bi 5 27 27 λ = min ; y2i > 0 = min = , , i=3,4,5 y2i 1 7 7 0 0 0 1 27 0 27 78 e2 . v2 = , x = x + λv2 = −1 7 5 + 7 −1 = 27 −B a2 1 0 7 −7 0 27 1. PROGRAMOWANIE LINIOWE 26 1 1 0 Teraz zamiast B = [a2 , a3 , a4 ] = −1 0 1, możemy rozważać łatwiejszą 7 0 0 1 0 1 −1 do dalszych obliczeń macierz B = [a3 , a4 , a2 ] = 0 1 −1. Mamy B = 7 0 0 1 1 8 1 0 −7 1 0 −7 5 7 −1 F B −1 = F = 0 1 17 , B b = 0 1 17 0 = 27 7 , l = 3, yl = 7. 1 1 27 0 0 7 0 0 7 27 7 Przykład 1.25. Przedstawimy rozwiązanie zagadnienia z Przykładu 1.1 wykorzystując tablice sympleksowe. Nasz PL-model ma następującą postać. Znaleźć maksimum funkcji f (x1 , x2 ) = 3x1 + 2x2 przy warunkach x1 + x2 + x3 = 9, 3x1 + x2 + x4 = 18, 3x1 + x5 = 7, 3x2 + x6 = 6, x1 ≥ 0, x2 ≥ 0, x3 ≥ 0, x4 ≥ 0, x5 ≥ 0, x6 ≥ 0, gdzie x3 , x4 , x5 , x6 1 3 A= 1 0 są zmiennymi dopełniającymi. Mamy 9 1 1 0 0 0 18 1 0 1 0 0 , b = , c = [3, 2, 0, 0, 0, 0]T . 7 0 0 0 1 0 6 1 0 0 0 1 Tablica sympleksowa dla powyższego zagadnienia wygląda następująco: 3 1 3 1 0 2 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 9 18 7 6 Początkowym rozwiązaniem dopuszczalnym jest x1 = 0, x2 = 0, x3 = 9, 1 0 0 0 0 1 0 0 x4 = 18, x5 = 7, x6 = 6. Ponadto B = [a3 , a4 , a5 , a6 ] = 0 0 1 0, 0 0 0 1 1. PROGRAMOWANIE LINIOWE 27 1 1 3 1 N = [a1 , a2 ] = 1 0. Największym dodatnim współczynnikiem funkcji ce0 1 lu jest 3, zatem x1 wchodzi do nowych zmiennych bazowych. Aby sprawdzić, która ze zmiennych opuszcza zbiór zmiennych bazowych liczymy odpowiednie minimum: min{ 19 , 18 , 7 } = 18 = 6. Zatem x4 opuszcza zbiór zmiennych 3 1 3 bazowych. Mamy teraz B = [a1 , a3 , a5 , a6 ] oraz N = [a2 , a4 ]. 3 1 3 1 0 2 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 9 18 7 6 Stosując eliminację Gaussa oraz dokonując odpowiednich uproszczeń otrzymujemy następującą tablicę sympleksową: 0 1 0 23 1 13 0 − 13 0 1 0 1 0 0 0 −1 − 13 1 3 − 13 0 0 0 0 1 0 0 0 0 0 1 −18 3 6 1 6 Jedynym dodatnim współczynnikiem funkcji celu jest teraz 2, czyli x2 wchodzi do zbioru nowych zmiennych bazowych. Liczymy odpowiednie minimum: min{ 92 , 18 , 6 } = 29 . Zatem zmienna x3 opuszcza zbiór zmiennych bazowych. 1 1 Mamy teraz B = [a1 , a2 , a5 , a6 ] oraz N = [a3 , a4 ]. 0 1 0 23 1 13 0 − 13 0 1 0 1 0 0 0 −1 − 13 1 3 − 13 0 0 0 0 1 0 0 0 0 0 1 −18 3 6 1 6 Stosując eliminację Gaussa oraz dokonując odpowiednich uproszczeń otrzymujemy następującą tablicę sympleksową: 1. PROGRAMOWANIE LINIOWE 0 0 1 0 0 0 1 0 0 0 −1 12 1 21 − 12 − 12 − 12 −1 12 1 2 1 2 1 2 − 12 0 0 0 1 0 0 0 0 0 1 28 −22 21 4 12 4 12 2 12 1 12 Ponieważ nie ma już dodatnich współczynników funkcji celu otrzymujemy wartość optymalną f (x1 , x2 ) = 3x1 + 2x2 = 3(4 12 ) + 2(4 21 ) = 22 12 . Problem znalezienia pierwszego punktu ekstremalnego Przypomnijmy, że szukamy min cT x, przy założeniach Ax = b, x ≥ 0, rz (A) = m, b ∈ Rm . W podanym wcześniej algorytmie sympleks w kroku pierwszym zakładamy istnienie punktu ekstremalnego. Z Twierdzenia 1.13 wynika, że znalezienie początkowego punktu ekstremalnego związane jest z rozbiciem macierzy A na macierze B oraz N tak, aby B −1 b ≥ 0. W Przykładach 1.22 i 1.24 mieliśmy na początku B = I, b ≥ 0. Dwuetapowy sposób znajdowania pierwszego punktu ekstremalnego (bazowego) Zakładamy, że b ≥ 0. Jeśli bi < 0, to mnożymy odpowiednie równanie przez x =bi -1. Rozpatrzmy pomocnicze zagadnienie minimalizacji. Mamy [AI] y szukamy następującego minimum (∗) min m X yi , i=1 gdzie Ax + Iy = b, x ≥ 0, y ≥ 0. Do rozwiązania zagadnienia (∗) stosujemy metodę sympleks, ponieważ ma ono początkowe rozwiązanie dopuszczalne. 0 Zaczynamy następująco B = I, B −1 b = , x = 0, y = b. Jeśli znajdziemy b P optymalne rozwiązanie bazowe dla (∗), takie że m i=1 yi = 0, to otrzymamy także bazę dającą rozwiązanie xB (czyli Ax = b). Jeśli (∗) posiada dodatnie 1. PROGRAMOWANIE LINIOWE 29 minimum, to nie ma rozwiązania dopuszczalnego dla Ax = b, x ≥ 0. Mamy Etap I - znalezienie rozwiązania dopuszczalnego dla Ax = b, x ≥ 0 lub stwierdzenie, że nie istnieje takie rozwiązanie. Etap II - użycie rozwiązania z etapu pierwszego do rozwiązania następującego zagadnienia: znaleźć minimum cT x przy warunkach Ax ≤ b, x ≥ 0. 1.4.1. Dualna metoda programowania liniowego Szukamy max y T b przy założeniach y T A ≤ cT , y ∈ Rm (nie zakłada się, że y ≥ 0). Zauważmy, że y T b = y T Ax ≤ cT x, x ≥ 0. Wobec tego jeżeli y T b = cT x, Ax = b, AT y ≤ c, to y, x są rozwiązaniami optymalnymi dla odpowiednich zagadnień (x dla szukania minimum cT x przy warunkach Ax = b, x ≥ 0, a y dla szukania maksimum y T b przy warunkach y T A ≤ cT ). Twierdzenie 1.26. Jeśli jedno z zadań programowania liniowego (prymalne lub dualne) posiada skończone rozwiązanie, to takie rozwiązanie posiada drugie z tych zadań. Ponadto wartości funkcji celu obu powyższych zagadnień są takie same. Załóżmy, że xB = B −1 b jest rozwiązaniem (dopuszczalnym i optymalnym) dla zagadnienia prymalnego (min cT x, Ax = b, x ≥ 0). Wtedy y T = cTB B −1 . Ponadto wiemy, że cTN − cTB B −1 N ≥ 0 stąd cTB B −1 N ≤ cTN . Okazuje się, że wektor y T = cTB B −1 jest rozwiązaniem optymalnym zagadnienia dualnego. Mamy y T A = y T [BN] = [cTB B −1 B, cTB B −1 N] ≤ [cTB , cTN ] = cT jak również równość funkcji celu y T b = cTB B −1 b = cTB xB = cTB xB + cTN xN = x T T = [cB , cN ] B = cT x. xN Zatem jeśli zagadnienie prymalne posiada rozwiązanie optymalne xB = B −1 b, to zagadnienie dualne ma rozwiązanie optymalne y T = cTB B −1 , które można bez trudności policzyć, ponieważ macierz odwrotna do bazy jest znana. 1. PROGRAMOWANIE LINIOWE 30 Związek pomiędzy rozwiązaniami optymalnymi x oraz y podaje następujące twierdzenie. Twierdzenie 1.27 (o różnicach dopełniających). Jeżeli x, y są odpowiednio punktami ekstremalnymi dla zagadnienia prymalnego i dualnego, to są one rozwiązaniami optymalnymi wtedy i tylko wtedy, gdy (i) ∀i xi > 0 ⇒ y T ai = ci (ii) ∀i y T ai < ci ⇒ x = 0, gdzie ai oznacza i-tą kolumnę macierzy A. Algorytm dualny sympleks Dane jest rozwiązanie bazowe xB = B −1 b takie, że wektor y T = cTB B −1 spełnia nierówność cTN − y T N ≥ 0. Krok 1. Jeśli xB ≥ 0, to xB jest rozwiązaniem optymalnym i obliczenia są zakończone. W przeciwnym razie wybrać ujemną składową xB , niech tą składową będzie składowa o numerze l (zmienna xl zostaje usunięta ze zbioru zmiennych bazowych, a l-ta kolumna w macierzy A zostaje usunięta z bazy B). Krok 2. Obliczyć bl aj = ulj dla j = m+1, m+2, . . . , n, gdzie bl jest l-tym wierszem macierzy B −1 , aj j-tą kolumną macierzy A. Jeśli wszystkie ulj ≥ 0, to zagadnienie dualne nie ma skończonego rozwiązania. W przeciwnym razie dla wszystkich j = m + 1, m + 2, . . . , n takich, że ulj < 0 obliczyć zj = y T aj = cTB B −1 aj oraz wyznaczyć ε = min{ zj − cj ; ulj < 0}. ulj k Niech ε = zku−c (k-ta kolumna macierzy A zastępuje w bazie l-tą kolumnę lk macierzy A). Krok 3. Obliczyć nowy wektor y T w następujący sposób: y T = y T − εbl . Krok 4. Uaktualnić odwrotną macierz bazową B −1 oraz obliczyć nowe rozwiązanie xB = B −1 b. Krok 5. Wrócić do kroku pierwszego. 1. PROGRAMOWANIE LINIOWE 31 Uwaga 1.28. Nową zmienną y można obliczyć tak jak w kroku 3 lub wykorzystując zależność y T = cTB B −1 po tym, gdy macierz B −1 została uaktualniona. Wartość dualnej funkcji celu y T b jest zwiększana w każdej kolejnej iteracji. Procedura dualna sympleks zostaje zakończona po skończonej liczbie kroków, gdy xB ≥ 0. 1.5. Elementy programowania całkowitoliczbowego Rozważmy zagadnienie optymalizacji z kawałkami liniowym ograniczeniem lub funkcją celu jednej zmiennej przedstawione na poniższym rysunku f(y) y1 y2 yn-2 y3 yn-1 yn y Dowolna wartość y leżąca pomiędzy y1 oraz yn może być przedstawiona w postaci wypukłej kombinacji zmiennych yi oraz yi+1 w następujący sposób: y = λi yi + λi+1 yi+1 , gdzie λi + λi+1 = 1, λi , λi+1 ≥ 0. Podobnie f (y) = λi f (yi) + λi+1 f (yi+1). Za pomocą zmiennych całkowitoliczbowych możemy wyrazić f (y) w całym przedziale [y1 , yn ] w następujący sposób: f (y) = n X λi f (yi ), i=1 gdzie n X i=1 λi yi = y, n X λi = 1, λi ≥ 0, i = 1, 2, . . . , n, λ1 ≤ x1 , λi ≤ xi−1 + xi , i=1 i = 2, 3, . . . , n−1, λn ≤ xn−1 , n−1 X xi = 1, xi = 0 lub xi = 1, i = 1, 2, . . . , n−1. i=1 Tylko jedna zmienna xi może przyjąć wartość równą 1, a stąd tylko λi oraz λi+1 mogą być niezerowe, czyli λi + λi+1 = 1. Mamy zatem do czynienia 1. PROGRAMOWANIE LINIOWE 32 ze zmiennymi zero-jedynkowymi x1 , x2 , . . . , xn−1 , które określają przedział zawierający y oraz ze zmiennymi ciągłymi λ1 , λ2 , . . . , λn , które dokładnie określają wartość y. Powyższa technika może być użyta do przybliżania funkcji nieliniowych funkcjami kawałkami liniowymi i do przekształcania zagadnień z nieliniowymi funkcjami celu do zagadnień całkowitoliczbowych programowania liniowego. W przypadku ogólnym nie można rozwiązywać zagadnień całkowitoliczbowych za pomocą metody sympleks i należy posługiwać się specjalnymi technikami obliczeniowymi. Poniżej przedstawimy jedną z nich, a mianowicie metodę dualną Gomory’ego. Metoda ta jest bezpośrednim rozwinięciem dualnej metody sympleks. Różnica polega na tym, że w metodzie całkowitoliczbowej wiersz zawierający element główny jest generowany w każdej iteracji i wartość tego elementu wynosi -1. Zapewnia to całkowitoliczbowość dualnej metody sympleksowej. Algorytm redukuje obszar dopuszczalności do takiego, aby jego wierzchołek optymalny był całkowitoliczbowy. Leksykograficzna postać dualnej metody sympleks Rozważmy następującą dualną tablicę sympleksową Zmienna x0 x1 .. . xl .. . Stała −xm+1 p00 p0,m+1 p10 p1,m+1 .. .. . . pl0 pl,m+1 .. .. . . −xm+2 p0,m+2 p1,m+2 .. . . . . −xk . . . p0k . . . p1k .. . . . . −xn . . . p0n . . . p1n .. . pl,m+2 .. . ... plk .. . ... pln .. . xm xm+1 xm+2 .. . pm0 0 0 .. . pm,m+1 −1 0 .. . pm,m+2 0 −1 .. . ... ... ... .. . pmk 0 0 .. . ... ... ... pmn 0 0 .. . xk .. . 0 .. . 0 .. . 0 .. . ... −1 .. . 0 .. . xn 0 0 0 ... 0 ... .. . ... −1 gdzie xl jest zmienną opuszczającą bazę, −xk zmienną wchodzącą do bazy, natomiast plk jest elementem głównym. Powyższa tablica odpowiada zagadnieniu całkowitoliczbowemu w postaci: 1. PROGRAMOWANIE LINIOWE 33 (∗) znaleźć minimum x0 , przy warunkach X xi = pi0 + pij (−xj ), xi ≥ 0, xi ∈ Z, i = 1, 2, . . . , n, j∈J natomiast J jest zbiorem wskaźników niebazowych zmiennych. W powyższej tablicy wygodnie jest założyć, że pierwsze m zmiennych jest bazowych. Zapiszmy nasze zagadnienie w postaci wektorowej, mamy: znaleźć minimum x0 , przy warunkach X x = p0 + pj (−xj ), xi ≥ 0, xi ∈ Z, i = 1, 2, . . . , n. j∈J Wektor v 6= 0 nazywamy leksykograficznie dodatnim (ujemnym), jeśli pierwsza jego niezerowa składowa jest dodatnia (ujemna). Gdy wektor v jest leksykograficznie dodatni (ujemny), to piszemy v >l 0 (v <l 0). Wektor v jest leksykograficznie większy (mniejszy) od wektora w, jeżeli v − w >l 0 (v − w <l 0). Ciąg wektorów vt , t = 1, 2, . . . nazywamy leksykograficznie malejącym (rosnącym), jeśli vt −vt+1 >l 0 (vt −vt+1 <l 0). Zatem w leksykograficznym algorytmie dualnym zagadnienie (∗) przedstawiamy w sposób następujący: znaleźć leksykograficzne minimum x, przy warunkach X x = p0 + pj (−xj ), x ≥ 0. j∈J Zmienną xl opuszczającą bazę wyznacza się tak samo jak w zwykłej metodzie dualnej tzn. pl0 = min{pi0 ; pi0 < 0, 1 ≤ i ≤ m}. Zmienną x wchodzącą do bazy znajdujemy za pomocą testu 1 1 pk = lex max{ ; plj < 0, m + 1 ≤ j ≤ n}, plk plj gdzie lex max oznacza maksimum leksykograficzne. Przekształcenie elementarne względem plk przekształca powyższą tablicę w nową tablicę z kolumnami (∗∗) pj = pj − plj 1 pk , dla j 6= k, pk = − pk . plk plk 1. PROGRAMOWANIE LINIOWE 34 Jeżeli początkowa tablica jest dualnie dopuszczalna w sensie leksykograficznym (tzn. wektory pj , j = m+ 1, m+ 2, . . . , n są leksykograficznie ujemne), to wzory (∗∗) gwarantują, że nowe wektory kolumnowe pj są również leksykograficznie ujemne. Uwaga 1.29. Można pokazać, że rozwiązanie bazowe p0 jest ściśle rosnące (w sensie leksykograficznym) w każdej iteracji oraz że żadna baza nie powtórzy się. Zarys metody dualnej Gomory’ego. Metoda Gomory’ego rozpoczyna działanie od tablicy całkowitoliczbowej i leksykograficznie dualnie dopuszczalnego rozwiązania, to znaczy wektory pj , j = m + 1, m + 2, . . . , n są leksykograficznie ujemne dla zagadnienia minimalizacji oraz dodatnie dla zagadnienia maksymalizacji. Algorytm jest następujący: Krok 1. Wybrać wiersz o numerze r, w którym pr0 < 0, r 6= 0. Jest to wiersz generujący tzw. cięcie. Jeżeli wiersza takiego nie ma, to bieżące rozwiązanie jest optymalne. Krok 2. Znaleźć kolumnę pk z elementem głównym, która jest największa w sensie leksykograficznym wśród kolumn, dla których prj < 0. Jeśli takiej kolumny nie ma, to brak jest dopuszczalnego rozwiązania całkowitoliczbowego. Krok 3. Utworzyć nierówność (tzw. odcinającą) z wiersza r-tego, który nie jest spełniony przez bieżące rozwiązanie prymalne. Nowy wiersz jest dołączony na dole tablicy i jest to wiersz z elementem głównym równym -1. Krok 4. Wykonać jedno przekształcenie elementarne dualnej metody sympleks. Krok 5. Usunąć dodany wiersz, który jest teraz trywialny (x = −(−x)) i wrócić do kroku 1. Sposób otrzymania nierówności odcinającej 1. PROGRAMOWANIE LINIOWE 35 Przypuśćmy, że wybrano wiersz o numerze r w tablicy dualnej, jako generujący cięcie (przez cięcie rozumiemy dodatkowe ograniczenie posiadające tę własność, że odcina część zbioru rozwiązań dopuszczalnych nie gubiąc przy tym żadnego rozwiązania całkowitoliczbowego) X xr = pr0 + prj (−xj ). j∈J Niech λ będzie liczbą dodatnią. Każda liczba p spełnia równość hpi λ + R, (i) p = λ gdzie przez [z] oznaczamy część całkowitą liczby z oraz 0 ≤ R < λ. Po zastosowaniu (i) do wiersza generującego, otrzymujemy hp i X hp i X 1 r0 rj (ii) Rj xj +Rr xr = R0 +λ( + (−xj )+ (−xr )) = R0 +λx. λ λ λ j∈J j∈J Dla dowolnego nieujemnego rozwiązania spełniającego (ii) wartość hp i X hp i 1 r0 rj (iii) x = + (−xj ) + (−xr ) λ λ λ j∈J musi być całkowita, ponieważ wszystkie współczynniki w (iii) są całkowite. Ponadto x ≥ 0, bo 0 ≤ R0 < λ i jeśli x jest ujemną liczbą całkowitą, to R0 + λx < 0. Jednak ostatnia nierówność nie jest możliwa, ponieważ lewa strona w (ii) jest nieujemna. Zatem x ≥ 0. Gdy wybierzemy λ ≥ 1, wówczas nierówność x ≥ 0 uprości się do postaci hp i X hp i r0 rj (iv) + (−xj ) ≥ 0. λ λ j∈J p Niech πrj = λrj , wówczas całkowitoliczbowe cięcie Gomory’ego określone jest następująco: X πrj (−xj ) ≥ 0. (v) x = πr0 + j∈J Ograniczenie (v) jest wierszem głównym, a x jest nową nieujemną zmienną dodatkową. Wyznaczymy teraz wartość λ. 1. PROGRAMOWANIE LINIOWE 36 Wyznaczanie wartości λ. Krok 1. Znaleźć kolumnę główną k tak, aby pk = lex max{pj ; j ∈ J}, gdzie J = {j; prj < 0, j 6= 0}, a r-ty wiersz generuje cięcie. Krok 2. Wyznaczyć największą liczbę całkowitą ej , taką że − 1 pj ≥l −pk , j ∈ J, j 6= k. ej Ponadto niech ek = 1. p Krok 3. Przyjąć λ = max{λj = − erjj ; j ∈ J}. Uwaga 1.30. (i) Wyprowadzając zależność (iv) założyliśmy, że λ ≥ 1. Nierówność ta jest spełniona, ponieważ λ ≥ λk = −prk ≥ 1. Jeśli λ = 1, to wiersz generujący jest wierszem zawierającym element główny i nie ma nowego ograniczenia. (ii) Zgodnie z wyprowadzeniem, λ nie musi być całkowite. Wybierając taką wartość λ, otrzymamy jako element główny −1 oraz wiersz główny, który daje największy leksykograficznie wzrost kolumny p0 . Całkowitoliczbowy algorytm dualny Gomory’ego. Zakładamy, że kolumny pj , j = m + 1, m + 2, . . . , n są leksykograficznie dualnie dopuszczalne. Krok 1. Jeśli p0 ≥ 0, to rozwiązanie prymalne jest dopuszczalne i optymalne, a obliczenia się kończą. W przeciwnym razie wybrać taki wiersz generujący cięcie, że pr0 < 0. Krok 2. Znaleźć taką kolumnę główną pk , m + 1 ≤ k ≤ n, aby była ona leksykograficznie największa wśród kolumn, dla których prj < 0. Jeżeli wszystkie prj ≥ 0, to wówczas nie istnieje dopuszczalne rozwiązanie całkowitoliczbowe. W przypadku przeciwnym przejść do kroku 3. Krok 3. Dla każdego j ∈ J, j 6= k znaleźć największą liczbę całkowitą ej taką, że − e1j pj ≥ −pk . Następnie podstawić ek = 1 oraz obliczyć λ = max{− prj ; j ∈ J }. ej 1. PROGRAMOWANIE LINIOWE 37 Krok 4. Do tablicy dualnej dołączyć ograniczenie X x = πr0 + πrj (−xj ) ≥ 0. j∈J Krok 5. Wybrać jedno dualne przekształcenie elementarne używając πrk = −1 jako elementu głównego. Krok 6. Usunąć dodane ograniczenie, które stało się trywialne i wrócić do kroku 1. Uwaga 1.31. W kroku 1 powyższego algorytmu do wyznaczenia wiersza generującego cięcie można wybrać najmniejsze pi0 < 0. Przykład 1.32. Znaleźć minimum funkcji f (x1 , x2 ) = x0 = 3x1 + 5x2 przy warunkach x3 = −5 + x1 + 4x2 ≥ 0, x4 = −7 + 3x1 + 2x2 ≥ 0, x1 , x2 , x3 , x4 ≥ 0, x1 , x2 , x3 , x4 ∈ Z. Dualna tablica sympleksowa dla powyższego zagadnienia wygląda następująco: Zmienna x0 x3 x4 Stała −x1 0 −3 −5 −1 −7 −3 −x2 −5 −4 −2 Trywialne ograniczenia z pojedyńczym elementem równym -1 zostały pominięte. Niech wierszem generującym będzie wiersz, który zawiera x4 , a kolumną główną kolumna pierwsza (k = 1). Wartości ej są następujące e1 = 1, e2 = 1. Zatem prj 3 2 λ = max{− ; j ∈ J} = max{ , } = 3. ej 1 1 Liczymy dodatkowe ograniczenie −7 −3 −2 x5 = + (−x1 ) + (−x2 ) ≥ 0, 3 3 3 x5 = −3 + x1 + x2 ≥ 0. Nasza tablica ma następującą postać: 1. PROGRAMOWANIE LINIOWE Zmienna x0 x3 x4 x5 Stała −x1 0 −3 −5 −1 −7 −3 −3 −1 38 −x2 −5 −4 −2 −1 Wymieniamy teraz zmienną x1 na zmienną x5 , czyli jest to przekształcenie elementarne z elementem głównym p51 = −1. Mamy x0 = 9 + 3x5 + 2x2 , x1 = 3 + x5 − x2 , x3 = −2 + x5 + 3x2 , x4 = 2 + 3x5 − x2 . Nowa tablica wygląda zatem następująco: Zmienna x0 x1 x3 x4 Stała −x5 9 −3 3 −1 −2 −1 2 −3 −x2 −2 1 −3 1 Po usunięciu dodanego ograniczenia mamy: Zmienna x0 x3 x4 Stała −x1 9 −3 −2 −1 2 −3 −x2 −2 −3 1 Zauważmy, że p0 < 0 zatem należy prowadzić obliczenia dalej. Zgodnie z uwagą 1.31 wierszem generującym jest teraz wiersz, który zawiera x3 , a kolumną główną kolumna druga (k = 2). Wartości ej są następujące e1 = 1, e2 = 1. Zatem 1 3 λ = max{ , } = 3. 1 1 Liczymy dodatkowe ograniczenie −2 −1 −3 x5 = + (−x1 ) + (−x2 ) ≥ 0, 3 3 3 x5 = −1 + x1 + x2 ≥ 0. Nasza tablica ma następującą postać: 2. STRATEGIE ZACHŁANNE Zmienna x0 x3 x4 x5 Stała −x1 9 −3 −2 −1 2 −3 −1 −1 39 −x2 −2 −3 1 −1 Wymieniamy teraz zmienną x2 na zmienną x5 , czyli jest to przekształcenie elementarne z elementem głównym p52 = −1. Mamy x0 = 11 + x1 + 2x5 , x2 = 1 − x1 + x5 , x3 = 1 − 2x1 + 3x5 , x4 = 1 + 4x1 − x5 . Nowa tablica wygląda zatem następująco: Zmienna x0 x2 x3 x4 Stała −x1 11 −1 1 1 1 2 1 −4 −x5 −2 −1 −3 1 Po usunięciu dodanego ograniczenia mamy: Zmienna x0 x3 x4 Stała −x1 11 −1 1 2 1 −4 −x2 −2 −3 1 Ponieważ p0 > 0, to rozwiązanie prymalne jest dopuszczalne i optymalne, co pozwala zakończyć wykonywanie algorytmu. Ostatecznie mamy 3x1 + 5x2 = 11, a stąd rozwiązaniem optymalnym jest x1 = 2, x2 = 1, x3 = 1 oraz x4 = 1. 2. Strategie zachłanne Strategia zachłanna (ang. greedy) jest to metoda rozwiązywania pewnych problemów optymalizacyjnych. Polega ona na tym, że na każdym etapie rozwiązywania problemu wybiera opcję lokalnie optymalną. Strategia taka może, ale NIE MUSI prowadzić do optymalnego globalnego rozwiązania. 2. STRATEGIE ZACHŁANNE 40 Istnieje wiele problemów, w których strategia zachłanna daje rozwiązanie optymalne. Strategię zachłanną możemy stosować także wtedy, gdy nie daje ona gwarancji uzyskania optymalnego rozwiązania. Np. wtedy, gdy jesteśmy zainteresowani szybkim, przybliżonym, ale nie koniecznie optymalnym rozwiązaniem. 2.1. Problem wyboru zajęć Mamy dany zbiór S = {1, . . . , n} złożony z n zajęć, którym trzeba przydzielić salę wykładową. W sali mogą odbywać się w danej chwili co najwyżej jedne zajęcia. Każde zajęcia i mają swój czas rozpoczęcia si oraz czas zakończenia fi . Rozsądnie jest założyć, że si < fi . Ponadto zakładamy, że zajęcia i zajmują przedział czasowy [si , fi ). Mówimy, że zajęcia i oraz j są zgodne, jeśli [si , fi ) ∩ [sj , fj ) = ∅. Problem wyboru zajęć polega na wyborze maksymalnego podzbioru A ⊆ S parami zgodnych zajęć. Problem wyboru zajęć - rozwiązanie Postępujemy w nastepujący sposób. Najpierw wybieramy zajęcia a1 , które mają najwcześniejszy czas zakończenia. Jeżeli mamy już wybrane zajęcia a1 , . . ., ak , to jako zajęcia ak+1 wybieramy ze zbioru S \ {a1 , . . . , ak } te, które są zgodne ze wszystkimi a1 , . . . , ak oraz mają najwcześniejszy czas zakończenia. Procedurę tę kontynuujemy aż do wyczerpania zajęć ze zbioru S. Otrzymany zbiór A = {a1 , . . . , am } jest poszukiwanym maksymalnym zbiorem parami zgodnych zajęć. Zauważmy, że na każdym etapie wybierając zajęcia o najwcześniejszym czasie zakończenia pozostawiamy najwięcej wolnego czasu do wykorzystania. W tym sensie jest to strategia zachłanna. Problem wyboru zajęć - przykład Mamy dane: salę wolną w czasie 1 − 10 oraz zajęcia z1 , . . . , z10 wraz z czasami rozpoczęcia oraz zakończenia podanymi w poniższej tabeli (w postaci si − fi ). 2. STRATEGIE ZACHŁANNE z1 1−4 z2 2−4 z3 3−5 z4 2−7 z5 4−8 41 z6 z7 6 − 9 8 − 10 Zgodnie z naszą metodą wybieramy najpierw zajęcia z1 , następnie – z5 i ostatecznie – z7 . Zbiór A = {z1 , z5 , z7 } jest maksymalnym podzbiorem parami zgodnych zajęć. Twierdzenie 2.1. Niech S = {1, . . . , n} będzie zbiorem zajęć. Opisana powyżej strategia zachłanna prowadzi do wyboru maksymalnego podzbioru A zbioru S składającego się z parami zgodnych zajęć. Dowód. Niech S = {1, . . . , n} będzie zbiorem zajęć. Ponadto załóżmy, że f1 ≤ f2 ≤ . . . ≤ fn . Zatem zajęcia 1 kończą się najwcześniej. Wykażemy, że istnieje podzbiór A o żądanych własnościach oraz taki, że 1 ∈ A. Niech B będzie pewnym maksymalnym podzbiorem zbioru S składającym się z parami zgodnych zajęć. Przypuśćmy, że zajęciami o minimalnym numerze należącym bo zbioru B są k. Jeżeli k = 1, to przyjmujemy A = B. Jeżeli k > 1, to przyjmujemy A = (B \ {k}) ∪ {1}. Ponieważ f1 ≤ fk , więc zbiór A jest zbiorem parami zgodnych zajęć. Ponieważ B był maksymalny, więc A też jest maksymalny. Możemy więc założyć, że zajęcia 1 należą do maksymalnego podzbioru A parami zgodnych zajęć. Ponadto zauważmy, że jeśli A jest maksymalnym podzbiorem w S, to ′ A = A \ {1} jest maksymalnym podzbiorem parami zgodnych zajęć zbioru S ′ = {i ∈ S ; si ≥ f1 }. Istotnie, jeśli istniałby większy podzbiór A′′ parami zgodnych zajęć w S ′ , to A′′ ∪ {1} byłby większym od A podzbiorem parami zgodnych zajęć w S. Przeczy to naszym założeniom. Zredukowaliśmy problem do mniejszego problemu wyboru zajęć w S ′ . Dowód kończymy indukcyjnie. Problem wyboru zajęć poddaje się strategii zachłannej (tzn. zastosowanie strategii zachłannej prowadzi do rozwiązania problemu). Poniżej przeanalizujemy problem plecakowy, którego dyskretna wersja nie poddaje się strategii zachłannej. 2. STRATEGIE ZACHŁANNE 42 2.2. Problem plecakowy Zagadnienie optymalizacji zwane „problemem plecakowym” swą nazwę wzięło z analogii do sytuacji praktycznej podobnej do problemu pakowania plecaka. Zadanie polega na zapakowaniu maksymalnie cennego zbioru przedmiotów nie przekraczając ładowności (nośności lub pojemności) bagażu. Ogólny problem plecakowy Mamy danych n rzeczy P1 , . . . , Pn . Zakładamy, że każda z rzeczy dana jest w nieograniczonej liczbie. Dla każdego i = 1, . . . , n, rzecz Pi ma rozmiar 0 < wi ∈ Z oraz wartość 0 < ci ∈ Z. Mamy ponadto daną pojemność plecaka (samochodu, wagonu itp.) 0 < W ∈ Z. Należy znaleźć nieujemne liczby całkowite q1 , . . . , qn takie, że 1. w = q1 w1 + . . . + qn wn ≤ W (tzn. nie została przekroczona pojemność plecaka), 2. wartość spakowanych rzeczy c = q1 c1 + . . . + qn cn jest maksymalna. Wartości q1 , . . . , qn ∈ N, które spełniają warunek 1 nazywamy rozwiązaniem dopuszczalnym problemu plecakowego. Rozwiązanie dopuszczalne, które spełnia warunek 2 nazywamy rozwiązaniem optymalnym problemu plecakowego. Jeżeli założymy, że szukamy wartości q1 , . . . , qn ∈ {0, 1}, to powyższy problem nazywamy decyzyjnym problemem plecakowym. Problem plecakowy - strategie zachłanne Poniżej opiszemy trzy różne metody zachłanne, które znajdują dopuszczalne rozwiązania problemu plecakowego. Skupmy się na ogólnym problemie plecakowym. (I) W pierwszej kolejności wybieramy najcenniejsze rzeczy. Bez straty ogólności możemy założyć, że przedmioty mamy ponumerowane w ten sposób, że c1 ≥ c2 ≥ . . . ≥ cn . 2. STRATEGIE ZACHŁANNE 43 Za q1 przyjmujemy maksymalną liczbę naturalną taką, że q1 w1 ≤ W . Za q2 przyjmujemy maksymalną liczbę naturalną taką, że q1 w1 + q2 w2 ≤ W . Ogólnie, jeśli mamy już wybrane liczby q1 , . . . , qi , to za qi+1 przyjmujemy maksymalną liczbę naturalną taką, że q1 w1 + . . . + qi wi + qi+1 wi+i ≤ W . (II) W pierwszej kolejności wybieramy rzeczy o najmniejszym rozmiarze. Bez straty ogólności możemy założyć, że przedmioty mamy ponumerowane w ten sposób, że w1 ≤ w2 ≤ . . . ≤ wn . Dalej postępujemy tak jak w przypadku (I). (III) W pierwszej kolejności wybieramy najcenniejsze rzeczy w stosunku do rozmiaru. Bez straty ogólności możemy założyć, że przedmioty mamy ponumerowane w ten sposób, że c1 c2 cn ≥ ≥ ... ≥ . w1 w2 wn Dalej postępujemy tak jak w przypadku (I). Zauważmy, że powyższe trzy metody (po drobnych modyfikacjach) możemy również zastosować do znajdowania rozwiązań dopuszczalnych w decyzyjnym problemie plecakowym. Problem plecakowy - przykład Przeanalizujmy na poniższym przykładzie działanie powyższych metod rozwiązywania problemu plecakowego. ci wi ci /wi P1 6 6 1 P2 4 2 2 P3 P4 P5 P6 5 7 10 2 3 2 3 1 5/3 7/2 10/3 2 W 23 Metoda (I) • wybieramy rzecz P5 ponieważ jest najcenniejsza (c5 = 10); • wybieramy jej aż 7 sztuk ponieważ 7w5 = 7 ∗ 3 = 21 < W = 23 oraz 7 jest maksymalną liczbą całkowitą o tej własności; 3. PROGRAMOWANIE DYNAMICZNE 44 • w plecaku pozostało nam miejsce na rzecz o wadze 2 = 23 − 21; • Wybieramy rzecz P4 , która ma wartość 7. Wartość rzeczy umieszczonych w plecaku wynosi 7 ∗ 10 + 7 = 77. Metoda (II) Wybieramy 23 sztuki rzeczy P6 , ponieważ ma ona najmniejszy rozmiar. Zapełniliśmy plecak. Wartość rzeczy umieszczonych w plecaku wynosi 23 ∗ 2 = 46. Metoda (III) • pakujemy plecak w nierosnącej kolejności ilorazów ci ; wi • wybieramy 11 sztuk rzeczy P4 ; • wybieramy 1 sztukę P6 . Wartość plecaka wynosi 11 ∗ 7 + 1 ∗ 2 = 79. Zauważmy, że żadna z tych metod nie dała nam rozwiązania optymalnego. Rozwiązanie optymalne otrzymujemy wybierając 10 sztuk rzeczy P4 oraz 1 sztukę rzeczy P5 . Wartość plecaka wynosi 10 ∗ 7 + 1 ∗ 10 = 80. Metody zachłanne nie wyznaczają optymalnego rozwiązania ogólnego problemu plecakowego. Na ćwiczeniach wykażemy, że metody te nie wyznaczają optymalnego rozwiązania decyzyjnego problemu plecakowego. Optymalne rozwiązanie ogólnego oraz decyzyjnego problemu plecakowego można znaleźć przy pomocy metody programowania dynamicznego. 3. Programowanie dynamiczne Programowanie dynamiczne jest to metoda rozwiązywania problemów, która 1. dany problem P dzieli na mniejsze P1 , . . . , Pn ; 2. rozwiązuje problemy P1 , . . . , Pn (albo metodą programowania dynamicznego, albo innymi metodami) i zapamiętuje ich rozwiązania (najczęściej w pewnej tablicy); 3. PROGRAMOWANIE DYNAMICZNE 45 3. wykorzystując rozwiązania problemów P1 , . . . , Pn podaje rozwiązanie problemu P. Poniżej przedstawimy rozwiązanie problemu plecakowego stosując metodę programowania dynamicznego. 3.1. Problem plecakowy - programowanie dynamiczne Mamy dany problem plecakowy P: • przedmioty: P1 , . . . , Pn ; • ich wartości: c1 , . . . , cn ∈ Z; • rozmiary przedmiotów: w1 , . . . , wn ∈ Z; • rozmiar plecaka: W ∈ Z. Jeżeli q1 , . . . , qn jest optymalnym rozwiązaniem problemu plecakowego, to liczbę p = q1 c1 + . . . + qn cn będziemy nazywać wartością optymalnie wypełnionego plecaka. Aby zastosować metodę programowania dynamicznego należy podzielić nasz problem na mniejsze. Dla wszystkich i = 1, . . . , n oraz j = 1, . . . , W definiujemy problem plecakowy Pi,j : • przedmioty: P1 , . . . , Pi ; • ich wartości: c1 , . . . , ci ∈ Z; • rozmiary przedmiotów: w1 , . . . , wi ∈ Z; • rozmiar plecaka: j ∈ Z. Niech Pi,j oznacza wartość optymalnie wypełnionego plecaka w problemie Pi,j . Zauważmy, że Pn,W = P oraz Pn,W = p. Stąd wynika, że jeśli znajdziemy wszystkie wartości Pi,j , to będziemy znali wartość p. 3. PROGRAMOWANIE DYNAMICZNE 46 Wyznaczanie wartości Pi,j Będziemy wyznaczać Pi,j korzystając z Pk,l dla k ≤ i oraz l ≤ i. Przy okazji będziemy również definiować wartości Qi,j . Liczby Qi,j umożliwią nam później uzyskanie informacji o optymalnym rozwiązaniu problemu plecakowego. Stosujemy następującą metodę • dla wszystkich k = 1, . . . , n oraz l = 1, . . . , W przyjmujemy Pk,0 = 0, Qk,0 = 0, P0,l = 0 oraz Q0,l = 0; • dla kolejnych i = 1, . . . , n wykonujemy: – dla kolejnych j = 1, . . . , W wykonujemy: (∗) jeśli j ≥ wi oraz Pi−1,j < Pi,j−wi + ci , to przyjmujemy Pi,j = Pi,j−wi + ci oraz Qi,j = i; w przeciwnym wypadku przyjmujemy Pi,j = Pi−1,j oraz Qi,j = Qi−1,j . Zauważmy że prawdziwość warunku j ≥ wi w (∗) oznacza, że aktualnie rozważany rozmiar plecaka jest wystarczający, aby umieścić tam rzecz Pi . Natomiast prawdziwość warunku Pi−1,j < Pi,j−wi + ci oznacza, że umieszczenie rzeczy Pi zwiększy wartość plecaka. Jeśli oba warunki są spełnione, to umieszczamy w plecaku rzecz Pi (odpowiada za to przypisanie Pi,j = Pi,j−wi + ci oraz Qi,j = i). W przeciwnym przypadku nie umieszczamy (na tym etapie) rzeczy Pi w plecaku, gdyż albo ona się tam nie zmieści, albo jej umieszczenie nie zwiększy wartości plecaka. Liczby Qi,j kontrolują przedmioty, które wkładamy do plecaka. Zwykle wartości Pi,j , Qi,j będziemy zapisywali w postaci n×W macierzach P = (Pi,j ) oraz Q = (Qi,j ). Przykład Rozważmy ten sam przykład, który analizowaliśmy w trakcie omawiania metod zachłannych. Zmniejszymy tylko rozmiar plecaka do W = 18. ci wi P1 6 6 P2 4 2 P3 5 3 P4 7 2 P5 10 3 P6 2 1 W 18 3. PROGRAMOWANIE DYNAMICZNE 47 Tworzymy tablice P oraz Q. P 1 2 3 4 5 6 1 0 2 3 4 0 0 0 Q 1 2 3 4 5 6 1 2 0 0 3 4 0 0 5 6 0 6 7 8 9 6 6 6 5 6 7 0 1 1 8 9 1 1 10 11 12 13 6 6 12 12 14 15 16 17 18 12 12 12 12 18 10 11 12 13 14 1 1 1 1 1 15 16 17 18 1 1 1 1 W pierwszych pięciu kolumnach macierzy P oraz Q mamy zera, ponieważ przedmiot P1 nie mieści się w plecaku o pojemności j = 1, 2, 3, 4, 5. W plecaku o pojemności j = 6, . . . , 11 mieści się jedna rzecz P1 , dlatego w odpowiednich kolumnach macierzy P mamy wartość c1 = 6. W kolumnach macierzy Q stoi 1 (numer przedmiotu, który został ostatnio umieszczony w plecaku). W plecaku o pojemności j = 12, . . . , 17 mieszczą się dwa przedmioty P1 , więc w odpowiednich kolumnach mamy 2 · c1 = 12. W ostatniej kolumnie macierzy P mamy 3 · c1 = 18, ponieważ w plecaku o pojemności 18 mieszczą się trzy sztuki P1 . 3. PROGRAMOWANIE DYNAMICZNE 48 Teraz będziemy wypełniać drugi wiersz macierzy P oraz Q. P 1 2 3 4 5 6 1 0 0 2 3 4 0 0 0 4 4 8 Q 1 2 3 4 5 6 1 2 0 0 0 2 3 4 0 0 2 2 5 6 7 0 6 6 8 12 5 6 7 0 1 1 2 2 8 9 6 6 8 9 1 1 10 11 12 13 14 6 6 12 12 12 10 11 12 13 14 1 1 1 1 1 15 16 17 18 12 12 12 18 15 16 17 18 1 1 1 1 Pierwsze pięć kolumn drugiego wiersza macierzy P oraz Q wypełniamy podobnie jak pierwszy wiersz, ponieważ rzecz P1 nie mieści się w plecaku o pojemności j = 1, . . . , 5. Omówimy teraz dokładnie metodę wypełnienia pól P2,6 oraz Q2,6 . W naszej sytuacji i = 2 oraz j = 6. Warunek w2 < 6 jest oczywiście spełniony. Sprawdzamy teraz warunek Pi−1,j < Pi,j−wi + ci , czyli P1,6 < P2,4 + 4. Warunek ten jest oczywiście prawdziwy (elementy P1,6 oraz P2,4 oznaczyliśmy kolorem zielonym, a element P2,6 kolorem czerwonym). Zgodnie z naszą metodą postępowania musimy przyjąć P2,6 = P2,4 + 4 = 8+4 = 12 oraz Q2,6 = i = 2. Oznacza to, że z plecaka o pojemności 6 usunięto przedmiot P1 oraz umieszczono tam trzy przedmioty P2 . Mamy Q2,6 = 2 ponieważ ostatnią rzeczą włożoną do plecaka jest przedmiot o numerze 2. 4. GRAFY - PODSTAWOWE DEFINICJE 49 Poniżej mamy uzupełnione macierze P oraz Q. P 1 2 3 4 5 6 1 0 0 0 0 0 2 2 3 4 5 0 0 0 0 4 4 8 8 4 5 8 9 7 7 14 14 7 10 14 17 7 10 14 17 6 6 12 12 21 21 21 Q 1 2 3 4 5 6 1 0 0 0 0 0 6 2 0 2 2 4 4 4 7 1 2 3 4 5 5 3 0 2 3 4 5 5 4 0 2 2 4 4 4 5 0 2 3 4 5 5 6 1 2 2 4 4 4 7 6 12 13 21 24 24 8 1 2 2 4 4 4 8 6 16 16 28 28 28 9 1 2 3 4 5 5 9 6 16 17 28 31 31 10 6 20 20 35 35 35 11 6 20 21 35 38 38 12 12 24 24 42 42 42 10 11 12 13 14 1 1 1 1 1 2 2 2 2 2 2 3 2 3 2 4 4 4 4 4 4 5 4 5 4 4 5 4 5 4 13 12 24 25 42 45 45 14 12 28 28 49 49 49 15 12 28 29 49 52 52 16 12 32 32 56 56 56 15 16 17 18 1 1 1 1 2 2 2 2 3 2 3 2 4 4 4 4 5 4 5 4 5 4 5 4 Wartością optymalnie zapełnionego plecaka jest P6,18 = 63. Pokażemy jak wykorzystując dane zapisane w tablicy Q podać optymalne rozwiązanie problemu plecakowego. Ostatnią rzeczą włożoną do plecaka jest ta o numerze Q6,18 = 4, czyli przedmiot P4 . Ponieważ w4 = 2, więc do wypełnienia pozostaje plecak o pojemności 18 − w2 = 16. Odczytujemy element Q6,16 = 4. Zatem przedostatnim elementem umieszczonym w plecaku jest P4 . Dalej postępujemy analogicznie. Ostatecznie musimy do plecaka włożyć 9 sztuk przedmiotu P4 . Mamy p = 9 · c4 = 9 · 7 = 63. 4. Grafy - podstawowe definicje Definicja 4.1. Grafem (prostym) nazywamy parę G = (V (G), E(G)) = (V, E), gdzie V = V (G) jest zbiorem skończonym, którego elementy nazywamy wierzchołkami oraz E = E(G) jest zbiorem nieuporządkowanych par {u, v} dla pewnych u, v ∈ V takich, że u 6= v. Pary te nazywamy krawędziami. Będziemy stosować wymiennie następujące oznaczenia krawędzi: {u, v} = uv = vu = u v. Jeżeli uv ∈ E(G), to wierzchołki u, v nazywamy sąsiednimi, natomiast krawędź uv nazywamy sąsiednią (incydentną) z wierzchołkami u oraz v. 17 12 32 33 56 59 59 18 18 36 36 63 63 63 4. GRAFY - PODSTAWOWE DEFINICJE 50 Stopniem wierzchołka v (ozn. deg(v)) nazywamy liczbę incydentnych z nim krawędzi. Przykład 4.2. Rozważmy następujący graf G: v@ @@ @@ @@ @ w ~~ ~~ ~ ~ ~~ u x? ??? ?? ?? y Mamy: • V = {x, y, u, v, w}; • E = {uv, uw, ux, xy}; • deg(v) = deg(w) = deg(y) = 1, deg(x) = 2, deg(u) = 3; • np. wierzchołki u, v są sąsiednie; wierzchołki u oraz y nie są sąsiednie. Definicja 4.3. Dowolny ciąg wierzchołków d = (x1 , . . . , xn ), gdzie (dla każdego i = 1, . . . , n − 1) wierzchołki xi oraz xi+1 są sąsiednie, nazywamy drogą. Wierzchołki x1 oraz xn nazywamy odpowiednio początkiem oraz końcem drogi d. Mówimy, że wierzchołek v jest osiągalny z wierzchołka u, jeśli istnieje droga o początku w u i końcu w v. Długością drogi d (ozn. ℓ(d)) nazywamy liczbę występujących w niej krawędzi. Cyklem nazywamy drogę d = (x1 , . . . , xn ) taką, że x1 = xn . Drogę d = (x1 , . . . , xn ) nazywamy prostą, jeśli wierzchołki x1 , . . . , xn są parami różne. Cykl d = (x1 , . . . , xn−1 , x1 ) nazywamy prostym, jeśli wierzchołki x1 , . . . , xn−1 są parami różne. Podgrafem grafu G = (V, E) nazywamy dowolny graf G′ = (V ′ , E ′ ) taki, że V ′ ⊆ V oraz E ′ ⊆ E. Graf G nazywamy spójnym, jeśli dla każdej pary wierzchołków u, v ∈ V (G) istnieje droga d = (x1 , . . . , xn ) taka, że x1 = u oraz xn = v. Składową spójności grafu G nazywamy każdy maksymalny spójny podgraf grafu G. Podgrafem grafu G = (V, E) generowanym przez zbiór V ′ ⊆ V nazywamy podgraf G′ = (V ′ , E ′ ) grafu G taki, że uv ∈ E ′ ⇐⇒ u, v ∈ V ′ oraz uv ∈ E. 4. GRAFY - PODSTAWOWE DEFINICJE 51 Uwaga 4.4. Na zbiorze wierzchołków V grafu G definiujemy relację dwuargumentową ∼ w następujący sposób. Niech v, u ∈ V wtedy określamy v ∼ u ⇐⇒ wierzchołki u, v są połączone drogą w G Można łatwo uzasadnić, że ∼ jest relacją równoważności. Niech V1 , . . . , Vm będą wszystkimi klasami abstrakcji relacji ∼. Zauważmy, że podgrafy G1 , . . ., Gm grafu G generowane odpowiednio przez V1 , . . . , Vm są wszystkimi spójnymi składowymi grafu G. Drzewem nazywamy spójny graf, który nie zawiera cyklu prostego. Przykłady 4.5. Graf z Przykładu 4.2 jest drzewem. Poniższy graf G nie jest drzewem, gdyż zawiera on cykl prosty (u, x, y, u). v@ @@ @@ @@ @ w ~~ ~~ ~ ~ ~~ u x? ??? ?? ?? y Powyższy graf jest spójny. Przykładem drogi prostej jest (v, u, x, y); ma ona długość 3. Natomiast droga (v, u, x, y, u, w) (długości 5) nie jest prosta, gdyż wierzchołek u występuje w niej dwukrotnie. Poniższy graf v@ @@ @@ @@ @ w ~ ~~ ~~ ~ ~~ u x? ??? ?? ?? t z y nie jest spójny. Ma on dwie składowe spójności wyznaczone przez zbiory wierzchołków {z, t} oraz {u, v, w, x, y}. Poniżej podamy twierdzenie, które podaje kryteria pozwalające decydować, czy podany graf jest drzewem. Twierdzenie 4.6. Niech G = (V, E) będzie grafem. Następujące warunki są równoważne. 4. GRAFY - PODSTAWOWE DEFINICJE 52 1. G jest drzewem; 2. każde dwa wierzchołki u, v ∈ V są połączone ze sobą dokładnie jedną ścieżką prostą; 3. G jest spójny, lecz jeśli usuniemy jedną krawędź z E, to powstały graf nie będzie spójny; 4. G jest spójny oraz |E| = |V | − 1; 5. G nie zawiera cyklu prostego oraz |E| = |V | − 1; 6. G nie zawiera cyklu prostego, lecz jeśli dodamy jedną krawędź do E, to powstały graf będzie zawierał cykl prosty. Dowód. Dowód tego twierdzenia można znaleźć w książce T. H. Cormen, Ch. E. Leiserson, R. L. Rivest, „Wprowadzenie do algorytmów”, WN-T, Warszawa 2001. Powyższe grafy będziemy czasami nazywać nieskierowanymi. Ważną rolę w badaniach operacyjnych odgrywają również grafy skierowane. Definicja 4.7. Grafem skierowanym (digrafem) nazywamy parę G = (V (G), E(G)) = (V, E), gdzie V = V (G) jest zbiorem skończonym, którego elementy nazywamy wierzchołkami oraz E = E(G) jest zbiorem uporządkowanych par [u, v] dla pewnych u, v ∈ V . Pary te nazywamy krawędziami. Będziemy stosować wymiennie następujące oznaczenia krawędzi: [u, v] = uv = u / v. Pojęcie drogi oraz cyklu definiujemy podobnie jak dla grafów nieskierowanych. W praktycznych zastosowaniach grafów często występują grafy ważone (skierowane lub nie). Definicja 4.8. Niech G = (V, E) będzie grafem (skierowanym lub nie). Funkcją wagową nazywamy dowolną funkcję ω : E → R. 4. GRAFY - PODSTAWOWE DEFINICJE 53 Parę (G, ω), gdzie G = (V, E) jest grafem oraz ω : E → R jest funkcją wagową nazywamy grafem ważonym. Jeżeli uv ∈ E, to wagę ω(uv) krawędzi uv będziemy zapisywać następująco u ω(uv) v lub u ω(uv) / v w przypadku grafów skierowanych. Jeżeli (G, ω) jest grafem ważonym oraz d = (x1 , . . . , xn ) jest drogą w G, to wagą drogi d nazywamy liczbę ω(d) = ω(x1 x2 ) + ω(x2 x3 ) + . . . + ω(xn−1 xn ). 4.1. Reprezentacje grafów Aby pracować z grafami (np. przy pomocy komputera) trzeba je zapisać w wygodnej postaci. Poniżej przedstawimy dwa sposoby reprezentowania grafów. 4.1.1. Macierze sąsiedztwa Niech G = (V, E) będzie grafem (skierowanym lub nie). Załóżmy, że V = {1, . . . , n}. Macierzą sąsiedztwa grafu G nazywamy n×n-macierz M(G) = (mij ) taką, że 1, gdy ij ∈ E mij = 0, gdy ij 6∈ E. Przykłady 4.9. Rozważmy graf nieskierowany G: 1 == == == = 4 2 5 == == == = 3 4. GRAFY - PODSTAWOWE DEFINICJE 54 Wtedy M(G) = 0 1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 Rozważmy graf skierowany H: 1 == == == = 4 @2 . 5 @ === == == /3 Wtedy M(H) = 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 . 4.1.2. Listy sąsiedztwa Niech G = (V, E) będzie grafem (skierowanym lub nie) oraz niech v ∈ V . Listą sąsiedztwa wierzchołka v nazywamy listę L[v] = [x1 , . . . , xm ] wszystkich parami różnych wierzchołków takich, że vxi ∈ E. Przykłady 4.10. Rozważmy graf G z Przykładu 4.9. Wtedy L[1] = [2], L[2] = [1, 3, 5, 4], L[3] = [2, 5], L[4] = [2], L[5] = [3, 2]. 5. MINIMALNE DRZEWA ROZPINAJĄCE 55 Natomiast dla grafu H z Przykładu 4.9 mamy L[1] = [2], L[2] = [3, 5], L[3] = [], L[4] = [2], L[5] = [3]. 5. Minimalne drzewa rozpinające Definicja 5.1. Niech (G, ω) będzie spójnym nieskierowanym grafem ważonym. Drzewem rozpinającym grafu G nazywamy graf T = (V (T ), E(T )) spełniający warunki • V (G) = V (T ); • E(T ) ⊆ E(G); • T jest drzewem; Minimalnym drzewem rozpinającym P grafu G nazywamy drzewo rozpinające T grafu G, którego waga ω(T ) = a∈E(T ) ω(a) jest minimalna. Przykłady zastosowań minimalnych drzew rozpinających zostaną omówione na ćwiczeniach. Przykład 5.2. Rozważmy następujący graf ważony 1 • •@ @@ ~ === 3 ~~ @@1 = ~ == @@ ~ ~ = ~ ==2 == • •@ 1 2 == @@ ~~ == @@ ~ == ~~~3 1 @@ ~ • 1 • 5. MINIMALNE DRZEWA ROZPINAJĄCE 56 Poniżej przerywaną linią zaznaczyliśmy krawędzie, które wchodzą w skład minimalnego drzewa rozpinającego powyższego grafu. ~ 3 ~~ ~ ~ ~~ •@ @ @ 1 @ • =_ _ _1_ _ _ • @ = @1 == @ == @ == 2 == 2 • 1 == == ~~ ~ == ~ = ~~~ 3 •_ _ _ _ _ _• 1 Minimalne drzewo rozpinające powyższego grafu wygląda tak: 1 • •@ @@ @@ 1 @@ •@ @@ @@1 @@ 1 • 1 • • Uwaga 5.3. Minimalne drzewo rozpinające grafu NIE musi być wyznaczone jednoznacznie. 5.1. Algorytm Kruskala Niech dany będzie graf spójny nieskierowany G = (V, E) z funkcją wagową ω : E → R. Poniżej podamy jedną z metod wyznaczania minimalnego drzewa rozpinającego grafu ważonego (G, ω) (algorytm Kruskala). Algorytm Kruskala jest przykładem metody zachłannej, ponieważ w każdym kroku dodaje on do konstruowanego drzewa krawędź o minimalnej wadze. Kruskal(G, ω) • kładziemy E = ∅; • niech α1 , . . . , αm będą wszystkimi krawędziami grafu G posortowanymi niemalejąco względem wag (tzn. ω(α1 ) ≤ ω(α2 ) ≤ . . . ≤ ω(αm )); v ; jeśli wierzchołki u, v leżą w różnych • rozważmy krawędź α1 : u spójnych składowych grafu (V, E), to przyjmujemy E := E ∪ {α1 }; 5. MINIMALNE DRZEWA ROZPINAJĄCE 57 • dalej postępujemy analogicznie, tzn. jeśli rozważyliśmy już krawędzie v ; jeśli wierzchołki u, α1 , . . . , αi , to badamy krawędź αi+1 : u v leżą w różnych spójnych składowych grafu (V, E), to przyjmujemy E := E ∪ {αi+1 }; • po przebadaniu wszystkich krawędzi α1 , . . . , αm kończymy procedurę; jako wynik przyjmujemy T = (V, E). Twierdzenie 5.4. Niech (G, ω) będzie spójnym nieskierowanym grafem ważonym. Jeżeli wykonamy procedurę Kruskal(G, ω), to po jej zakończeniu graf T = (V, E) będzie minimalnym drzewem rozpinającym grafu (G, ω). Dowód. Niech G = (V, E) będzie spójnym nieskierowanym grafem z funkcją wagową ω : E → R oraz niech E = {α1 , . . . , αm } będą ponumerowane w ten sposób, że ω(α1 ) ≤ ω(α2 ) ≤ . . . ≤ ω(αm ). Niech T = (V, E) będzie grafem skonstruowanym przez algorytm Kruskal(G, ω). Zauważmy, że T nie zawiera cykli. Wynika, to z faktu, że w każdym kroku algorytmu dodawane są tylko krawędzie, które łączą różne spójne składowe grafu. Zatem nigdy nie powstanie nam cykl. Zauważmy, że T jest grafem spójnym. Przypuśćmy, że T nie jest grafem spójnym. Istnieją więc przynajmniej dwie różne spójne składowe grafu T . Ponieważ G jest grafem spójnym, więc istnieje krawędź α ∈ E(G), która łączy te dwie składowe. Krawędź α musiałaby być dodana w trakcie algorytmu do grafu T . Wynika stąd, że T jest spójny. Zatem T jest drzewem, ponieważ jest spójny oraz nie zawiera cykli. Załóżmy, że E = {αi1 , . . . , αis }. Niech T ′ = (V, E ′ ) będzie minimalnym drzewem rozpinającym grafu G. Z Twierdzenia 4.6 wynika, że |E| = |E ′ |. Niech E ′ = {αj1 , . . . , αjs }. Ponadto załóżmy, że spośród wszystkich minimalnych drzew rozpinających grafu G drzewo T ′ zostało wybrane tak aby αi1 = αj1 , . . . , αik = αjk dla możliwie największego k. Wynika stąd, że αik+1 6∈ E ′ . Istotnie, jeśli αik+1 ∈ E ′ , to z naszych założeń wynika, że ik+1 > jk+1 oraz ω(αjk+1 ) ≤ ω(αik+1 ). Więc krawędź αjk+1 byłaby w algorytmie Kruskala rozważana przed krawędzią αik+1 i byłaby ona w drzewie T . Zatem αik+1 6∈ E ′ . Jeżeli dodamy krawędź αik+1 do drzewa T ′ , to otrzymamy dokładnie jeden cykl prosty (patrz Twierdzenie 4.6). Weźmy krawędź α należącą do tego cyklu taką, że α 6= αik+1 oraz α 6∈ E (taka krawędź istnieje, gdyż w przeciwnym wypadku wszystkie krawędzie z tego cyklu należałyby do E, więc T nie byłoby drzewem). Zatem α 6∈ {αi1 , . . . , αik , αik+1 }. Gdyby ω(α) > ω(αik+1 ), to graf T ′′ = (V, (E ′ \ {α}) ∪ {αik+1 }) byłby drzewem rozpinającym grafu G takim, 5. MINIMALNE DRZEWA ROZPINAJĄCE 58 że ω(T ′′) < ω(T ′ ) co przeczy temu, że T ′ jest minimalnym drzewem rozpinającym grafu G. Stąd wynika, że ω(α) ≤ ω(αik+1 ). Gdyby ω(α) < ω(αik+1 ), to algorytm Kruskala wybrałby krawędź α przed krawędzią αik+1 . Zatem w E mielibyśmy krawędź α zamiast αik+1 . Zauważmy, że wymiana krawędzi α na αik+1 nie generuje nam cyklu, gdyż α oraz αik+1 leżą na jednym cyklu w grafie T ′ z dodaną krawędzią αik+1 . Ostatecznie ω(α) = ω(αik+1 ). Zatem T ′′ = (V, (E ′ \ {α}) ∪ {αik+1 }) jest również minimalnym drzewem rozpinającym grafu G zawierającym krawędzie {α1 , . . . , αk , αk+1}, co przeczy wyborowi indeksu k oraz drzewa T ′ . Ostatecznie pokazaliśmy, że T = T ′ jest minimalnym drzewem rozpinającym grafu G. Przykład 5.5. Rozważmy następujący graf ważony x1 ppp 2 ppp p p pp ppp NNN NNN NNN 1 NNNN x2 6 5 x3 x5 1 3 7 2 x4 x7 NN 2 5 NNN NN4N NNN NN x8 5 ppp p p pp ppp 2 ppp x6 Poniżej przedstawimy poszczególne etapy tworzenia minimalnego drzewa rozpinającego przy pomocy algorytmu Kruskala. Zaczynamy od grafu, który ma te same wierzchołki co graf wyjściowy oraz nie ma żadnej krawędzi. x2 x5 x7 x1 x8 x3 x4 x6 Będziemy dodawać krawędzie zaczynając od tych z minimalnymi wagami. 5. MINIMALNE DRZEWA ROZPINAJĄCE x2 x1 OOO OOO OOO OOO 1 O OOO OOO OOO OOO 1 O x7 x8 x3 x2 x1 x5 59 x3 x4 x6 x5 x7 1 x8 x4 x6 x5 o x2 ooo o o o ooo ooo OOO 1 OOO OOO OOO 1 O x7 2 x1 x3 x4 x2 x5 ooo o o oo ooo ooo 2 OOO 1 OOO OOO OOO 1 O x8 x6 x7 2 x1 x3 x4 x8 x6 x2 x5 x7 ooo o o oo ooo ooo 2 OOO 1 2 OOO OOO OOO 1 O 2 x1 x3 x4 x8 x6 x2 x5 x7 ooo o o oo ooo o o o x 2 OOO o 8 1 2 OOO ooo o OOO o OOO ooo2 1 O ooo o x x x 2 x1 3 4 6 Zauważmy, że teraz krawędzią o minimalnej wadze jest krawędź x3 x4 . Nie możemy jej jednak dodać ponieważ łączy ona wierzchołki z tej samej spójnej 6. PROBLEM NAJKRÓTSZYCH DRÓG 60 składowej. Dodajemy więc krawędź x7 x8 . ppp x2 x7 NN x5 2 ppp x1 p ppp p p p NNN NNN NNN 1 NNNN 2 1 x3 2 x4 x6 NNN NN4N NNN NN x8 ppp p p pp ppp 2 p p p Do powyższego grafu nie można już dodać żadnej krawędzi. Graf ten jest więc minimalnym drzewem rozpinającym wyjściowego grafu. 6. Problem najkrótszych dróg Niech dany będzie skierowany graf ważony (G, ω) oraz wierzchołek a ∈ V (G). Naszym zadaniem będzie, dla każdego wierzchołka b ∈ V (G), znaleźć drogę d = (x1 , . . . , xn ) taką, że x1 = a, xn = b oraz waga ω(d) drogi d jest minimalna. Jasne jest, że taka droga (jeśli istnieje) nie musi być wyznaczona jednoznacznie. Powyższy problem będziemy nazywać problemem najkrótszych dróg z jednym źródłem (NDJZ). Uwaga 6.1. Zauważmy, że nie dla wszystkich grafów ważonych istnieje droga o minimalnej wadze. Rozważmy następujący graf ważony 3 a x 9 b. −6 Mamy wtedy np. ω((a, b, a)) = −3, ω((a, b, a, b, a, b, a)) = −9. Łatwo zauważyć, że istnieje droga o wadze mniejszej od dowolnie małej liczby rzeczywistej. Nie istnieje więc droga o minimalnej wadze. Powyższy problem możemy rozwiązać na dwa następujące sposoby. 1. Możemy założyć, że funkcja wagowa ω : E(G) → R jest nieujemna, tzn. ω(α) ≥ 0 dla dowolnej krawędzi α ∈ E(G). Zauważmy, że przy tym założeniu istnieją drogi o minimalnej wadze. 6. PROBLEM NAJKRÓTSZYCH DRÓG 61 2. Możemy założyć, że w grafie żaden cykl o ujemnej wadze (tzn. taki cykl d, że ω(d) < 0) nie jest osiągalny z wierzchołka a (tzn. nie istnieje droga (x1 , . . . , xn ) taka, że x1 = a oraz xn jest wierzchołkiem, który leży na cyklu o ujemnej wadze). W tej sytuacji również istnieją drogi z a do b o ujemnej wadze. Uwaga 6.2. Zauważmy, że problem (NDJZ) może (po pewnych modyfikacjach) służyć do rozwiązania następujących problemów. • Problem najkrótszych dróg z jednym ujściem. Dla danego wierzchołka b ∈ V (G) oraz wszystkich wierzchołków a ∈ V (G) znaleźć drogi (x1 , . . . , xn ) o minimalnej wadze takie, że x1 = a oraz xn = b. Tutaj wystarczy odwrócić kierunek strzałek w grafie oraz rozwiązać problem (NDJZ). • Problem najkrótszych dróg między parą wierzchołków. Dla danych wierzchołków a, b ∈ V (G) znaleźć drogę (x1 , . . . , xn ) o minimalnej wadze taką, że x1 = a oraz xn = b. • Problem najkrótszych dróg między wszystkimi parami wierzchołków. Dla wszystkich par wierzchołków a, b ∈ V (G) znaleźć drogi (x1 , . . . , xn ) o minimalnej wadze takie, że x1 = a oraz xn = b. Najprostszą metodą znajdowania najkrótszych dróg w grafie może wydawać się rozważenie wszystkich możliwych dróg oraz wybranie tej najkrótszej. Niestety metoda ta przeważnie jest zbyt czasochłonna. Jeżeli rozważamy duże grafy (np. grafy reprezentujące sieć połączeń drogowych albo kolejowych), to wszystkich możliwych dróg jest tak dużo, że nawet najszybsze komputery będą miały problemy z rozważeniem (w rozsądnym czasie) wszystkich możliwości. Potrzebne są zatem szybsze metody znajdowania najkrótszych dróg. Poniżej opiszemy dwie z nich. 6.1. Algorytm Dijkstry Niech (G, ω) będzie skierowanym grafem ważonym oraz niech s ∈ V (G) będzie ustalonym wierzchołkiem. Załóżmy ponadto, że funkcja wagowa ω jest nieujemna (tzn. ω(α) ≥ 0 dla każdej krawędzi α ∈ E(G)). Przy powyższych założeniach algorytm Dijkstry rozwiązuje problem (NDJZ), gdzie 6. PROBLEM NAJKRÓTSZYCH DRÓG 62 źródłem jest wierzchołek s. Oczywiście algorytm wyznaczy najkrótsze drogi tylko do wierzchołków osiągalnych z wierzchołka s. Algorytm Dijkstry stosuje strategię zachłanną. Będziemy wykorzystywać dwie tablice rozmiaru |V (G)|, które będą indeksowane wierzchołkami grafu G. Pierwsza z nich δ = [δ(v)]v∈V (G) będzie służyła do przechowywania informacji o długości aktualnie rozważanych dróg. Bardziej precyzyjnie: δ[v] będzie długością aktualnie rozważanej drogi o początku w s oraz końcu w wierzchołku v. Po zakończeniu działania algorytmu δ[v] będzie długością najkrótszej drogi o początku w wierzchołku s oraz końcu w wierzchołku v. Druga tablica π = [π(v)]v∈V (G) będzie służyła do przechowywania poprzedników wierzchołków w rozważanych drogach. Po zakończeniu algorytmu przy pomocy tablicy π będziemy mogli skonstruować najkrótsze drogi z s do wierzchołków v. Dijkstry(G, ω, s) • kładziemy Q = V (G); • dla każdego wierzchołka v ∈ V (G) kładziemy δ[v] = ∞ oraz π[v] = ⊘; • kładziemy δ[s] = 0; • tak długo jak Q 6= ∅ wykonujemy następujące operacje: – wybieramy wierzchołek u ∈ Q taki, że δ[u] jest minimalne; następnie usuwamy wierzchołek u ze zbioru Q (tzn. Q := Q \ {u}); – dla każdego wierzchołka v z listy sąsiedztwa L[u] wierzchołka u wykonujemy: (∗) jeżeli δ[v] > δ[u] + ω(uv), to kładziemy δ[v] := δ[u] + ω(uv) oraz π[v] := u. Twierdzenie 6.3. Jeżeli wykonamy algorytm Dijkstry(G, ω, s) dla grafu skierowanego G z nieujemną funkcją wagową ω oraz wierzchołkiem źródłowym s, to po zakończeniu działania algorytmu wartość δ[v] jest długością najkrótszej drogi z s do v (dla każdego v ∈ V (G)). Dowód. Dowód tego twierdzenia można znaleźć w książce T. H. Cormen, Ch. E. Leiserson, R. L. Rivest, „Wprowadzenie do algorytmów”, WN-T, Warszawa 2001. 6. PROBLEM NAJKRÓTSZYCH DRÓG 63 Przeanalizujmy poniższy przykład, który ilustruje działanie algorytmu Dijkstry oraz dokładnie wyjaśnia rolę tablic δ, π. Przykład 6.4. Rozważmy następujący graf ważony: @b 10 11 28 /c a= O == == == == = 22 31 == == == d 26 / eO 30 17 14 20 12 15 /io k O ^== == == == == 31 23 == == == j= = 9 @ fO >> >> >> >> 15 >> 19 >> >> >> 26 /g /h / 18 == == == 32 == == == == /l Zastosujemy do tego grafu algorytm Dijkstry. Zakładamy, że źródłem jest wierzchołek s = a. Mamy Q = {a, b, c, d, e, f, g, h, i, j, k, l}. Tablice δ oraz π wyglądają następująco: δ: a b 0 ∞ c d e f ∞ ∞ ∞ ∞ g h i j ∞ ∞ ∞ ∞ π: a b c d e f g ⊘ ⊘ ⊘ ⊘ ⊘ ⊘ ⊘ k l ∞ ∞ h i j k l ⊘ ⊘ ⊘ ⊘ ⊘ Usuwamy wierzchołek a ze zbioru Q, więc Q = {b, c, d, e, f, g, h, i, j, k, l}. Rozważamy listę sąsiedztwa wierzchołka a: L[a] = [b, c, d]. Dla każdego wierzchołka z tej listy sąsiedztwa wykonujemy (∗) z algorytmu Dijkstry. Mamy zatem: δ: a b c 0 10 28 π: a b ⊘ a c a d e f g 31 ∞ ∞ ∞ d e a ⊘ h i j k ∞ ∞ ∞ ∞ l ∞ f g h i j k l ⊘ ⊘ ⊘ ⊘ ⊘ ⊘ ⊘ Ze zbioru Q usuwamy wierzchołek v, który ma minimalną wartość δ[v]. Jest to wierzchołek b. Zatem Q = {c, d, e, f, g, h, i, j, k, l}. Rozważamy listę 6. PROBLEM NAJKRÓTSZYCH DRÓG 64 sąsiedztwa wierzchołka b: L[b] = [e, c]. Dla każdego wierzchołka z tej listy sąsiedztwa wykonujemy (∗) z algorytmu Dijkstry. Mamy zatem: δ: a b c 0 10 21 π: a b ⊘ a c b d e f g h 31 36 ∞ ∞ ∞ d a e b i j k l ∞ ∞ ∞ ∞ f g h i j k l ⊘ ⊘ ⊘ ⊘ ⊘ ⊘ ⊘ Następnym rozważanym wierzchołkiem jest c. Wtedy Q = {d, e, f, g, h, i, j, k, l}, L[c] = [f ] oraz δ: a b c 0 10 21 π: a b ⊘ a c b d e f g h 31 36 35 ∞ ∞ d a e b i j k l ∞ ∞ ∞ ∞ f g h i j c ⊘ ⊘ ⊘ ⊘ k l ⊘ ⊘ Teraz rozważamy wierzchołek d. Mamy Q = {e, f, g, h, i, j, k, l}, L[d] = [c, f, g] oraz δ: a b c 0 10 21 π: a b ⊘ a c b d e f g h 31 36 35 43 ∞ d a e b f g h c d ⊘ i j k l ∞ ∞ ∞ ∞ i j k l ⊘ ⊘ ⊘ ⊘ Kolejny wierzchołek to f . Mamy Q = {e, g, h, i, j, k, l}, L[f ] = [h] oraz δ: a b c 0 10 21 π: a b ⊘ a c b d e f g h i 31 36 35 43 50 ∞ d a e b f g h c d f j k l ∞ ∞ ∞ i j k l ⊘ ⊘ ⊘ ⊘ Teraz musimy rozważyć wierzchołek e. Mamy Q = {g, h, i, j, k, l}, L[e] = 6. PROBLEM NAJKRÓTSZYCH DRÓG 65 [i] oraz δ: a b c 0 10 21 π: a b ⊘ a c b d e f g h i 31 36 35 43 50 66 d a e b f g h c d f i e j k l ∞ ∞ ∞ j k l ⊘ ⊘ ⊘ Po rozważeniu wierzchołka g tablice δ oraz π nie ulegną zmianie. Mamy teraz Q = {h, i, j, k, l}. Kolejny wierzchołek to h. Mamy Q = {i, j, k, l}, L[h] = [i, l] oraz δ: a b c 0 10 21 π: a b ⊘ a c b d e f g h i 31 36 35 43 50 59 d a e b f g h c d f i h j k l ∞ ∞ 68 j k l ⊘ ⊘ h Zauważmy, że rozważając kolejne wierzchołki nie zmienimy tablic δ oraz Q. Kończymy wykonywanie algorytmu. W tablicy δ mamy zapisane długości najkrótszych ścieżek do poszczególnych wierzchołków. Zauważmy, że wierzchołki j, k nie są osiągalne z wierzchołka a, zatem długości odpowiednich dróg są równe ∞. Korzystając z tablicy π odczytamy najkrótszą drogę z wierzchołka a do wierzchołka l. Drogę tę będziemy konstruować „od końca”. Mamy d[l] = h, więc do wierzchołka l „przyszliśmy” z wierzchołka h. Natomiast d[h] = f , więc do wierzchołka h „przyszliśmy” z wierzchołka f . Postępujemy tak dalej. Wierzchołki poszukiwanej drogi zaznaczyliśmy w poniższej tabeli kolorem niebieskim. π: a b ⊘ a c b d a e b f g h c d f i h j k l ⊘ ⊘ h Poszukiwaną drogą jest więc (a, b, c, f, h, l). Podobnie konstruujemy pozostałe drogi. 6.2. Algorytm Bellmana-Forda W tym rozdziale opiszemy algorytm, który rozwiązuje problem (NDJZ) w ogólniejszym przypadku niż algorytm Dijkstry. 6. PROBLEM NAJKRÓTSZYCH DRÓG 66 Niech (G, ω) będzie grafem skierowanym z funkcją wagową ω : E(G) → R oraz wierzchołek s ∈ V (G). Funkcja wagowa może przyjmować wartości ujemne. Jeżeli w grafie istnieje cykl o ujemnej wadze, to algorytm zwróci wartość ”false”; w przeciwnym wypadku algorytm zwróci wartość ”true” oraz najkrótsze drogi wraz z wagami (zapisane w tablicach δ oraz π podobnie jak w algorytmie Dijkstry). W przeciwieństwie do algorytmu Dijkstry, działanie algorytmu Bellmana-Forda nie jest intuicyjne (nie jest to algorytm zachłanny). Bellman-Ford(G, ω, s) • dla każdego wierzchołka v ∈ V (G) kładziemy δ[v] = ∞ oraz π[v] = ⊘; • kładziemy δ[s] = 0; • |V (G)| − 1 razy wykonujemy następujące operacje: – dla każdej krawędzi uv ∈ E(G) wykonujemy: (∗) jeżeli δ[v] > δ[u] + ω(uv), to kładziemy δ[v] := δ[u] + ω(uv) oraz π[v] := u; • dla każdej krawędzi uv ∈ E(G) wykonujemy: – jeżeli δ[v] > δ[u] + ω(uv), to kończymy algorytm z wynikiem: ”false”; • kończymy algorytm z wynikiem: ”true”. Twierdzenie 6.5. Niech (G, ω) będzie grafem skierowanym z funkcją wagową ω : E(G) → R oraz źródłem s ∈ V (G). Jeżeli w G istnieje cykl o ujemnej wadze osiągalny ze źródła s, to algorytm Bellman-Ford(G, ω, s) zwraca wartość ”false”; w przeciwnym wypadku algorytm ten zwraca wartość ”true” oraz wartość δ[v] jest długością najkrótszej drogi z s do v (dla każdego v ∈ V (G)). Dowód. Dowód tego twierdzenia można znaleźć w książce T. H. Cormen, Ch. E. Leiserson, R. L. Rivest, „Wprowadzenie do algorytmów”, WN-T, Warszawa 2001. 6. PROBLEM NAJKRÓTSZYCH DRÓG 67 Przykłady 6.6. Rozważmy następujący graf ważony: 3 a x 9 b, −6 gdzie źródłem jest wierzchołek s = a. Mamy δ[a] = 0, δ[b] = ∞, π[a] = ⊘, π[b] = ⊘ oraz |V (G)| − 1 = 1. Zatem dla dwóch krawędzi ab oraz ba musimy wykonać (∗). Sprawdzamy, czy δ[b] > δ[a] + ω(ab). Warunek ten jest prawdziwy, więc przyjmujemy δ[b] := 0 + (−6) = −6 oraz π[b] = a. Teraz sprawdzamy, czy 0 = δ[a] > δ[b] + ω(ba) = −6 + 3 = −3. Warunek ten jest prawdziwy, więc przyjmujemy δ[a] := (−6) + 3 = −3 oraz π[a] = b. Przechodzimy do następnego kroku algorytmu. Sprawdzamy, czy −6 = δ[b] > δ[a] + ω(ab) = −3 + (−6) = −9. Warunek ten jest prawdziwy, więc kończymy algorytm z wynikiem ”false”. Oznacza to, że w grafie istnieje cykl o ujemnej wadze osiągalny ze źródła. Rozważmy teraz następujący graf ważony: 6 a x 9 b, −3 gdzie źródłem jest wierzchołek s = a. Mamy δ[a] = 0, δ[b] = ∞, π[a] = ⊘, π[b] = ⊘ oraz |V (G)| − 1 = 1. Zatem dla dwóch krawędzi ab oraz ba musimy wykonać (∗). Sprawdzamy, czy δ[b] > δ[a] + ω(ab). Warunek ten jest prawdziwy, więc przyjmujemy δ[b] := 0 + (−3) = −3 oraz π[b] = a. Teraz sprawdzamy, czy 0 = δ[a] > δ[b] + ω(ba) = −3 + 6 = 3. Warunek ten jest fałszywy. Przechodzimy do następnego kroku algorytmu. Sprawdzamy, czy −3 = δ[b] > δ[a]+ω(ab) = 0+(−3) = −3. Warunek ten jest fałszywy. Sprawdzamy, czy 3 = δ[a] > δ[b]+ω(ba) = 0+6 = 6. Warunek ten jest fałszywy. Kończymy, więc algorytm z wynikiem ”true”. Tablice δ oraz π odczytujemy w ten sam sposób jak w algorytmie Dijkstry.