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