Wstęp
Skrypt niniejszy ma za zadanie przedstawić metody obliczeniowe optymalizacji, w odróżnieniu od podstaw teoretycznych. Uznano, że użytkownicy tego skryptu w zasadzie znają teorię optymalizacji, lecz brak im umiejętności rozwiązywania zadań praktycznych. W rozwiązaniu tym, jak można przewidzieć, rolę podstawową odgrywa elektroniczna technika obliczeniowa. Tym niemniej, raczej dla wygody Czytelnika niż w celu wykładowym, w skrypcie przedstawione są w skrócie najważniejsze rezultaty współczesnej teorii optymalizacji; podana jest również odpowiednia źródłowa literatura.
Skrypt opracowany był z myślą o studentach specjalności automatyka; nie oznacza to oczywiście, że przedstawione tu metody obliczeniowe są specyficzne dla automatyki. Zadania optymalizacji występują w wielu dziedzinach, a po ich matematycznym sformułowaniu przestaje być istotne, z jakiego konkretnego problemu powstały. Specyfika automatyki odbiła się na skrypcie w ten sposób, że bardzo mało uwagi poświęcono zadaniom programowania liniowego. Zagadnienia optymalizacji procesów produkcyjnych prowadzą bowiem zazwyczaj do zadań programowania nieliniowego lub zadań optymalizacji dynamicznej. W związku z tym skrypt niniejszy poświęcony jest w zasadzie metodom, służącym do rozwiązywania zadań następujących:
Znaleźć
(1)
gdzie f(x) jest funkcją n zmiennych x1, x2, ..., xn
przy warunkach ubocznych („ograniczeniach”)
, i = 1,...,m (2)
gdzie gi(x) są funkcjami zmiennych x1, x2,...,xn, a bi danymi liczbami; rozwiązania tego zadania są liczbami
.
Znaleźć
(3)
gdzie Q[x(t), u(t), t] jest funkcjonałem określonym na funkcjach zmiennej niezależnej t, t ∈[t1, t2]
przy warunkach ubocznych („więzach”)
(4)
gdzie (4) oznacza układ n równań różniczkowych pierwszego rzędu, tzn.
oznacza wektor złożony z pochodnych
; rozwiązania tego zadania są funkcjami zmiennej niezależnej,
, określonymi na przedział sterowania t ∈[t1, t2].
Zadania typu (a) należą do dziedziny tzw. programowania nieliniowego; nazywa się je też niekiedy zadaniami optymalizacji statycznej. Poświęcona im jest część I skryptu. Zadania typu (b) należą do dziedziny optymalizacji dynamicznej; w skrypcie zajmuje się nimi część II.
Jeżeli, z innej strony patrząc, rozpatrywać zadania optymalizacji sterowania procesami produkcyjnymi, to łatwo jest podzielić je na dwie grupy:
zadania optymalizacji stanu ustalonego,
zadania optymalizacji dynamicznej.
W grupie pierwszej znajdą się przypadki wtedy, gdy proces produkcyjny ma charakter procesu ciągłego, jak to ma np. miejsce w przypadku wytwarzania kwasu siarkowego z siarki czy amoniaku z gazu ziemnego. Optimum średniej wydajności, średniego kosztu przy zadanej wydajności czy innego podobnego wskaźnika otrzymuje się wówczas najczęściej w sytuacji, gdy bieg procesu jest stały w czasie. Pozwala to przyjąć, jako element rozwiązania optymalnego, że pochodne względem czasu wszelkich zmiennych są równe zeru. Jeżeli obiekt ma stałe skupione, czyli jego równania stanu są np. postaci (4), to założenie stanu ustalonego oznacza, że opis ten przyjmuje postać równań typu (2)
(5)
Pisząc (5) założono dla uproszczenia, że równania (4) nie zależą od czasu. Związki (5) pokazują, że zadanie optymalizacji stanu ustalonego sprowadzi się do zadania programowania nieliniowego, czyli zadania typu (a).
Zadania optymalizacji dynamicznej procesów produkcyjnych powstają przede wszystkim wówczas, gdy proces jest prowadzony jako tzw. proces cykliczny. Przykładem może być proces wytopu w piecu stalowniczym: w czasie trwania procesu zmienia się temperatura, skład chemiczny itd., aby w chwili zakończenia procesu osiągnąć pewne zadane wartości. Istotne są zatem równania różniczkowe, opisujące obiekt, a zadanie matematyczne przyjmuje postać typu (b).
W niektórych przypadkach zadania optymalizacji stanu ustalonego mogą przybrać postać zadań optymalizacji dynamicznej, tj. zadań typu (b). Na przykład, gdy w obiekcie o stałych rozłożonych zmienne xi są funkcjami czasu t oraz długości l, równania stanu mogą przyjąć postać
(6)
gdzie x = x(l,t), u = u(l,t). W stanie ustalonym procesu równania (6) sprowadzają się do
(7)
Równania (7) nie są różniczkowe względem zmiennej t, lecz zawierają pochodne względem zmiennej l. Jest to zatem zadanie optymalizacji z więzami różniczkowymi; jest ono typu (b), a rozwiązanie będzie w postaci
, czyli w postaci funkcji zmiennej l.
Część I
PROGRAMOWANIE NIELINIOWE I LINIOWE
1. Podstawowe sformułowania i definicje
1.1. Zadania programowania nieliniowego i liniowego
Zadaniem programowania nazywany będzie problem następujący: Znaleźć wektor
, który minimalizuje bądź maksymalizuje skalarną funkcję
(1)
spełniając równocześnie układ równań lun nierówności o postaci (A)
, i = 1,...,m (2)
przy czym x jest n-wymiarowym wektorem kolumnowym, złożonym z elementów x1, x2, ..., xn. Zakłada się przy tym, że znane są postaci analityczne funkcji (1) oraz zależności (2), jak również wartości stałych bi. W wielu przypadkach powyższe sformułowanie uzupełnione jest dodatkowymi wymaganiami; np. żąda się, aby niektóre bądź wszystkie zmienne niezależne xj były nieujemne (tzn. xj ≥ 0 dla j = 1,...,n) lub też, aby przyhmowały tylko określone wartości dyskretne. Wartość
nazwano rozwiązaniem zadania optymalizacji (zadania programowania). Wartość f(
) nazwano ekstremum warunkowym funkcji f(x).
Funkcja (1) będzie dalej nazywana „funkcją celu”, natomiast zbiór zależności (2) - „zbiorem ograniczeń”. W zbiorze tym w każdym z ograniczeń może występować tylko jeden ze znaków wymienionych w zależności (2). Liczba ograniczeń m może być dowolna, to znaczy m może zarówno być większe, mniejsze jak i równe n. W przypadku gdy m = 0 rozpatrywane przez nas zadanie sprowadza się do problemu optymalizacji funkcji wielu zmiennych bez ograniczeń. Ten szczególny przypadek ma bardzo duże znaczenie przy poszukiwaniu ekstremum metodami iteracyjnymi i zostanie omówiony oddzielnie.
Zadania programowania (optymalizacji statycznej) dzielą się na dwie podstawowe grupy:
zadania programowania liniowego,
zadania programowania nieliniowego.
Jeżeli funkcja celu (1) i zbiór ograniczeń (2) są liniowe tzn. można jest przedstawić w postaci:
(3)
oraz
, i = 1,...,m (4)
przy czym stałe współczynniki aij i cj są znane, to zadanie należy do programowania liniowego. W przytoczonym sformułowaniu warunki (4) uzupełnia się zwykle żądaniem, aby wszystkie zmienne były nieujemne, tzn.
j = 1,...,n (5)
co znacznie ułatwia numeryczne rozwiązanie zadania. Zwróćmy uwagę, że wymaganie to nie zmniejsza w jakimkolwiek stopniu ogólności rozważań, gdyż każde zadanie, w którym zmienne xj są nieograniczonego znaku, można łatwo sprowadzić do postaci (5). Tak więc, zadanie programowania liniowego polega na znalezieniu nieujemnego wektora
, który ekstremalizuje liniową funkcję
oraz równocześnie spełnia zbiór ograniczeń (B)
, i = 1,...,m
Problem ten po raz pierwszy został rozwiązany w 1947 roku przez G. Dantzinga, który opracował dla niego metodę Simpleks stosowaną z różnymi modyfikacjami do dnia dzisiejszego.
Wszystkie pozostałe zadania optymalizacji typu (1) i (2), które nie mają postaci (3) i (4), zalicza się do programowania nieliniowego, wyodrębniając przy tym szereg szczególnych przypadków, różniących się pod względem metod ich rozwiązywania:
Funkcja celu F jest nieliniowa, ograniczenia są liniowe.
Zadanie programowania nieliniowego sprowadza się tu do wyznaczenia nieujemnego wektora
, który minimalizuje lub maksymalizuje nieliniową funkcję
oraz równocześnie spełnia zbiór ograniczeń liniowych (C)
, i = 1,...,m
przy
j = 1,...,n
Zadanie to posiada dwa interesujące przypadki, upraszczające rozwiązanie. W pierwszym funkcja celu ma postać sumy n składników, z których każdy jest funkcją tylko jednej zmiennej xj. Tak więc
(C1)
Funkcja celu posiadająca powyższą własność nazywana jest funkcją addytywną.
W drugim przypadku, funkcja celu może być przedstawiona jako suma formy liniowej i formy kwadratowej, a mianowicie
(C2)
Tego rodzaju problem optymalizacji nazywa się zadaniem programowania kwadratowego.
Funkcja celu F oraz ograniczenia są nieliniowe, ale zakładamy ich addytywność. Oznacza to, że w problemie (A) zbiór ograniczeń (2) można przedstawić w postaci
, i = 1,...,m (D)
Funkcja celu F oraz ograniczenia są nieliniowe, ale ponadto zadanie na następujące cechy:
ograniczenia są tylko równowartościowe,
wszystkie zmienne xj są nieograniczonego znaku,
m < n, oraz
zarówno gi(x) jaki f(x) są ciągłe i posiadają przynajmniej drugie pochodne.
W tym przypadku zadanie ma zatem postać: znaleźć wektor
, który ekstremalizuje funkcję
(E)
przy warunkach
, i = 1,...,m
Ten typ zadania nosi nazwę „klasycznego problemu optymalizacji”; jego analityczne rozwiązanie zostało po raz pierwszy podane przez Lagrange'a.
Na zakończenie listy poszczególnych przypadków programowania nieliniowego warto wspomnieć o jeszcze dwóch jego rodzajach. Pierwszy z nich nosi nazwę programowania liniowego w liczbach całkowitych i definiowany jest tak jak problem programowania liniowego (B), z tym jednak, że zmienne xj mogą przyjmować tylko wartości całkowite. Drugi natomiast nazywany jest programowaniem stochastycznym; jego celem jest rozwiązanie ogólnego problemu (A), lub jego przypadków szczególnych, w warunkach gdy parametry zadania (np. bi) są zmiennymi przypadkowymi.
Wśród metod stosowanych do rozwiązywania zadań optymalizacji statycznej wyróżnić należy metody analityczne oraz metody numeryczne. Nie istnieją jednak ani metody analityczne, ani numeryczne, pozwalające w sposób ogólny rozwiązać problem (A). Udaje się to tylko w szczególnych przypadkach, których lista prawie w całości została przedstawiona. I tak, metody analityczne dostarczają ogólnego narzędzia dla rozwiązywania „klasycznego problemu optymalizacji” (E) oraz takiej jego modyfikacji, gdy obok ograniczeń równościowych występują również ograniczenia nierównościowe. Ten ogólniejszy przypadek został w 1951 roku rozwiązany przez Kuhna i Tuckera, którzy podali warunki konieczne i wystarczające rozwiązania optymalnego. Nie trudno jednak się przekonać, że w przypadku wielowymiarowego problemu rozwiązanie analityczne staje się skomplikowane. Dlatego też, przy rozwiązywaniu konkretnych problemów posługujemy się z zasady metodami numerycznymi, natomiast teoria Lagrange'a oraz Kuhna i Tuckera służy głównie jako narzędzie teoretyczne. Od szeregu lat szuka się coraz efektywniejszych numerycznych metod optymalizacji, opartych o zastosowanie maszyn cyfrowych. Jako reprezentacyjne metody można wymienić:
metodę Simpleks, stosowaną do rozwiązywania zadań programowania liniowego (B),
metodę Wolfe'a, mającą zastosowanie do rozwiązywania zadań programowania kwadratowego (C2),
metody bezgradientowe minimalizacji funkcji wielu zmiennych bez ograniczeń, takie jak: Rosenbrocka, Neldera i Meada, Powella i inne,
metody gradientowe minimalizacji funkcji wielu zmiennych bez ograniczeń, a więc: największego spadku, gradientu sprzężonego, Davidona itp.,
metody poszukiwania ekstremum funkcji celu z ograniczeniami nierównościowymi typu (2) przez wprowadzenie funkcji kary, takie jak: Rosenbrocka, Carrolla, Powella itp.
Zwróćmy uwagę, że w powyższym wykazie nie sformułowano dodatkowych wymagań jakie musi spełniać funkcja f(x) oraz zbiór ograniczeń, by dana metoda była zbieżna. Wymagania te zostaną szczegółowo omówione przy rozpatrywaniu odpowiednich algorytmów, dlatego na razie je pominięto. Natomiast nasuwa się pytanie dlaczego wymieniono wiele metod poszukiwania ekstremum bez ograniczeń, kiedy interesują nas w zasadzie zadania z ograniczeniami. Wynika to z tej przyczyny, że przy numerycznym rozwiązywaniu zadania programowania nieliniowego można adaptować metody ekstremalizacji funkcji wielu zmiennych bez ograniczeń do przypadków z nierozwikłanymi ograniczeniami równościowymi.
Bardzo efektywną metodą poszukiwania ekstremum jest metoda Simpleks i jej modyfikacje. Metodę tę stosuje się jednak jedynie do problemów liniowych. Stąd też, mając do rozwiązania nieliniowy problem optymalizacji często usiłuje się sprowadzić go drogą aproksymacji bądź odpowiednich podstawień do problemu liniowego. Jeśli się to powiedzie, posługujemy się następnie programowaniem liniowym. Tego typu postępowanie stosujemy przy rozwiązywaniu problemów (C1) i (D), dlatego nie będziemy się nimi zajmować oddzielnie. Zrozumiałą jest rzeczą, że jeśli zadanie nie da się sprowadzić do liniowego, sięgnąć trzeba do innych metod numerycznych. Wyliczono je już powyżej - należy zwrócić tylko uwagę, że nie wspomniano dotąd o metodzie programowania dynamicznego, którą również można stosować do rozwiązywania niektórych zadań programowania nieliniowego. Zrobiono to celowo, bowiem dokładniej jest ona rozpatrzona przy omawianiu optymalizacji dynamicznej.
1.2. Ekstrema bezwarunkowe i warunkowe
Dla dalszego tekstu tego skryptu użyteczne będzie przytoczenie definicji ekstremów funkcji. Ekstrema dzielą się na minima i maxima, ekstrema globalne i lokalne oraz warunkowe i bezwarunkowe. Podamy następujące definicje:
Globalne maksimum
Funkcja f(x) określona w domkniętym zbiorze X w En przyjmuje globalne maksimum w punkcie
∈ X,
jeżeli f(x) ≤ f(
) dla wszystkich punktów x ∈ X (6)
Globalne maksimum f(x) nosi również nazwę absolutnego maksimum. Jeśli domknięty zbiór X jest zbiorem ograniczonym, wówczas globalne maksimum f(x) w X występuje w jednym lub w większej ilości punktów należących do X, pod warunkiem, że f(x) jest ciągła względem zbioru X. Własność ta jest znana pod nazwą twierdzenia Weierstrassa. Jeśli natomiast zbiór X nie jest zbiorem ograniczonym, wówczas globalne maksimum może nie występować w żadnym punkcie X przy skończonym |x|, bądź też może istnieć ograniczona wartość f(x), gdy |x| → ∞ w określony sposób.
Silne lokalne maksimum
Zakłada się, że f(x) jest określona we wszystkich punktach należących do pewnego otoczenia δ punktu
w En. Funkcja f(x) posiada silne lokalne maksimum w
, jeśli istnieje takie ε, 0 < ε < δ, że dla wszystkich x spełniających zależność
, zachodzi
(7)
Inaczej mówiąc, funkcja f(x) posiada silne lokalne maksimum w
, jeśli istnieje takie otoczenie ε punktu
, że dla wszystkich x z tego otoczenia oraz różnych od
, f(x) jest ściśle mniejsza od f(
).
Słabe lokalne maksimum
Zakłada się, że f(x) jest określona we wszystkich punktach należących do pewnego otoczenia δ punktu
w En. Funkcja f(x) posiada słabe lokalne maksimum w
, jeśli nie osiąga silnego lokalnego maksimum w
oraz istnieje takie ε, ) < ε < δ, że dla wszystkich x spełniających zależność
, zachodzi
(8)
W większości przypadków nie zachodzi potrzeba rozróżnienia silnego maksimum lokalnego od słabego.
Definicje globalnego oraz lokalnych minimów są analogiczne do podanych powyżej z tm, że w przypadku minimum musimy zmienić kierunek znaków nierówności.
Definicje (6), (7) (8) odnoszą się do ekstremów bezwarunkowych, tj. do przypadków gdy zadaniu (1) nie towarzyszą ograniczenia (2). Jeśli ograniczenia takie są sformułowane, jako równości lub nierówności, to mówimy wówczas o ekstremach warunkowych. Odpowiednie definicje są następujące:
Globalne maksimum warunkowe
Funkcja f(x) określona w domkniętym zbiorze X w En przyjmuje globalne maksimum warunkowe w punkcie
∈ X spośród x spełniających
, i = 1,...,m, czyli
x ∈ Y, jeśli
dla wszystkich
spełniona jest zależność
(9)
Silne lokalne maksimum warunkowe
Funkcja f(x) przyjmuje silne lokalne maksimum warunkowe w punkcie
spośród x spełniających
, i = 1,...,m, jeśli istnieje takie otoczenie ε punktu
, przy czym ε > 0, że
dla wszystkich
oraz
z tego otoczenia, zachodzi
(10)
Słabe lokalne maksimum warunkowe
Funkcja f(x) przyjmuje słabe lokalne maksimum warunkowe w punkcie
spośród x spełniających
, i = 1,...,m, czyli x ∈ Y, jeśli nie osiąga silnego lokalnego maksimum warunkowego w
oraz jeśli istnieje takie otoczenie ε punktu
∈ Y, przy czym ε > 0, że
dla wszystkich x ∈ Y z tego otoczenia, zachodzi
(11)
Odpowiednie modyfikacje powyższych definicji w przypadku globalnego oraz lokalnych minimów warunkowych są oczywiste, więc nie będą odrębnie podawane.
1.3. Funkcje wypukłe i wklęsłe
W teorii programowania nieliniowego istotną rolę odgrywają własności wypukłości funkcji. Okazuje się bowiem, np. w metodzie Lagrenge'a lub w metodzie Kuhna-Tuckera, że pewne warunki konieczne rozwiązania stają się zarazem warunkami wystarczającymi, jeżeli funkcje f(x) oraz gi(x) są, w odpowiednich przypadkach, wypukłe bądź wklęsłe. Dla wygody zatem czytelnika przypomnimy teraz definicje wypukłości i wklęsłości funkcji. Poprzedzić je musimy definicją wypukłości zbioru w przestrzeni En.
Zbiór wypukły
Zbiór X jest zbiorem wypukłym w En, jeśli każdy odcinek łączący dwa dowolne elementy x1 i x2 ∈ X:
dla wszystkich λ, 0 ≤ λ ≤ 1 (12)
należy również do tego zbioru, tzn. x ∈ X.
Przykładami dwuwymiarowych figur wypukłych są m.in. koło, półkole, elipsa, trójkąt itp. W przestrzeni trójwymiarowej jako przykłady brył wypukłych mogą służyć: kula, równoległościan, graniastosłup itp.
Funkcja wypukła
Funkcja f(x) określona w wypukłym zbiorze X w En jest wypukła, jeśli dla dowolnych dwóch punktów x1 i x2 ∈ X oraz dla wszystkich λ, 0 ≤ λ ≤ 1 spełniona jest zależność
(13)
Funkcja wklęsła
Funkcja f(x) określona w wypukłym zbiorze X w En jest wklęsła, jeśli dla dowolnych dwóch punktów x1 i x2 ∈ X oraz dla wszystkich λ, 0 ≤ λ ≤ 1 spełniona jest zależność
(14)
Inaczej mówiąc, hyperpowierzchnia F = f(x) jest wklęsła, jeśli każdy odcinek łączący dwa dowolne punkty na powierzchni [x1, F1], [x2, F2] leży na lub poniżej tej powierzchni. Funkcję wklęsłą jednej zmiennej dla x ≥ 0 przedstawiono na rys. 1. Podobnie możemy określić wypukłość funkcji, a więc: hyperpowierzchnia F = f(x) jest wypukła, jeśli każdy odcinek łączący dwa dowolne punkty na powierzchni leży na lub powyżej tej powierzchni. Funkcję wypukłą jednej zmiennej przedstawiono na rys. 2.
Rys. 1 Rys. 2
Zauważmy, że funkcja pokazana na rys. 3 nie jest ani wklęsła ani wypukła, ponieważ odcinek łączący punkty [x1, f(x1)] oraz [x3, f(x3)] leży ponad f(x) pomiędzy x1 i x2, natomiast poniżej f(x) pomiędzy x2 i x3. Jednakże funkcja ta jest wypukła w przedziale 0 ≤ x ≤ x4 oraz wklęsła w przedziale x ≥ x4.
Rys. 3
Z przytoczonych definicji wynika, że jeśli f(x) jest wypukła to -f(x) jest wklęsła i odwrotnie. Jeśli w zależnościach (13) i (14) nierówności są ostre, przy czym 0 < λ < 1, wówczas mówimy, że dana funkcja jest „ściśle” wypukła bądź wklęsła.