Laboratorium Metod Optymalizacji Grupa nr... Sekcja nr... Ćwiczenie nr 4 Temat: Programowanie liniowe (dwufazowa metoda sympleksu). Lp. 1 Nazwisko i imię Leszek Zaczyński Obecność ocena Sprawozdani e ocena Ocena średnia Uwagi 2 Krzysztof Wojsa 3 4 5 6 Ćwiczenie wykonano Sprawozdanie oddano Data 19 grudnia 27 Data
Treść zadania Napisać program implementujący rozwiązywanie zagadnienia programowania liniowego za pomocą dwufazowej metody sympleksu. Program powinien wykrywać sytuacje patologiczne (brak rozwiązań, nieskończenie wiele rozwiązań). Dodatkowym atutem programu będzie wyświetlanie tablicy sympleksowej. Teoria Zadanie programowania liniowego (LP): Zadanie programowania liniowego w postaci standardowej polega na minimalizacji funkcji: Przy zadanych ograniczeniach (*): (i) (ii) Ax=b; A=[a ii ] ; b=[b i ] ; b i ; i=1, 2,..., M ; j=1, 2,..., N ; M<N W praktyce występują też ograniczenia w postaci nierówności które można jednak sprowadzić do równości wprowadzając dodatkowe zmienne (tzw. zmienne dopełniające), z odpowiednim współczynnikiem (-1 lub 1). Idea algorytmu symplex: Ograniczenia (*) wyznaczają w R N wielościan, tzw. sympleks, zaś wartość minimalna funkcji F może być osiągnięta jedynie w wierzchołkach tego sympleksu (jeżeli w więcej niż jednym wierzchołku funkcja F ma wartość minimalną, to na odcinku łączącym te wierzchołki też przyjmuje wartość minimalną). Współrzędne wierzchołków sympleksu można uzyskać rozwiązując układ równań (ii) dla M współrzędnych różnych od (tzw. współrzędnych bazowych) i pozostałych N-M współrzędnych równych. Algorytm sympleksu można podzielić na dwie fazy: w pierwszej znajdywane jest dowolne rozwiązanie dopuszczalne (tzn. takie w którym wartości M niezerowych zmiennych są nieujemne). W kolejnej fazie rozwiązanie to jest konsekwentnie poprawiane poprzez odpowiednią podmianę wektorów tworzących bazę (inny wybór współrzędnych bazowych) - sprawdzanie kolejnych wierzchołków sympleksu. Do osiągnięcia punktu optymalnego potrzeba co najwyżej N takich podmian. I etap: Jedną z metod znalezienia rozwiązania dopuszczalnego jest rozwiązanie następującego problemu pomocniczego który też jest zadaniem programowania liniowego (jednak z danym rozwiązaniem dopuszczalnym) z funkcją celu postaci: 2
gdzie - wektor zmiennych sztucznych (i równocześnie początkowy wektor zmiennych bazowych generujący dopuszczalne rozwiązanie problemu pomocniczego). i ograniczeniami:,, gdzie IM -macierz jednostkowa. Oczywiście wartość minimalna funkcji G wynosi (wystarczy że pozbędziemy się z bazy wszystkich zmiennych sztucznych) gdy istnieje rozwiązanie oryginalnego problemu LP. Rozwiązanie problemu pomocniczego jest równocześnie początkowym rozwiązaniem problemu oryginalnego (wymaganym w II etapie). II etap: Oznaczenia: Po fazie I (i dalej w każdej iteracji) otrzymujemy nasze zadanie w postaci kanonicznej: gdzie, wektor - to wektor zmiennych bazowych która wyznacza następujące rozwiązanie dopuszczalne: i Implementacja - program przyjmuje zmienne w postaci x1,x2,..,xn - program przyjmuje ograniczenia podawane kolejno oddzielone znakiem ";" - program sprowadza zadanie do postaci standardowej przy ograniczeniach zdefiniowanych nastepujaco: <=, >=, jest chcemy rozpatrzeć przypadek >= <= lub odwrotny to musimy go po prostu rozpisać na dwa oddzielne i przedzielić średnikiem -zakładamy ze każda cyfra w zadanych równaniach jest poprzedzona znakiem + lub - Wyniki 1. min 2x 1 +x 2 3
p.o. x 1 +x 2 3 x 1 +2x 2 4 x n Rozwiązanie: dwufazowysympleks('+2x1+1x2','+1x1+1x2>=+3;+1x1+2x2>=+4') Rownania w postaci macierzowej: 2 1 1 1-1 3 1 2-1 4 Faza 1 Macierz po dodaniu sztucznych zmiennych: 2 1 1 1 1 1-1 1 3 1 2-1 1 4 kolejne kroki algorytmu: -2-3 1 1-7 1 1-1 1 3 1 2-1 1 4 zmienne bazowe:x5x6 -.5 1 -.5 1.5-1.5-1.5 1 -.5 1.5 1 -.5.5 2 zmienne bazowe:x5x2 1 1 1-2 1 2-1 2 1 1-1 -1 1 1 zmienne bazowe:x1x2 Faza 2 3-1 -5 1-2 1 2 1 1-1 1 zmienne bazowe:x1x2 1 1-3 1-2 1 2 1 1-1 3 zmienne bazowe:x4x2 Punkt optymalny: x1= x2=3 x3= x4=2 Wartosc funkcji celu w bazowym rozwiazaniu dopuszczalnym: f(x)=3 Rozwiązanie za pomocą wbudowanej metody matlaba linpgrog: 4
f=[2; 1; ; ] >> Aeq=[1 1-1 ; 1 2-1] >> beq=[3; 4] >> lb=zeros(4,1) >> options=optimset('largescale','off','simplex','on') >> [x,fval,exitflag,output]=linprog(f,[],[],aeq,beq,lb,[], [],options) Optimization terminated. x = 3 2 fval =3 exitflag =1 output = iterations: 2 algorithm: 'medium scale: simplex' cgiterations: [] message: 'Optimization terminated.' 2. min x 1 +2x 2 +3x 3 +4x 4 p.o. x 1 +x 2 +x 3 +x 4 =1 x1+x 3-3x 4 =1/2 x n Rozwiązanie: dwufazowysympleks('+1x1+2x2+3x3+4x4','+1x1+1x2+1x3+1x4= +1;+1x1+1x3-3x4=+1/2') Rownania w postaci macierzowej: 1 2 3 4 1 1 1 1 1 1 1-3.5 Faza 1 Macierz po dodaniu sztucznych zmiennych: 1 2 3 4 1 1 1 1 1 1 1 1-3 1.5 kolejne kroki algorytmu: -1-1 3 -.5 1 1 1 1 1 1 1-3 1.5 5
zmienne bazowe:x2x5 1 1 4-1.5 1 1-3 1.5 zmienne bazowe:x2x1 Faza 2 2-1 -1.5 1 4.5 1 1-3.5 zmienne bazowe:x2x1.25 2-1.375.25 1.125 1.75 1.875 zmienne bazowe:x4x1 Punkt optymalny: x1=.875 x2= x3= x4=.125 Wartosc funkcji celu w bazowym rozwiazaniu dopuszczalnym: f(x)=1.375 Rozwiązanie za pomocą wbudowanej metody matlaba linpgrog: >> A=[1 1 1 1;1 1-3]; >> f=[1;2;3;4]; >> b=[1;.5]; >> lb=zeros(4,1); >> options = optimset('largescale', 'off', 'Simplex', 'on'); >> [x,fval,exitflag,output]=linprog(f,[],[],a,b,lb,[], [],options) Optimization terminated. x =.875.125 fval =1.375 exitflag =1 output = iterations: 1 algorithm: 'medium scale: simplex' cgiterations: [] message: 'Optimization terminated.' 6
3. min x2 p.o. -2x 1 +x 2-1 -x 1 +2x 2-2 x n >> dwufazowysympleks('-1x2','-2x1+1x2>=-1;-1x1+2x2<=-2') Nasze rozwiązanie: Rownania w postaci macierzowej: -1-2 1-1 -1-1 2 1-2 Faza 1 Macierz po dodaniu sztucznych zmiennych: -1 1 2-1 1 1 1-2 -1 1 2 kolejne kroki algorytmu: -1 2 1-2 2-1 1 1 1-2 -1 1 2 zmienne bazowe:x3x5 1.5.5 1-1.5 1 -.5.5.5-1.5 -.5-1 1 1.5 zmienne bazowe:x1x5 Nie usunieto wszystkich zmiennych sztucznych, zadanie jest SPRZECZNE. Rozwiązanie za pomocą wbudowanej metody matlaba linpgrog: >> f=[; -1; ; ]; >> A=[-2 1-1 ;-1 2 1]; >> b=[-1;-2]; >> lb=zeros(4,1); >> options = optimset('largescale', 'off', 'Simplex', 'on'); >> [x,fval,exitflag,output]=linprog(f,[],[],a,b,lb,[], [],options) Exiting: The constraints are overly stringent; no feasible starting point found. x = -1 fval =1 7
exitflag = -2 output = iterations: algorithm: 'medium scale: simplex' cgiterations: [] message: [1x8 char] 4. min =-x 2 p.o. -2x 1 +1x 2 +1x 3 =1-1x 1 +2x 2-1x 4 =-2 >> dwufazowysympleks('-1x2','-2x1+1x2+1x3=+1;-1x1+2x2-1x4=-2') Rownania w postaci macierzowej: -1-2 1 1 1-1 2-1 -2 Faza 2-1 -2 1 1 1 1-2 1 2 zmienne bazowe:x3x4-2 1 1-2 1 1 1-3 2 1 4 zmienne bazowe:x2x4 Zadanie jest NIEOGRANICZONE. Rozwiązanie za pomocą wbudowanej metody matlaba linpgrog: >> f=[;-1;;]; >> A=[-2 1 1 ;-1 2-1]; >> b=[1;-2]; >> lb=zeros(4,1); >> options = optimset('largescale', 'off', 'Simplex', 'on'); >> [x,fval,exitflag,output]=linprog(f,[],[],a,b,lb,[], [],options) Exiting: The problem is unbounded; the constraints are not restrictive enough. x = 1.e+16 * 2. 1. 3. fval = -1.e+16 exitflag = -3 output = iterations: 8
algorithm: 'medium scale: simplex' cgiterations: [] message: [1x78 char] Wnioski: Jak widać rozwiązania wszystkich przykładów za pomocą naszej implementacji metody dwufazowego sympleksu pokrywają się z rozwiązaniami metody wbudowanej w matlaba. W związku z tym możemy wysunąć wniosek że nasza implementacja metody jest poprawna. 9