Optymalizacja systemów

Transkrypt

Optymalizacja systemów
Optymalizacja systemów
Laboratorium – Dieta
autor: A. Gonczarek
Cel zadania
Celem zadania jest ułożenie diety złożonej z wybranych produktów z McDonalda, formułując problem optymalizacji jako zadanie programowania liniowego. Rozwiązanie należy zaimplementować
w środowisku MATLAB z użyciem funkcji z pakietu do optymalizacji.
Wykaz produktów
Na początku załóżmy, że wybraliśmy N produktów Pn , gdzie każdy z nich opisany jest w następujący sposób:
Pn = (kn , bn , wn , cn , tn ),
(1)
gdzie kn – kalorie [kcal], bn – białko [g], wn – węglowodany [g], cn – cukry proste [g], tn – tłuszcze
[g].
Proszę wprowadzić 10 wybranych produktów (N = 10) oraz ich wartości odżywcze do pliku
produkty.m.
Zapotrzebowanie na składniki odżywcze
Zapotrzebowanie na poszczególne wartości odżywcze definiujemy jako przedziały od wartości minimalnej do maksymalnej i tak kolejno: [Kmin , Kmax ] – zapotrzebowanie na kalorie, [Bmin , Bmax ]
– zapotrzebowanie na białko, [Wmin , Wmax ] – zapotrzebowanie na węglowodany, [Cmin , Cmax ] –
zapotrzebowanie na cukry proste, [Tmin , Tmax ] – zapotrzebowanie na tłuszcze.
Przykładowo, dla dorosłego mężczyzny wykonującego pracę siedzącą, dzienne zapotrzebowanie
na wartości odżywcze wynosi:
ˆ Kalorie 2400 − 2600
ˆ Białko 55 − 65
ˆ Węglowodany 320 − 360
ˆ Cukry proste 90 − 110
ˆ Tłuszcze 64 − 80
1
Proszę uzupełnić funkcję zapotrzebowanie.m, wpisując zapotrzebowanie na wartości odżywcze
w wybranej przez siebie diecie.
Problem spełnialności ograniczeń
Przez x = (x1 , . . . , xN )T oznaczmy zmienne decyzyjne w problemie, gdzie xn oznacza ilość n-tego
produktu przewidzianą do spożycia.
Pierwszym problemem, który rozważamy, jest problem spełnialności ograniczeń nierównościowych, który możemy przedstawić jako problem programowania liniowego o następującej postaci:
minimalizuj (po x)
przy ograniczeniach:
0
Ax b
x0
Zauważmy, że w powyższym problemie funkcja celu jest stale równa zero, czyli interesuje nas
jedynie znalezienie dowolnego rozwiązania x spełniającego ograniczenia nierównościowe, tj. taki
dobór ilości poszczególnych produktów, aby zaspokoić zapotrzebowanie na składniki odżywcze.
Dodatkowo zmienne decyzyjne są nieujemnymi liczbami rzeczywistymi, czyli zakładamy, że możemy spożyć tylko część danego produktu.
W celu zdefiniowania ograniczeń proszę wypełnić funkcję linconst.m, gdzie należy zdefiniować
macierz A i wektor b. Wektor b powinien zawierać kolejno górne i dolne ograniczenia (odpowiednio
ze znakiem plus i minus) dla wartości odżywczych w podanej kolejności: kalorie, białko, węglowodany, cukry proste, tłuszcze. Zachowanie kolejności jest ważne przy działaniu funkcji sprawdzającej
poprawność implementacji. Wiersze macierzy A powinny zawierać zawartości składników odżywczych (z dokładnością do znaku plus/minus) dla kolejnych produktów.
Dowolny problem programowania liniowego można rozwiązać z użyciem algorytmu InteriorPoint, który omówiony zostanie w trakcie zajęć. Dla problemu programowania liniowego domyślnie
można go wywołać poprzez użycie komendy:
[x val flag] = linprog(f,A,b,Aeq,beq,lb,ub).
Proszę zaimplementować funkcję czyIstniejeDieta.m, gdzie należy skorzystać z powyższej
funkcji do programowania liniowego tak, by rozwiązywała problem spełnialności ograniczeń, tj.
zadać odpowiedni wektor parametrów liniowej funkcji celu f , macierz ograniczeń nierównościowych
A, wektor b oraz wektor dolnych ograniczeń na zmienne decyzyjne lb. Jeśli niektóre macierze nie
2
występującą w problemie optymalizacji należy wstawić macierz pustą []. Funkcja linprog zwraca
wektor zmiennych decyzyjnych, wartość funkcji oraz tzw. flagę rozwiązania, która wynosi 1, gdy
znajdziemy rozwiązanie dopuszczalne oraz −2, gdy żadne rozwiązanie nie spełnia ograniczeń.
Problem minimalizacji funkcji liniowej
Drugim problemem rozważanym w zadaniu jest ułożenie diety, która będzie najmniej kaloryczna,
a jednocześnie będzie spełniała zapotrzebowanie na białko, węglowodany, cukry proste i tłuszcze.
Formalnie problem możemy przedstawić jako następujące zadanie programowania liniowego:
minimalizuj (po x)
przy ograniczeniach:
f Tx
Cx d
x0
Proszę zaimplementować funkcję celu ftarget dieta.m, gdzie wektor parametrów funkcji celu f zawiera wartości kaloryczne poszczególnych produktów. Dodatkowo proszę zaimplementować
funkcję linconst dieta.m, która zwraca macierz ograniczeń C i wektor d. Ograniczenia są analogiczne do macierzy A i wektora b w problemie pierwszym z tą różnicą, że nie zawierają ograniczeń
na kalorie, gdyż ich łączną ilość chcemy teraz minimalizować.
Następnie proszę zaimplementować funkcję dietaMinKalorii.m, która ma zwracać rozwiązanie
powyższego problemu, wartość funkcji celu oraz flagę rozwiązania. Do jej implementacji ponownie
należy wykorzystać funkcję linprog.
Zadanie do wykonania (5 pkt.)
Po zaprezentowaniu działającego programu, prowadzący zadaje do kilku pytań kontrolnych mających na celu sprawdzenie poziomu zrozumienia zaimplementowanego w zadaniu kodu. Punkty są
przyznawane wyłącznie na podstawie udzielonych odpowiedzi, co oznacza że samo zaimplementowanie kodu, bez jego zrozumienia, nie gwarantuje uzyskania punktów.
1. Wprowadzić 10 wybranych produktów i ich wartości odżywcze w pliku produkty.m oraz
zapotrzebowanie na wartości odżywcze w pliku zapotrzebowanie.m.
2. Zaimplementować wyliczenie ograniczeń A i b w pliku linconst.m.
3. Zaimplementować rozwiązanie problemu spełnialności ograniczeń w pliku czyIstniejeDieta.m.
4. Zaimplementować wyliczenie ograniczeń C i d w pliku linconst dieta.m.
5. Zaimplementować wyliczenie parametrów funkcji celu f w pliku ftarget dieta.m.
3
6. Zaimplementować rozwiązanie problemu diety o najmniejszej liczbie kalorii w pliku
dietaMinKalorii.m.
UWAGA! Wszelkie nazwy funkcji i zmiennych w plikach *.m muszą pozostać zachowane.
Zmiana jakichkolwiek nazw i dodanie fragmentów kodu poza wskazanymi miejscami skutkować
będzie otrzymaniem 0 pkt.
Pytania kontrolne (5 pkt.)
Prowadzący zadaje do kilku pytań kontrolnych osobie oddającej zadanie. Lista przykładowych
pytań:
1. Co to jest problem programowania liniowego? Podaj jakie własności musi mieć funkcja celu,
ograniczenia i zmienne decyzyjne.
2. Jaka jest interpretacja wektora zmiennych decyzyjnych x w powyższym zadaniu? Czy jeśli
zmienne przyjmowałyby wartości całkowite, to czy nadal byłby to problem programowania
liniowego?
3. Co to jest problem spełnialności ograniczeń? W jaki sposób przedstawić go jako zadanie
programowania liniowego?
4. Dlaczego w powyższym zadaniu wektor ograniczeń b zawiera zarówno wartości dodatnie i
ujemne?
5. Podaj ogólną ideę działania algorytmu Interior-Point. Do jakich problemów się go stosuje?
Podaj nazwę przykładowego algorytmu gradientowego do optymalizowania funkcji bariery.
6. Co to jest funkcja logarytmicznej bariery w algorytmie Interior-Point? Po co się ją wprowadza? Jaką funkcję aproksymuje?
7. Co to znaczy, że zadanie programowania liniowego nie ma rozwiązania dopuszczalnego? Kiedy
tak się dzieje?
8. Co to znaczy, że zadanie programowania liniowego nie ma skończonego rozwiązania? Kiedy
tak się dzieje?
9. Czy ograniczenia typu l x u mogą być zastąpione przez Ax b i dlaczego?
10. Jaka jest geometryczna interpretacja ograniczenia typu aT x ¬ b, a jaka ograniczenia typu
cT x = d?
4