Motywacja: certyfikat optymalności
Dla niektórych problemów znane są algorytmy, które wraz z rozwiązaniem generują tzw. certyfikat poprawności, czyli dodatkową informację z pomocą której możemy łatwo (tzn. algorytmem, który jest nie tylko wielomianowy, ale również istotnie prostszy od algorytmu generującego rozwiązanie) sprawdzić, czy
zwrócone rozwiązanie jest poprawne (lub optymalne w przypadku problemów optymalizacyjnych). Algorytmy te określane są mianem algorytmów certyfikujących. Oto kilka przykładów:
- Algorytm sprawdzający, czy dany graf jest dwudzielny może zwracać 2-kolorowanie takiego grafu lub cykl nieparzysty.
- Algorytm znajdowania maksymalnego przepływu wraz z przepływem może zwracać minimalny przekrój.
- Istnieje algorytm testujący planarność grafów, który zwraca rysunek na płaszczyźnie bez przecięć krawędzi lub podgraf homeomorficzny z K3,3 lub K5.
Algorytmy certyfikujące oprócz znaczenia teoretycznego (aby generować takie certyfikaty należy dobrze zrozumieć problem) mają dużą wartość praktyczną: pomyślmy choćby o testowaniu poprawności kodu.
Czy dla programowania liniowego istnieją certyfikaty poprawności? Rozważmy decyzyjną wersję problemu programowania liniowego: mając dany (minimalizacyjny) PL i liczbę δ rozstrzygnąć, czy istnieje dopuszczalny x taki, że cTx≤δ. Załóżmy dla uproszczenia, że nasz program jest ograniczony. Wraz z odpowiedzią TAK algorytm certyfikujący może zwrócić współrzędne x (można nawet pokazać, że te współrzędne można reprezentować w pamięci wielomianowej względem rozmiaru danych). A więc istnieje certyfikat pozytywny. Z punktu widzenia teorii złożoności, dowodzi to, że problem jest w klasie NP. W dodatku algorytm weryfikacji certyfikatu jest banalny: po prostu sprawdzamy odpowiednie nierówności. Czy możemy podać certyfikat negatywny, tzn. certyfikat poprawności dla odpowiedzi NIE? Gdyby ten certyfikat był również krótki, mielibyśmy dowód, że programowanie liniowe jest w klasie co-NP.
W tym rozdziale przedstawimy pojęcie dualności programowania liniowego, które dostarcza odpowiedzi na powyższe pytania. Jak zobaczymy w kolejnych wykładach, dualność programowania liniowego ma dużo więcej konsekwencji w matematyce i informatyce.
Poszukiwanie ograniczenia na wartość rozwiązania optymalnego
Rozważmy następujący PL w postaci standardowej:
Łatwo sprawdzić, że punkt (x1=2,x2=0,x3=4) jest rozwiązaniem dopuszczalnym o wartości funkcji celu 14.
Zauważmy, że skoro x1,x2,x3≥0, to 3x1≤4x1, a także −x2≤2x2 oraz 2x3≤3x3. Stąd, 3x1−x2+2x3≤4x1+2x2+3x3≤20. Dostaliśmy górne ograniczenie! W tym przypadku możemy zauważyć nawet więcej. Ponieważ 3≤1+12⋅4, −1≤−1+12⋅2 oraz 2≤12+12⋅3, więc
3x1−x2+2x3≤x1−x2+12x3+12⋅(4x1+2x2+3x3)≤4+12⋅20=14.
Udowodniliśmy (choć, trzeba przyznać, dość fartownie), że wartość funkcji celu nigdy nie przekracza 14, a więc mamy certyfikat optymalności, w dodatku bardzo krotki (kilka nierówności) i prosty do sprawdzenia.
Możemy to rozumowanie uogólnić: można brać dowolne kombinacje liniowe nierówności t.ż.:
- współczynniki kombinacji liniowej są nieujemne (bo inaczej odwrócą się kierunki nierówności),
- dla dowolnego i, współczynnik funkcji celu przy xi jest ograniczony z góry przez odpowiednią kombinację liniową współczynników przy xi w nierównościach.
Można to zapisać za pomocą programu liniowego:
Powyższy program będziemy nazywać programem dualnym do programu (P1). Ogólnie, dla programu (będziemy go nazywać programem prymalnym)
program dualny ma postać:
Zauważmy, że macierz współczynników ograniczeń programu (D2) jest transpozycją macierzy dla programu (P2) (porównaj też dla programów (P1) i (D1)). Daje to niezwykle prosty, mechaniczny sposób konstruowania programu dualnego. Mianowicie dla programu
zmaksymalizujcTxz zachowaniem warunkówAx≤bx≥0
program dualny ma postać:
zminimalizujbTyz zachowaniem warunkówATy≥cy≥0
Dualność jest relacją symetryczną, tzn. mówimy także, że (P2) jest dualny do (D2). Innymi słowy, program dualny do programu dualnego to program prymalny.
Słaba dualność i komplementarne warunki swobody
Pozostańmy przy programach w postaci standardowej. Z konstrukcji programu dualnego wynika następujący fakt (dla porządku podamy jednak dowód).
Twierdzenie 1 [o słabej dualności]
Niech x i y będą dowolnymi rozwiązaniami dopuszczalnymi odpowiednio programów (P2) i (D2). Wówczas cTx≤bTy.
Dowód
Ponieważ dla każdego j=1,…,n, mamy xj≥0 oraz ∑mi=1aijyi≥cj, więc
(∗)cjxj≤(m∑i=1aijyi)xj∀j=1,…,n.
Podobnie, ponieważ dla każdego i=1,…,m, mamy yi≥0 oraz ∑nj=1aijxj≤bi, więc
(∗∗)(n∑j=1aijxj)yi≤biyi∀i=1,…,m.
Stąd,
(∗∗∗)cTx=n∑j=1cjxj≤n∑j=1(m∑i=1aijyi)xj=m∑i=1(n∑j=1aijxj)yi≤m∑i=1biyi=bTy. ♦
Zastanówmy się, kiedy rozwiązania optymalne programu prymalnego (P2) i dualnego (D2) spotykają się, czyli cTx=bTy. Z dowodu twierdzenia o słabej dualności widzimy, że jest tak wtedy i tylko wtedy gdy obie nierówności w (***) są równościami. Tak może się wydarzyć tylko wtedy, gdy gdy wszystkie nierówności w (*) i (**) są równościami. To dowodzi następującego twierdzenia:
Twierdzenie (o komplementarnych warunkach swobody)
Niech x i y będą rozwiązaniami dopuszczalnymi odpowiednio dla zadania prymalnego i dualnego w postaci standardowej. Rozwiązania x i y są oba optymalne wtedy i tylko wtedy gdy
- prymalne komplementarne warunki swobody: dla każdego j=1,…,n albo xj=0 albo ∑mi=1aijyi=cj.
(tzn. albo xj=0 albo j-ta nierówność programu dualnego jest spełniona z równością.)
- dualne komplementarne warunki swobody dla każdego i=1,…,m albo yi=0 albo ∑nj=1aijxj=bi.
(tzn. albo yi=0 albo i-ta nierówność programu prymalnego jest spełniona z równością.)
Programy dualne do ogólnych programów liniowych
Nawet gdy program nie jest w postaci standardowej możemy napisać program dualny, kierując się tą samą zasadą: poszukujemy jak najlepszego górnego ograniczenia na wartość funkcji celu. Zobaczmy np. co się dzieje, gdy program zawiera równość:
zmaksymalizuj3x1−x2+2x3z zachowaniem warunkówx1−x2+12x3≤4−4x1−2x2−3x3=−20x1,x2,x3≥0
Podobnie jak poprzednio, dodając pierwszy warunek pomnożony przez y1=1 do drugiego warunku pomnożonego przez y2=−12 dostajemy ograniczenie górne równe 14. Zauważmy, że w kombinacji liniowej warunków, współczynniki dla nierówności muszą być nieujemne, natomiast dla równości mogą być dowolne (w tym przypadku wybraliśmy ujemny). Program dualny wygląda następująco:
zminimalizuj4y1+20y2z zachowaniem warunkówy1+4y2≥3−y1+2y2≥−112y1+3y2≥2y1≥0.
A co by się stało, gdyby w programie prymalnym dodatkowo mogły się pojawiać zmienne bez warunku nieujemności? Rozważmy np.
zmaksymalizuj3x1−x2+2x3z zachowaniem warunkówx1−x2+12x3≤44x1+2x2+3x3=20x1,x3≥0
Wówczas nie możemy już napisać, że 3x1−x2+2x3≤4x1+2x2+3x3, gdyż niekoniecznie −x2≤2x2. Jeśli jednak pomnożymy pierwszą nierówność przez 3 i dodamy do drugiej, dostaniemy:
3x1−x2+2x3≤3(x1−x2+12x3)+4x1+2x2+3x3≤12+20=32,
gdyż 3x1≤7x1, −x2=−x2 oraz 2x3≤3x3. Znalezienie najlepszej kombinacji liniowej warunków odpowiada programowi:
zminimalizuj4y1+20y2z zachowaniem warunkówy1+4y2≥3−y1+2y2=−112y1+3y2≥2y1≥0.
Ogólnie, program dualny konstruujemy zgodnie z poniższą zasadą:
Można łatwo sprawdzić, że program dualny zbudowany zgodnie z powyższymi wytycznymi również spełnia twierdzenie o słabej dualności (a także twierdzenie o silnej dualności, które udowodnimy w kolejnym punkcie).
Silna dualność
Twierdzenie o słabej dualności można również wyrazić w następujący sposób:
Wniosek
Jeśli z jest wartością funkcji celu rozwiązania optymalnego prymalnego minimalizacyjnego PL, natomiast w jest wartością funkcji celu rozwiązania optymalnego programu dualnego, to z≥w.
Wynika stąd w szczególności, że gdy z=w, to rozwiązanie optymalne programu dualnego jest certyfikatem optymalności naszego rozwiązania programu prymalnego. Okazuje się, że tak jest zawsze!
Twierdzenie (o silnej dualności)
Jeśli z jest wartością funkcji celu rozwiązania optymalnego prymalnego PL, natomiast w jest wartością funkcji celu rozwiązania optymalnego programu dualnego, to z=w.
Dowód
Dla uproszczenia przeprowadzimy dowód dla przypadku programu w maksymalizacyjnej postaci standardowej (dowód dla ogólnej postaci jest analogiczny). Oto program prymalny:
Niech x∗ będzie rozwiązaniem optymalnym programu prymalnego (P3). Ze słabej dualności, wystarczy pokazać rozwiązanie dopuszczalne y programu dualnego (D3) t.ż. cTx∗=bTy. Uruchamiamy algorytm simplex (patrz poprzedni wykład) na programie (P3).
W pierwszej iteracji algorytm simplex buduje program
Rozważmy program z ostatniej iteracji algorytmu simplex.
Ponieważ program prymalny jest ograniczony, więc dla każdego j∈N, c′j≤0 oraz algorytm simplex zwraca rozwiązanie optymalne x∗ takie, że
x∗i={0gdy i∈Nb′igdy i∈B.
Określimy teraz pewne rozwiązanie programu dualnego (D3):
yi:={−c′n+igdy n+i∈N0w p. p.
Pokażemy teraz, że y jest dopuszczalny o wartości funkcji celu równej cTx∗. Określamy c′j:=0 dla j∈B. Wówczas pierwszy warunek programu (P3-stop) możemy zapisać jako z=v+∑n+mj=1c′jxj.
Weźmy dowolne (x1,…,xn)∈Rn. Określmy xn+i=bi−∑ni=1aijxj oraz z=∑ni=1aijxj. Wówczas (z,x1,…,xn+m) jest rozwiązaniem dopuszczalnym programu (P3-start). Ponieważ program (P3-stop) jest równoważny (P3-start), tzn. powstaje z (P3-start) na drodze ciągu operacji elementarnych, więc (z,x1,…,xn+m) jest również rozwiązaniem dopuszczalnym programu (P3-stop). Z faktu, iż w obu programach spełnione są warunki zawierające zmienną z mamy, iż:
∑nj=1cjxj=v+∑n+mj=1c′jxj=v+∑nj=1c′jxj+∑mi=1c′n+ixn+i=v+∑nj=1c′jxj+∑mi=1(−yi)(bi−∑nj=1aijxj).
Po przegrupowaniu dostajemy, że dla dowolnego (x1,…,xn)∈Rn,
n∑j=1cjxj=(v−m∑i=1yibi)+n∑j=1(c′j+m∑i=1yiaij)xj.
Podstawiamy (x1,…,xn)=(0,…,0) i mamy v=∑mi=1yibi. Ponieważ cTx∗=v, więc cTx∗=bTy. Pozostaje pokazać dopuszczalność y. W tym celu rozważmy dowolne k∈{1,…,n}. Podstawiamy xj=[j=k] dla każdego j=1,…,n. Otrzymujemy
ck=(v−m∑i=1yibi)⏟=0+c′k⏟≤0+m∑i=1yiaik,
co implikuje ∑mi=1yiaik≥ck dla każdego k, czyli ATy≥c. Zauważmy, że ponieważ c′j≤0 dla każdego j, więc y≥0. Pokazaliśmy zatem, że y jest rozwiązaniem dopuszczalnym programu (D3) o wartości funkcji celu cTx∗, co kończy dowód. ♦
Z powyższego dowodu wynika, że algorytm simplex znajduje równocześnie rozwiązania optymalne programu prymalnego i dualnego. W niektórych sytuacjach możemy uzyskać skrócenie czasu działania algorytmu stosując tzw. dualny algorytm simplex, tzn. uruchamiać algorytm simplex dla programu dualnego.