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.

Podobne dokumenty