slajdy z sqp

Transkrypt

slajdy z sqp
Sekwencyjne programowanie
kwadratowe
Przy użyciu pakietu optim w Octave
SQP
• Sequential quadratic programming (SQP) is an
iterative method for nonlinear optimization.
SQP methods are used on problems for which
the objective function and the constraints are
twice continuously differentiable.
SQP
• Rozważmy programowania nieliniowego:
• Lagrangian tego problemu to:
• W k-tej iteracji, podstawowy algorytm sqp
definiuje odpowiedni kierunek poszukiwao dk
jako rozwiązanie następującego podproblemu
programowania kwadratowego.
SQP
• Metoda SQP rozwiązuje ciąg podproblemów optymalizacyjnych,
każdy z nich optymalizuje model kwadratowy funkcji celu przy
zlinearyzowanych warunkach ograniczających.
• Jeśli problem jest bez ograniczeo, metoda redukuje się do metody
Newtona znajdowania zerowego gradientu.
• Jeśli problem ma tylko ograniczenia w postaci równości, wtedy
metoda jest równoważna zastosowaniu metody Newtona do
warunków optymalizacji pierwszego rzędu (warunki Karush Kuhn
Tuckera) dla danego problemu.
Implementacja SQP w optim w Octave
• Plik funkcji:
–
–
–
–
–
–
•
[x, obj, info, iter, nf, lambda] = sqp (x0, phi)
[...] = sqp (x0, phi, g)
[...] = sqp (x0, phi, g, h)
[...] = sqp (x0, phi, g, h, lb, ub)
[...] = sqp (x0, phi, g, h, lb, ub, maxiter)
[...] = sqp (x0, phi, g, h, lb, ub, maxiter, tolerance)
Rozwiąż program nielinowy:
• P.w.
min phi (x)
x
g(x) = 0
h(x) ≥ 0
lb ≤ x ≤ ub
[...] = sqp (x0, phi, g, h, lb, ub, maxiter, tolerance)
• Pierwszy argument to punkt początkowy, czyli wektor x0.
• Drugi argument to etykieta funkcji wskazująca na funkcję celu w
następującej formie:
– y = phi (x),
gdzie x jest wektorem a y skalarem.
• Drugi argument może również byd 2- lub 3- elementowy wektor etykiet
funkcji. Pierwszy element powinien wskazywad na funkcję celu, drugi na
funkcję, która wylicza gradient funkcji celu, a trzeci powinien wskazywad
na funkcję, która wylicza Hesjan funkcji celu
– Jeśli gradient nie jest podany, będzie policzony przy użyciu skooczonych różnic.
– Jeśli Hesjan nie jest podany, formuła algorytmu BFGS będzie użyta jako
przybliżenie Hesjanu
• Jeśli podany, gradient powinien byd w następującej formie
– g = gradient (x),
gdzie x jest wektorem i g jest wektorem.
• Jeśli podany, Hesjan powinien byd w następującej formie
– h = hessian (x),
gdzie x jest wektorem i h jest macierzą.
• Trzeci i czwarty argument to etykiety funkcji wskazujące na funkcje, które
wyliczają ograniczenia w postaci, odpowiednio, równości i nierówności.
• Jeśli problem nie ma ograniczeo w postaci równości (lub nierówności), użyj
pustą macierz ([]).
• Jeśli podane, funkcje ograniczeo w postaci równości i nierówności powinny
byd w następującej formie
– r = f (x),
gdzie x jest wektorem i r jest wektorem.
[...] = sqp (x0, phi, g, h, lb, ub, maxiter, tolerance)
• Trzeci i czwarty argument może byd 2elementowymi wektorami etykiet funkcji
– Pierwszy element powinien wskazywad na funkcję
ograniczeo a drugi powinien wskazywad na funkcję
wyliczającą gradient funkcji ograniczeo
[ d f(x) d f(x)
d f(x) ]
transpose ( [ ------- ----- ... ------ ] )
[ dx_1 dx_2
dx_N ]
• Piąty i szósty argument zawiera dolne i górne ograniczenie na x.
Muszą byd zgodne z ograniczeniami. Jeśli są skalarne, to wszystkie
elementy x mają to samo ograniczenie. Jeśli nie podany, to używa
wartośd bazową (-realmax,+realmax)
• Siódmy argument podaje maksymalną liczbę iteracji. Wartośd
bazowa 100
• Ósmy argument podaje tolerancję kryteriów stopu. Wartośd
bazowa sqrt(eps)
[x, obj, info, iter, nf, lambda] = sqp (x0, phi, g, h, lb, ub, maxiter, tolerance)
• Wartość info może przyjmowad wartości:
– The algorithm terminated normally. Either all
constraints meet the requested tolerance, or the
stepsize, delta x, is less than tol * norm (x).
– The BFGS update failed.
– The maximum number of iterations was reached.
Przykład
Przykład
function r = g (x)
r = [ sumsq(x)-10; x(2)*x(3)-5*x(4)*x(5);
x(1)^3+x(2)^3+1 ];
endfunction
function obj = phi (x)
obj = exp(prod(x)) - 0.5*(x(1)^3+x(2)^3+1)^2;
Endfunction
x0 = [-1.8; 1.7; 1.9; -0.8; -0.8]; [x, obj, info, iter, nf,
lambda] = sqp (x0, @phi, @g, [])