Laboratorium Metod Optymalizacji

Transkrypt

Laboratorium Metod Optymalizacji
Laboratorium
Metod Optymalizacji
Grupa nr
..................
Sekcja nr
..................
Ćwiczenie nr 4
Temat:
Lp.
1
2
„Programowanie liniowe (dwufazowa metoda sympleksu)”.
Nazwisko i imię
Obecność
ocena
Sprawozdani
e ocena
Ocena
średnia
Leszek Zaczyński
Krzysztof Wojsa
3
4
5
6
Ćwiczenie wykonano
Sprawozdanie oddano
Data
Data
19 grudnia 2007
Uwagi
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=[aii] ; b=[bi] ; bi ≥ ; 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 RN 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 0 (tzw. współrzędnych
bazowych) i pozostałych N-M współrzędnych równych 0.
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 0 (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
bazowych
, wektor
- to wektor zmiennych
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 2x1+x2
3
p.o. x1+x2≥3
x1+2x2≥4
xn≥0
Rozwiązanie:
dwufazowySympleks('+2x1+1x2','+1x1+1x2>=+3;+1x1+2x2>=+4')
Rownania w postaci macierzowej:
2 1 0 0 0
1 1 -1 0 3
1 2 0 -1 4
Faza 1
Macierz po dodaniu sztucznych zmiennych:
2 1 0 0 1 1 0
1 1 -1 0 1 0 3
1 2 0 -1 0 1 4
kolejne kroki algorytmu:
-2 -3 1 1 0 0 -7
1 1 -1 0 1 0 3
1 2 0 -1 0 1 4
zmienne bazowe:x5x6
-0.5
0
1
-0.5
0
0.5
0
-1
0.5
1
0.5
1
0
-0.5
0
zmienne bazowe:x5x2
0 0 0 0 1 1 0
1 0 -2 1 2 -1 2
0 1 1 -1 -1 1 1
zmienne bazowe:x1x2
Faza 2
0 0 3 -1 -5
1 0 -2 1 2
0 1 1 -1 1
zmienne bazowe:x1x2
1 0 1 0 -3
1 0 -2 1 2
1 1 -1 0 3
zmienne bazowe:x4x2
1.5
-0.5
0.5
-1
1
2
Punkt optymalny:
x1=0
x2=3
x3=0
x4=2
Wartosc funkcji celu w bazowym rozwiazaniu dopuszczalnym:
f(x)=3
Rozwiązanie za pomocą wbudowanej metody matlaba linpgrog:
4
f=[2; 1; 0; 0]
>> Aeq=[1 1 -1 0; 1 2 0 -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 =
0
3
0
2
fval =3
exitflag =1
output = iterations: 2
algorithm: 'medium scale: simplex'
cgiterations: []
message: 'Optimization terminated.'
2.
min x1+2x2+3x3+4x4
p.o. x1+x2+x3+x4=1
x1+x3-3x4=1/2
xn≥0
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 0
1 1 1 1 1
1 0 1 -3 0.5
Faza 1
Macierz po dodaniu sztucznych zmiennych:
1 2 3
4 1 0
1 1 1
1 0 1
1 0 1 -3 1 0.5
kolejne kroki algorytmu:
-1 0 -1 3 0 -0.5
1 1
1 1 0 1
1 0
1 -3 1 0.5
5
zmienne bazowe:x2x5
0 0 0 0
1 0
0 1 0 4 -1 0.5
1 0 1 -3
1 0.5
zmienne bazowe:x2x1
Faza 2
0 0 2 -1 -1.5
0 1 0
4
0.5
1 0 1 -3
0.5
zmienne bazowe:x2x1
0 0.25
2 0 -1.375
0 0.25
0 1
0.125
1 0.75
1 0
0.875
zmienne bazowe:x4x1
Punkt optymalny:
x1=0.875
x2=0
x3=0
x4=0.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 0 1 -3];
>> f=[1;2;3;4];
>> b=[1;0.5];
>> lb=zeros(4,1);
>> options = optimset('LargeScale', 'off', 'Simplex', 'on');
>> [x,fval,exitflag,output]=linprog(f,[],[],A,b,lb,[],
[],options)
Optimization terminated.
x =
0.8750
0
0
0.1250
fval =1.3750
exitflag =1
output =
iterations: 1
algorithm: 'medium scale: simplex'
cgiterations: []
message: 'Optimization terminated.'
6
3.
min –x2
p.o. -2x1+x2 ≥-1
-x1+2x2≤-2
xn≥0
>> dwufazowySympleks('-1x2','-2x1+1x2>=-1;-1x1+2x2<=-2')
Nasze rozwiązanie:
Rownania w postaci macierzowej:
0 -1 0 0 0
-2 1 -1 0 -1
-1 2 0 1 -2
Faza 1
Macierz po dodaniu sztucznych zmiennych:
0 -1 0 0 1 0
2 -1 1 0 0 1
1 -2 0 -1 1 2
kolejne kroki algorytmu:
-1 2 0 1 0 -2
2 -1 1 0 0 1
1 -2 0 -1 1 2
zmienne bazowe:x3x5
0
1.5
0.5
1
0
-1.5
1 -0.5
0.5
0
0
0.5
0 -1.5 -0.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=[0; -1; 0; 0];
>> A=[-2 1 -1 0;-1 2 0 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 = 0
-1
0
0
fval =1
7
exitflag = -2
output =
iterations: 0
algorithm: 'medium scale: simplex'
cgiterations: []
message: [1x80 char]
4.
min =-x2
p.o. -2x1+1x2+1x3=1
-1x1+2x2-1x4=-2
>> dwufazowySympleks('-1x2','-2x1+1x2+1x3=+1;-1x1+2x2-1x4=-2')
Rownania w postaci macierzowej:
0 -1 0 0 0
-2 1 1 0 1
-1 2 0 -1 -2
Faza 2
0 -1 0 0 0
-2 1 1 0 1
1 -2 0 1 2
zmienne bazowe:x3x4
-2 0 1 0 1
-2 1 1 0 1
-3 0 2 1 4
zmienne bazowe:x2x4
Zadanie jest NIEOGRANICZONE.
Rozwiązanie za pomocą wbudowanej metody matlaba linpgrog:
>> f=[0;-1;0;0];
>> A=[-2 1 1 0;-1 2 0 -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.0e+016 *
2.0000
1.0000
3.0000
0
fval =
-1.0000e+016
exitflag =
-3
output =
iterations: 0
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