This repository contains a collection of MATLAB scripts that implement some of the classical optimization methods for constrained optimization models: Penalty and Barrier methods, linear and non-linear Zoutendijk and also the Gradient Projection Method of Rosen (GPMR).
Esta seção do repositório aborda algoritmos projetados para resolver problemas de otimização restrita, onde o objetivo é minimizar uma função sujeito a um conjunto de restrições de igualdade e/ou desigualdade. Os métodos implementados aqui se dividem em duas categorias principais: Métodos de Penalidade e Barreira e Métodos Primais.
A ideia central destes métodos é transformar um problema de otimização restrita em uma sequência de problemas de otimização irrestrita. Isso é feito através da criação de uma função auxiliar que combina a função objetivo original com termos que medem as violações das restrições.
O método de penalidade adiciona um termo à função objetivo que impõe uma "penalidade" por qualquer violação das restrições. A abordagem gera uma sequência de pontos que são tipicamente infactíveis (exteriores à região viável) e que convergem para a solução ótima do problema original à medida que o parâmetro de penalidade aumenta.
A função objetivo aumentada (ou auxiliar) é formulada como:
onde
O algoritmo, conhecido como Técnica de Minimização Irrestrita Sequencial (SUMT), resolve uma sequência de problemas irrestritos, aumentando o valor de
Este script implementa o método de penalidade exterior utilizando a abordagem SUMT e resolve o seguinte exemplo de problema de otimização restrita:
Diferente do método de penalidade, o método de barreira adiciona um termo à função objetivo que cria uma "barreira" para impedir que os pontos gerados saiam da região viável. O algoritmo, portanto, trabalha com uma sequência de pontos estritamente factíveis (interiores à região viável) que convergem para a solução ótima.
A função objetivo aumentada é formulada como:
onde
O processo iterativo resolve uma sequência de problemas irrestritos, reduzindo o valor de
Este script implementa o método de barreira interior e resolve o mesmo exemplo de problema de otimização restrita do método de penalidade:
Um único problema a se destacar é que, dado que o problema de otimização resolvido por fmincon é:
Não há como utilizar restrições de desigualdade estrita, mas é possível utilizar algo como:
Porém, na realidade o que teremos com fmincon é:
Então é possível atribuir um valor mínimo para TolFun por meio de optimoptions que seja menor que
Métodos primais são algoritmos que trabalham diretamente no problema original, realizando uma busca pela solução ótima através da região viável. Uma característica fundamental é que cada ponto gerado pelo processo é viável, e o valor da função objetivo decresce a cada iteração. Uma grande vantagem é que, caso o algoritmo seja interrompido prematuramente, o ponto atual é uma solução viável para o problema.
Este método pertence à classe dos Métodos de Direções Viáveis (FDM). Cada iteração consiste em dois passos principais:
-
Determinação de uma Direção: Encontra-se uma direção de busca
$d_k$ que seja simultaneamente viável (não sai da região viável para um passo pequeno) e de descida (reduz o valor da função objetivo, ou seja,$\nabla f(x_k)^T d_k < 0$ ). Essa direção é tipicamente encontrada resolvendo-se um subproblema de programação linear que busca alinhar$d_k$ o mais próximo possível do gradiente negativo, respeitando as restrições ativas. -
Busca Unidimensional (Line Search): Determina-se o tamanho do passo
$\alpha_k$ que minimiza a função objetivo na direção$d_k$ , garantindo que o novo ponto$x_{k+1} = x_k + \alpha_k d_k$ permaneça na região viável.
Este script aplica o método de Zoutendijk e resolve o seguinte exemplo de problema de otimização com restrições lineares:
Este script adapta o método de Zoutendijk para lidar com problemas de otimização que possuem restrições não lineares e resolve o seguinte exemplo:
Este método pertence à classe dos Métodos de Conjunto Ativo (Active Set Methods) A ideia principal é projetar o gradiente negativo sobre a superfície definida pelas restrições ativas no ponto atual.
- A direção de busca
$d_k$ é calculada como$d_k = -P \nabla f(x_k)$ , onde$P$ é a matriz que projeta um vetor sobre o subespaço tangente formado pelas restrições do "conjunto de trabalho" (working set). - Se a direção projetada
$d_k$ for não nula, ela é uma direção de descida, e uma busca unidimensional é realizada para encontrar o próximo ponto. - Se a direção projetada for nula, o ponto atual é um mínimo sobre a superfície das restrições ativas. Os multiplicadores de Lagrange são então calculados para verificar a otimalidade KKT. Se todos os multiplicadores forem não-negativos, a solução ótima foi encontrada. Caso contrário, a restrição associada ao multiplicador mais negativo é removida do conjunto de trabalho, permitindo que a próxima iteração explore uma direção que se afaste dessa fronteira para continuar diminuindo a função objetivo.
Este script implementa o Método de Projeção de Gradientes de Rosen e resolve o seguinte problema de otimização:
[1] [Bazaraa, 2006] M.S. Bazaraa, H.D. Sherali, C. Shetty, Nonlinear Programming: Theory and Algorithms, 3rd Ed., John Wiley, 2006.
[2] [Luenberger 2008] D.G. Luenberger, Y. Ye, Linear and Nonlinear Programming, Third Ed., Addison Wesley, 2008, Springer
[3] [Griva, 2009] Igor Griva, Stephen G. Nash & Ariela Sofer. Linear and Nonlinear Optimization 2nd Ed., SIAM, Philadelphia, USA.
[4] [Bakr, 2013] Mohamed Bakr. Nonlinear Optimization in Electrical Engineering with Applications in MATLAB 2nd Ed., IET, London, United Kingdom
[5] [Bertsekas, 1999] Dimitri P. Bertsekas. Nonlinear Programming. Athena Scientific. 2nd Ed., 1999
[6] [Antoniou, 2007] Antoniou, A. and Lu, W.S Practical Optimization: Algorithms and Engineering Applications, Springer, 2007