Politechnika Poznańska Modele i narzędzia optymalizacji w systemach informatycznych zarządzania Joanna Józefowska POZNAŃ 2010/11
Spis treści Rozdział 1. Metoda programowania dynamicznego........... 5 1.1. Przykład.................................. 5 1.1.1. Analiza sytuacji decyzyjnej................... 6 1.1.2. Budowa modelu matematycznego................ 6 1.1.3. Rozwiązanie zadania decyzyjnego................ 6 1.1.. Interpretacja rozwiązania.................... 8 1.2. Metoda programowania dynamicznego................. 8 1.2.1. Ogólna metoda rozwiązania................... 9 Bibliografia.................................... 11
Rozdział 1 Metoda programowania dynamicznego Programowanie dynamiczne jest metodą rozwiązywania zadań optymalizacyjnych, które na mocy pewnych własności, można sformułować jako poszukiwanie ciągu decyzji. Metoda ta ma zastosowanie zarówno dla problemów dyskretnych, jak i ciągłych [1]. W tym rozdziale przedstawimy najprostszy typ problemów, do których można zastosować programowanie dynamiczne. Będą to problemy dyskretne z funkcją celu będącą sumą lub iloczynem. 1.1. Przykład Komiwojażer podróżujący po Dzikim Zachodzie (około 100 lat temu) miał przejechać pewna trasę pociągiem. Miał do wyboru kilka połączeń, wiodących przez różne miasta. Komiwojażerowi bardzo zależało na bezpiecznej podróży. Dowiedział się, że Towarzystwo Ubezpieczeniowe oferuje polisy ubezpieczeniowe na wypadek napadu. Na różnych odcinkach drogi koszt polisy był różny. Komiwojażer szybko doszedł do wniosku, że polisy są tańsze na bezpieczniejszych trasach, wobec tego najbezpieczniejszy przejazd, to będzie przejazd minimalizujący koszty ubezpieczenia. Graf na rys. 1.1 przedstawia możliwe do wyboru trasy przejazdu z miejsca 1 do miejsca 10. Ceny polis na trasie od punktu i do punktu j (oznaczona c ij ) są przedstawione jako wagi na łukach w grafie. 1 2 2 3 6 3 2 7 5 6 6 3 1 8 3 10 3 1 1 9 5 7 2 Rysunek 1.1. Koszty podróży komiwojażera
6 Rozdział 1. Metoda programowania dynamicznego 1.1.1. Analiza sytuacji decyzyjnej W pierwszej chwili komiwojażer postanowił wyruszyć do miasta 2, gdyż na tym odcinku koszt polisy był najmniejszy, a potem na każdym etapie wybierać kolejne miasto, do którego ubezpieczenie jest najtańsze. W ten sposób zaplanował trasę 1-2-6-9-10. Łączny koszt ubezpieczenia na tej trasie to 13$. Po chwili zastanowienia zauważył jednak, że istnieje tańsze rozwiązanie, mianowicie łączny koszt ubezpieczenia na trasie 1-3-5-8-10 wynosi 11$. Komiwojażer zaczął się zastanawiać, czy istnieje inna trasa, o jeszcze niższym koszcie ubezpieczenia. Analiza wszystkich możliwości wymagałaby obliczenia 3*3*2=18 sum po składniki, czyli wykonania 72 działań. W wypadku tak małej sieci połączeń nie stanowi to dużego problemu, gdyby jednak analiza dotyczyła np. obecnej sieci połączeń lotniczych w USA, to rozmiar problemu mógłby przekroczyć możliwości średniej klasy komputera. 1.1.2. Budowa modelu matematycznego Problem przed jakim stanął komiwojażer można modelować na kilka sposobów, np. jako problem poszukiwania najkrótszej ścieżki w grafie. Poniżej zaproponujemy nieco bardziej ogólne podejście. Nasz problem polega na minimalizacji kosztów ubezpieczenia podróży, czyli ma postać: przy ograniczeniach: zminimalizować z = c(i, j)x ij i=1 j S n+1 x ij = 1, i S n, n = 0, 1, 2, 3 x ij = x ij, n = 0, 1, 2, 3 i S n j S n+1 gdzie zmienna x ij przyjmuje wartość 1, gdy komiwojażer włącza odcinek (i, j) do trasy swojej podróży i wartość 0 w przeciwnym wypadku. Ponadto S n oznacza zbiór miast na etapie n (czyli takich, do których można dojechać z miasta 1 w n odcinkach, np. S 2 = {5, 6, 7}), a c(i, j) koszt polisy na odcinku (i, j). Otrzymaliśmy problem programowania liniowego całkowitoliczbowego. W ogólności rozwiązanie takiego problemu jest trudne. Możemy jednak wykorzystać pewne własności tego szczególnego problemu i rozwiązać go metodą programowania dynamicznego. 1.1.3. Rozwiązanie zadania decyzyjnego Komiwojażer podróżuje odcinkami. Powiemy, że komiwojażer znajduje się na n-tym etapie podróży, jeżeli pokonał już n odcinków trasy, gdzie n = 1, 2, 3,. Każda podróż składa się z odcinków - etapów. Na każdym etapie komiwojażer podejmuje decyzję, jaki będzie kolejny cel jego podróży. Niech s n oznacza numer miasta, w którym komiwojażer znalazł się na n-tym etapie podróży. Zbiór miast, do których można dotrzeć z miasta 1 pokonując n odcinków będzie zbiorem stanów na etapie n. Łatwo zauważyć, że s 0 = 1 oraz, że s = 10. Oznaczmy przez x n+1 numer miasta, do którego
1.1. Przykład 7 komiwojażer zdecydował pojechać, czyli cel podróży zaczynającej się w s n. Zatem x n+1 jest decyzją komiwojażera podjętą na etapie n. Zauważmy, że x n+1 = s n+1. Koszt polisy na odcinku (s n, x n+1 ) oznaczmy przez c(s n, x n+1 ). Zauważmy, że gdy komiwojażer znajdzie się na etapie 3, to nie ma już wyboru i musi jechać do miasta 10. Jeżeli na etapie 3 znalazł sie w mieście 8, to polisa na ostatnim odcinku będzie kosztowała 3$, a jeżeli w mieście 9, to $. Powyższą obserwację zapisano w tablicy 1.1. Tablica 1.1. Koszt decyzji na etapie n = 3 Stan s 3 Koszt decyzji f 3(s 3, 10) f3 (s 3) Decyzja x 8 3 3 10 9 10 Na etapie drugim w każdym stanie możliwe są dwie decyzje. Jednak wybór decyzji przesądza o wyborze i koszcie trasy do końca podróży. Na przykład, jeżeli komiwojażer będąc w mieście 5 wybierze podróż do miasta 8, to można obliczyć koszt podróży z 5 do 10 przez 8 jako: 1+3=. Obliczenie kosztów pozostałych decyzji na tym etapie przedstawiono w tablicy 1.2. Tablica 1.2. Koszt decyzji na etapie n = 2 Stan s 2 Koszt decyzji f2 Decyzja (s f 2) 2(s 2, 8) f 2(s 2, 9) x 3 5 8 8 6 9 7 7 9 7 6 7 6 8 Natomiast na etapie 1 komiwojażer ma do wyboru 3 decyzje. Jeżeli dokona wyboru, to z tablicy 1.2 może odczytać koszt najtańszej polisy z wybranego miasta do końca podróży. Na przykład, jeżeli z miasta 2 komiwojażer zdecyduje się jechać do miasta 5, to koszt najtańszej polisy na trasie od 2 do 10 przez 5 obliczymy jako sumę kosztu ubezpieczenia na trasie (2,5) oraz najmniejszego kosztu ubezpieczenia na trasie z miasta 5 do 10, który można odczytać z tablicy 1.2, czyli: 7+=11. Obliczenia dla pozostałych stanów i decyzji na tym etapie przedstawiono w tablicy 1.3. Tablica 1.3. Koszt decyzji na etapie n = 1 Stan s 1 Koszt decyzji f2 Decyzja (s f 1) 2(s 1, 5) f 2(s 1, 6) f 2(s 1, 7) x 2 2 11 11 12 11 5 lub 6 3 7 9 10 7 5 8 8 11 8 5 lub 6 Na etapie zero, czyli na początku podróży w mieście 1 są do wyboru 3 decyzje, ale tylko jeden stan. Koszty decyzji na tym etapie zawiera tablica 1.. Uogólniając: dla każdego miasta możemy wyznaczyć najmniejszy łączny koszt polisy na trasie rozpoczynającej się w tym mieście i kończącej w mieście 10, przy założeniu, że w mieście s n została podjęta decyzja x n+1. Koszt ten oznaczymy przez f n (s n, x n+1 ). Znajdując minimum po wszystkich miastach, do których można dotrzeć bezpośrednio z miasta s n otrzymamy najmniejszy koszt polisy na trasie prowadzącej z s n do celu podroży, który oznaczamy jako fn(s n ). Konsekwentnie, f0 (1) będzie najmniejszym kosztem polisy na całej trasie. Problem polega zatem na znalezieniu minimalnej wartości funkcji
8 Rozdział 1. Metoda programowania dynamicznego Tablica 1.. Koszt decyzji na etapie n = 0 Koszt decyzji Stan s 0 f2 Decyzja (s f 0) 2(s 0, 2) f 2(s 0, 3) f 2(s 0, ) x 1 1 13 11 11 11 3 lub przy ograniczeniach: z = f 0 (1) f n(s n ) = min x n+1 {c(s n, x n+1 ) + f n+1(x n+1 )}, n = 0, 1, 2, 3 f (10) = 0 s 0 = 1, s = 10 Problem ten można rozwiązać od końca, jak pokazano powyżej dzięki temu, że optymalna decyzja w stanie s n pozostaje optymalna niezależnie od tego, jakie decyzje poprzedziły ją na wcześniejszych etapach, pod warunkiem, że doprowadziły do stanu s n. 1.1.. Interpretacja rozwiązania Najniższy możliwy koszt podróży wynosi 11$. Można go osiągnąć na kilka sposobów. Komiwojażer może na pierwszym etapie wybrać miasto 3 lub. Jeżeli znajdzie się w mieście 3, to kolejnym odwiedzonym miastem powinno być 5 lub 6. Jeżeli wybierze, to na następnym etapie powinien sie udać do miasta 5. Na etapie 2 będąc w mieście 5 kieruje się do 8, a będąc w mieście 6 jako kolejny cel wybiera miasto 9. Otrzymujemy zatem następujące trasy: 1-3-5-8-10, 1-3-6-9-10 oraz 1--5-8-10. Na każdej z tych tras koszt polisy wynosi 11$. 1.2. Metoda programowania dynamicznego Metoda programowania dynamicznego została opracowana przez Richarda Bellmana w połowie dwudziestego wieku. Zasadniczym krokiem w skonstruowaniu algorytmu programowania liniowego jest sformułowanie funkcji rekurencyjnej, która wyraża optymalną wartość funkcji celu danego problemu jako funkcję (najczęściej sumę lub iloczyn) optymalnych wartości funkcji celu podproblemów o mniejszych rozmiarach. Procedura rozwiązania polega na znalezieniu optymalnej wartości funkcji celu całego zagadnienia przez rozwiązanie podproblemów od najmniejszego do największego. Metoda programowania dynamicznego ma zastosowanie do rozwiązywania tzw. problemów bez pamięci, spełniających własność Markowa (Własność 1.1). Własność 1.1 (Własność Markowa) Mówimy, że wieloetapowy proces decyzyjny ma własność Markowa, jeżeli po dowolnej liczbie decyzji, np. k, wpływ pozostałych etapów procesu decyzyjnego na wartość funkcji celu f zależy tylko od stanu procesu przy końcu k-tego etapu i od decyzji następnych.
1.2. Metoda programowania dynamicznego 9 Bellman sformułował własność 1.2, nazywaną zasadą optymalności Bellmana, która uzasadnia poprawność stosowania procedury rekurencyjnej do rozwiązywania problemów z własnością Markowa. Własność 1.2 (Zasada optymalności Bellmana) Dla wieloetapowego procesu decyzyjnego z własnością Markowa strategia optymalna ma tę własność, że jakikolwiek byłby stan początkowy i decyzja początkowa, pozostałe decyzje muszą tworzyć strategię optymalną z punktu widzenia stanu wynikłego z pierwszej decyzji. 1.2.1. Ogólna metoda rozwiązania Posługując się zasadą optymalności można sprowadzić zadanie znalezienia minimum funkcji N zmiennych do rozwiązania ciągu N zadań, polegających na znalezieniu minimum funkcji jednej zmiennej. Metodę programowania dynamicznego można zastosować, jeżeli spełnione są następujące założenia: problem może być podzielony na etapy, na każdym etapie wymagane jest podjęcie decyzji, z każdym etapem związana jest pewna liczba stanów, skutkiem decyzji podjętej na każdym etapie jest transformacja bieżącego stanu w stan związany z następnym etapem, w danym stanie optymalna decyzja dla pozostałych etapów jest niezależna od decyzji podjętych na poprzednich etapach. Przyjmijmy następujące oznaczenia: N - liczba stanów, s n - stan na etapie n (n = 1,..., N), x n+1 - decyzja na etapie n (n = 1,..., N), f n (s n, x n+1 ) - najlepsza wartość maksymalizowanej (minimalizowanej) funkcji celu dla podproblemu obejmującego stany s n, s n+1,..., s N, jeżeli na etapie n w stanie s n podjęto decyzję x n+1, f n(s) - maksymalna (minimalna) wartość f n (s, x n+1 ) po wszystkich możliwych wartościach x n+1 (decyzjach). Podjęcie decyzji x n+1 w stanie s n na etapie n jednoznacznie określa stan s n+1, w jakim znajdzie sie proces na etapie (n + 1). Zależności te można zilustrować graficznie (rys. 1.2). Sposób postępowania omówiono poniżej. Metoda programowania dynamicznego Krok 1. Znaleźć optymalną decyzję dla wszystkich stanów na końcowym etapie. Krok 2. Znaleźć zależność rekurencyjną opisującą optymalną decyzję dla każdego stanu na etapie n, na podstawie informacji o decyzjach optymalnych dla każdego stanu na etapie (n + 1). Krok 3. Posługując się zależnością rekurencyjną postępować od końca do początku, etap po etapie, znajdując na każdym z nich optymalną decyzję (ciąg decyzji) aż do znalezienia optymalnego ciągu decyzji dla stanu początkowego.
10 Rozdział 1. Metoda programowania dynamicznego Etap n Etap n + 1 s n+1...... s n f n(s n ) = min xn {f n (s n, x n+1 )} x n+1 x n+1 f n+1 (s n+1 ). s n+1... f n+1 (s n+1 ) Rysunek 1.2. Przejście ze stanu na etapie n do stanu na etapie n + 1
Bibliografia [1] J.G. Ecker, M. Kupferschmid. Introduction to Operations Research. John Wiley & Sons, New York, 1988.