Escolar Documentos
Profissional Documentos
Cultura Documentos
Otimização Restrita
Trabalho Computacional I
Otimização Restrita
Introdução 4
Questão 1) 5
Questão 2) 10
Questão 3) 15
Trabalho Computacional II
Otimização Restrita
Introdução
Este relatório apresenta uma análise detalhada e a solução de três problemas de otimização
restrita, que foram resolvidos usando diferentes técnicas de otimização e algoritmos. A
otimização é uma ferramenta poderosa que permite encontrar a melhor solução possível (ou
seja, a solução ótima) para um problema, dadas certas restrições. Em muitos casos, a solução
ótima não pode ser encontrada simplesmente por intuição ou tentativa e erro, e é necessário
usar técnicas matemáticas e computacionais avançadas.
Os problemas de otimização que analisei neste relatório são problemas não-lineares com
várias variáveis e restrições. Para resolver esses problemas, usei várias técnicas, incluindo a
formulação do problema como um problema irrestrito usando o Método da Penalidade Interior,
a escolha de um algoritmo de otimização adequado, a implementação do algoritmo em Python,
e a verificação da solução ótima.
O primeiro problema envolveu a otimização de uma função objetivo sujeita a várias restrições.
Usei o Método Quasi-Newton BFGS para resolver este problema. O segundo problema
também envolveu a otimização de uma função objetivo com restrições, mas neste caso, usei o
Método da Penalidade Interior para converter o problema restrito em um problema irrestrito, e
então usei o algoritmo BFGS para resolver o problema irrestrito. O terceiro problema foi
semelhante ao segundo, mas com uma função objetivo e restrições diferentes.
Em cada caso, forneci uma análise detalhada do problema, expliquei as técnicas e algoritmos
que usei para resolvê-lo, e apresentei a solução ótima que encontrei. Também verifiquei se a
solução ótima satisfaz todas as restrições do problema, e comparei a solução ótima que
encontrei com a solução ótima fornecida no problema, quando disponível.
Trabalho Computacional II
Otimização Restrita
Questão 1)
O item (a) da questão 1 pede para aplicar o Método das Penalidades Exteriores para converter
o problema restrito em um problema irrestrito e reescrever o problema de otimização.
O Método das Penalidades Exteriores é uma técnica usada para resolver problemas de
otimização restrita, transformando-os em uma sequência de problemas de otimização irrestrita.
Ele faz isso adicionando uma penalidade à função objetivo para cada violação das restrições.
O problema original é:
Podemos reescrever este problema como um problema irrestrito adicionando uma função de
penalidade P(r) para cada restrição r que é violada. A função de penalidade é geralmente uma
função que é zero quando a restrição é satisfeita e positiva quando a restrição é violada. Uma
escolha comum para a função de penalidade é o quadrado da violação da restrição.
Para a restrição de igualdade abc = 0.032, podemos usar a penalidade (abc - 0.032)^2. Esta
penalidade é zero quando abc = 0.032 e positiva quando abc ≠ 0.032.
onde
Os k's são constantes positivas que determinam o peso das penalidades. As funções max
garantem que as penalidades são aplicadas somente quando as restrições são violadas.
Escolhi o Método Quasi-Newton BFGS para resolver este problema de otimização. O BFGS é
um método iterativo que usa informações das iterações anteriores para formar uma
aproximação da matriz hessiana, o que o torna mais eficiente do que métodos que requerem o
cálculo da matriz hessiana, como o Método de Newton.
O BFGS é adequado para problemas de otimização não-linear, como este. Ele pode lidar com
funções que não são necessariamente convexas e pode encontrar o mínimo global em muitos
casos, embora isso não seja garantido para todas as funções. Este é um método bem
estabelecido com muitas implementações disponíveis em várias linguagens de programação, o
que facilita a sua utilização.
Portanto, devido à sua eficiência, adequação para problemas não-lineares e facilidade de uso,
escolhi o Método Quasi-Newton BFGS para resolver este problema de otimização
Para resolver essa parte da questão, precisei implementar o Método Quasi-Newton BFGS e
executá-lo no problema de otimização, em Python usando a função “minimize” da biblioteca
“scipy.optimize”:
A resposta determinada pelo código não é exatamente (a, b, c) = (0.3132, 0.391, 0.2607),
contudo podemos ver que eles são bastante próximos. A diferença pode ser devida a vários
fatores, como a precisão do algoritmo de otimização, os valores iniciais escolhidos, ou a função
de penalidade usada.
Podemos ver que a solução obtida está próxima da solução ótima do exercício, mas há uma
pequena diferença. Isso pode ser devido à precisão numérica e ao método de otimização
usado.
Portanto, a solução obtida é factível e está próxima da solução ótima fornecida pelo exercício.
Dessa forma, a solução ótima encontrada para o problema de otimização, usando o Método
Quasi-Newton BFGS, é (a, b, c) = (0.28128407 0.41375869 0.27495252).
O critério de parada adotado foi o padrão do método BFGS implementado pela função
‘minimize’ da biblioteca ‘scipy.optimize’ em Python, que é quando a mudança no valor da
função objetivo é menor que uma tolerância especificada ou quando o número máximo de
iterações é atingido.
0 1 0
0 0 1
Questão 2)
Onde a equação (2a) é a função-objetivo que representa o peso da treliça; as equações (2b) e
(2c) representam o estresse máximo que as barras 1 e 2 podem suportar; a equação (2d)
representa o estresse mínimo na terceira barra e (2e) representa os limites das variáveis.
L(x1, x2, λ1, λ2, λ3, ρ) = (2√2)x1+x2 + λ1(Px2+x1√2 - 20) + λ2(Px1+x2√2 - 20) + λ3(-Px2 + 15)
+ (ρ/2) * ((Px2+x1√2 - 20)^2 + (Px1+x2√2 - 20)^2 + (-Px2 + 15)^2)
Trabalho Computacional II
Otimização Restrita
Onde ρ é um parâmetro de penalidade que é aumentado a cada iteração.
Ele também é capaz de lidar efetivamente com restrições de desigualdade, que são o tipo de
restrições presentes neste problema, e de encontrar soluções que satisfazem as restrições
com uma precisão maior do que os métodos de penalidade interior ou exterior.
Portanto, para a parte (b) da questão 2, eu escolhi o Método do Lagrangeano Aumentado para
resolver o problema de otimização.
import numpy as np
from scipy.optimize import minimize
def penalty(x):
"""
Função de penalidade que adiciona penalidades para cada restrição que não é
satisfeita.
Trabalho Computacional II
Otimização Restrita
"""
x1, x2 = x
P = 20
mu = 1000 # Constante de penalidade
g1 = P * ((x2 + x1*np.sqrt(2)) / ((x1**2)*np.sqrt(2) + 2*x1*x2)) - 20
g2 = P * (1 / (x1 + x2*np.sqrt(2))) - 20
g3 = -P * (x2 / ((x1**2)*np.sqrt(2) + 2*x1*x2)) + 15
g4 = 0.1 - x1
g5 = x1 - 5
g6 = 0.1 - x2
g7 = x2 - 5
return mu * (max(0, g1)**2 + max(0, g2)**2 + max(0, g3)**2 + max(0, g4)**2 +
max(0, g5)**2 + max(0, g6)**2 + max(0, g7)**2)
4. No exemplo de código que forneci, os valores iniciais são 0.5 para ambos x1 e x2.
5. 16 iterações.
# Restrições
g1 = P * ((x2 + x1*np.sqrt(2)) / ((x1**2)*np.sqrt(2) + 2*x1*x2)) - 20
g2 = P * (1 / (x1 + x2*np.sqrt(2))) - 20
g3 = -P * (x2 / ((x1**2)*np.sqrt(2) + 2*x1*x2)) + 15
g4 = 0.1 - x1
g5 = x1 - 5
g6 = 0.1 - x2
g7 = x2 - 5
Para cada restrição, o valor calculado deve ser menor ou igual a zero para que a
restrição seja satisfeita. Como todos os valores obtidos são menores ou muito semelhantes a
zero, isso indica que todas as restrições foram atendidas tecnicamente.
import numpy as np
import matplotlib.pyplot as plt
# Gerando os valores de x e y
x = np.linspace(-1.5, 1.5, 400)
y = np.linspace(-0.5, 2.5, 400)
x, y = np.meshgrid(x, y)
# Mostrando o gráfico
plt.show()
O Método da Penalidade Interior adiciona uma penalidade à função objetivo para cada
restrição que é violada. A penalidade é uma função da quantidade pela qual a restrição é
violada e de um parâmetro de penalidade. Para restrições de desigualdade do tipo g(x) ≥ 0, a
penalidade é geralmente da forma -1/(g(x) - μ), onde μ é um pequeno valor positivo. A
penalidade é negativa porque queremos penalizar soluções que violam a restrição, e a
restrição é violada quando g(x) < 0.
Note que as restrições de desigualdade (3b) e (3c) foram incorporadas na função objetivo
como termos de penalidade, e μ é um pequeno valor positivo à escolha. As restrições de
desigualdade (3d) e (3e) permanecem as mesmas.
import numpy as np
from scipy import optimize
# Parâmetros
precisao = 0.5e-8 # Precisão: percentual de diferença de x entre duas gerações
u = 1. # Valor inicial de u
Trabalho Computacional II
Otimização Restrita
alpha = .9 # Aceleração do valor de u
xlast = np.array([np.inf, np.inf]) # Último valor de u
iteracoes = 1 # Contador de iterações
custo_total = 0 # Custo total de iterações
while True:
# Define a nova função-objetivo com penalidades para as restrições
def fh(vars):
x, y = vars[0], vars[1]
return (
(1 - x)**2 + 100*( (y - x**2)**2 ) # f(.)
- u/((x - 1)**3 - y + 1) # g1
- u/( x + y - 2 ) # g2
- u/( -1.5 - x ) # g3
- u/( x - 1.5 ) # g4
- u/( -0.5 - y ) # g5
- u/( y - 2.5 ) # g6
)
# Ponto inicial
x0 = np.array([-0.5, 2], dtype=float)
# Senão, aumente u
else:
xlast = xopt
u = alpha*u
iteracoes += 1
# Exibe resultado
print('RESULTADO')
print('f - ótimo %d' % fopt)
print('x-ótimo: ' + str(xopt))
print('Custo total: ' + str(custo_total))
Trabalho Computacional II
Otimização Restrita
print('Valor final de u: %.1e' % u)
print('Número de iterações: %d' % iteracoes)
RESULTADO
f - ótimo 0
x-ótimo: [0.99999842 0.99999287]
Custo total: 6141
Valor final de u: 1.6e-11
Número de iterações: 237
Os valores que você obteve para as variáveis de decisão (x1, x2) = (1.01999017, 0.98972852)
estão próximos do ponto ótimo fornecido no problema, que é (x, y) = (1, 1). A diferença é
pequena e pode ser devido à precisão numérica ou ao valor do parâmetro de penalidade μ que
você escolheu.
O custo total, que é a soma do número de iterações do método BFGS em todas as iterações do
método de penalidade, é 6141. Isso indica que o método BFGS foi chamado 6141 vezes no
total para resolver o problema.
O valor final de u, que é o parâmetro de penalidade, é 1.6e-11. Isso é muito pequeno, o que
indica que as restrições do problema são bem satisfeitas na solução ótima.
O número total de iterações do método de penalidade é 237. Isso indica que o método de
penalidade aumentou o parâmetro de penalidade e resolveu o problema de otimização irrestrita
237 vezes para encontrar a solução ótima.
Esses resultados demonstram que o método de penalidade, combinado com o método BFGS
para a otimização irrestrita, é capaz de resolver efetivamente o problema de otimização restrita.
Trabalho Computacional II
Otimização Restrita
No entanto, o custo total é relativamente alto, o que indica que o método pode ser
computacionalmente intensivo para problemas maiores ou mais complexos.