Escolar Documentos
Profissional Documentos
Cultura Documentos
ii
1 ndice
2 Resumo ................................................................................................................................ 1
3 Cronograma ......................................................................................................................... 2
4 Introduo............................................................................................................................ 3
5 Mtodos Irrestritos............................................................................................................... 8
5.1 Mtodos Unidimensionais Irrestritos............................................................................ 8
5.1.1 Mtodo de Fibonacci Fibonacci Search Method ............................................ 8
5.1.2 Mtodo da Razo urea Search By Golden Section....................................... 9
5.1.3 Busca por ajuste de curva .................................................................................... 10
Mtodo de Newton Newtons Method ............................................................... 10
Mtodo da Falsa Posio Method of False Position .......................................... 11
Ajuste Cbico Cubic Fit .................................................................................... 12
Ajuste Quadrtico Quadratic Fit ....................................................................... 12
5.2 Critrios de Parada de uma Busca Unidimensional.................................................... 13
5.2.1 Teste da Porcentagem.......................................................................................... 14
5.2.2 Critrio de Armijo ............................................................................................... 14
5.2.3 Teste de Goldstein ............................................................................................... 15
5.2.4 Teste de Wolfe..................................................................................................... 15
5.3 Mtodos n-dimensionais Irrestritos ............................................................................ 15
5.3.1 Mtodo da Inclinao Mxima The Steepest Descent Method ..................... 16
5.3.2 Mtodo de Newton n-dimensional Newtons Method................................... 20
5.3.3 Mtodos de Direes Conjugadas ....................................................................... 22
Mtodo dos Gradientes Conjugados Conjugate Gradient Method.................... 24
Mtodo Geral dos Gradientes Conjugados............................................................... 25
Mtodo Fletcher-Reeves........................................................................................... 26
Mtodo Polak-Ribiere .............................................................................................. 27
5.3.4 Mtodos Quasi-Newton....................................................................................... 28
Mtodo de Newton Modificado................................................................................ 28
Mtodo Clssico de Newton Modificado ................................................................. 29
Mtodo Davidon-Fletcher-Powell ............................................................................ 30
6 Mtodos Restritos.............................................................................................................. 31
6.1 Restries de Igualdade .............................................................................................. 31
6.1.1 Condies de 1 ordem ........................................................................................ 31
6.1.2 Condies de 2 ordem ........................................................................................ 32
6.2 Restries de Desigualdade ........................................................................................ 33
6.2.1 Condies de 1 ordem ........................................................................................ 33
6.2.2 Condies de 2 ordem ........................................................................................ 34
7 Implementaes ................................................................................................................. 36
7.1 Busca Unidimensional................................................................................................ 37
7.2 Busca n-dimensional .................................................................................................. 38
7.2.1 Caso Quadrtico .................................................................................................. 38
7.2.2 Caso no-Quadrtico ........................................................................................... 39
8 Simulated Annealing.......................................................................................................... 41
8.1 O mtodo computacional Simulated Annealing......................................................... 42
ii
2 Resumo
Este trabalho um estudo dos mtodos iterativos para resoluo de problemas de
otimizao no qual a funo objetivo extremamente no linear e repleta de extremos
locais, pontos de sela, regies praticamente planas entre outras caractersticas topolgicas.
Dessa forma, para se alcanar o mnimo global deve-se utilizar uma tcnica de
otimizao apropriada, com destaques para o Simulated Annealing (SA) que possui ao
menos duas caractersticas positivas: a princpio, escapam de pontos de mnimo local e no
dependem da aproximao inicial da soluo. Apesar de ser uma tcnica robusta, o SA
requer alto tempo computacional empregado e apresenta dificuldade de realizar uma busca
refinada em regies promissoras.
Com objetivo de contornar tais obstculos, recentemente surgiram os algoritmos
hbridos que misturam um algoritmo de busca global com um de busca local, e so
algoritmos deste tipo que sero desenvolvidos neste trabalho.
3 Cronograma
Jan
Fev
Mar
Abr
Mai
Jun
Jul
Ago
X
X
X
X
Set
Out
Nov
preliminares
dos
aspectos
tericos de otimizao
4 Introduo
As tcnicas de otimizao aparecem com freqncia em diversas reas. Na Economia,
por exemplo, h um objetivo claro de maximizar os lucros de uma empresa, minimizar o
custo de produzir um dado nvel de produo. Na Medicina deseja-se obter o menor erro
funcional para o problema inverso de tomografia por impedncia eltrica, dentre outros.
Os problemas reais modelados como problemas de otimizao geram funes e
restries que variam consideravelmente. Os problemas podem ser lineares ou no
lineares, irrestritos ou restritos, unidimensionais ou multidimensionais e a busca pode ser
pelo timo global ou pelo timo local. Resolver analiticamente um problema de
otimizao, muitas vezes, no uma tarefa trivial, sendo preciso recorrer s tcnicas
iterativas e computacionais. Existem diversas tcnicas iterativas de otimizao para os
mais diversos tipos de problema, porm no existe uma tcnica de propsito geral.
O objetivo deste projeto promover um estudo dos mtodos de otimizao no linear
em seu aspecto terico, prtico e comparativo. O desenvolvimento se deu nas seguintes
etapas:
Estudo dos os mtodos iterativos para busca do timo local, implementao dos
mtodos mais relevantes, validao de cada um deles atravs de exemplos da
literatura e comparao do desempenho entre os mtodos implementados como
tempo computacional, eficincia e preciso do resultado.
No segundo item, alguns dos mtodos a serem estudados para otimizao irrestrita so:
mtodo da inclinao mxima, mtodo de Newton, mtodo de Fibonacci para funes
unidimensionais, mtodo dos gradientes conjugados, mtodos Quasi-Newton, mtodo de
Powell (que usa somente valores da funo objetiva), mtodo Fletcer-Powell.
Para
otimizar f(x1,x2,...,xn)
s.a. gi(x1,x2,...,xn) =ai
hj(x1,x2,...,xn) bj
i=0,,m1
j=0,,m2
P7
P2
P3
P1
P4
P6
P5
for satisfeita (LUENBERGER, 1984). Isso significa que, uma funo convexa se a regio
acima da curva convexa, ou seja, dados quaisquer dois pontos acima da curva existe um
segmento de reta que liga esses dois pontos e no corta a curva, conforme figura abaixo.
(a)
(b)
xk+1 = xk + k.dk
O novo ponto xk+1 melhor que o anterior xk se a funo objetivo f satisfizer f(xk+1) <
f(xk) para o problema de minimizao ou satisfizer f(xk+1) > f(xk) para o problema de
maximizao. As iteraes cessam quando algum critrio de parada pr-estabelecido for
satisfeito como, por exemplo, | f | < ( pequeno) (BARD, 1974).
Como exemplo, o mtodo da inclinao mxima um dos mais antigos e mais
conhecidos mtodos para minimizao de uma funo de vrias variveis. O mtodo da
inclinao mxima baseado na inclinao do gradiente e, portanto, a direo escolhida
para o clculo do novo ponto no processo iterativo :
dk = - f(xk)
para maximizao
5 Mtodos Irrestritos
O objetivo desenvolver o estudo de diversas tcnicas iterativas utilizadas para a
resoluo de problemas de minimizao irrestritos de busca local. O conhecimento
aprofundado dessas tcnicas essencial para a preparao, estudo e desenvolvimento de
ferramentas mais eficientes quanto velocidade de convergncia e facilidade de
implementao. A seguir sero apresentados os mtodos estudados, suas caractersticas,
vantagens e desvantagens.
FN 1
d1
F
d k = N k +1 d1
FN
onde
Fk : elementos da seqncia de Fibonacci (1,1,2,3,5,8,13,...).
d k : intervalo de incerteza em k passos.
1
processo o intervalo de incerteza tem comprimento d k =
1
1
k 1
d1 , onde 1 1,618 e
0,618 .
A partir da possvel construir uma funo quadrtica q ( x ) tal que seja igual a
f ( x ) expandida em srie de Taylor em torno de x k e truncada aps a primeira derivada:
q( x ) = f ( x k ) + f (x k )(x x k ) +
1
2
f ( k )( x x k )
2
(1)
x k +1 = x k
f ( x k )
f ( x k )
(2)
(3)
10
x k 1 x k
2
onde
(4)
f (x k 1 ) f ( x k )
0 = q ( x k +1 ) = f ( x k ) +
f ( x k 1 ) f ( x k )
( x k +1 x k )
x k 1 x k
(5)
isolando xk +1 :
x k 1 x k
x k +1 = x k f ( x k )
f ( x k 1 ) f ( x k )
(6)
11
f ( x k ) + u 2 u1
x k +1 = x k ( x k x k 1 )
f ( x k ) f ( x k 1 ) + 2u 2
(7)
onde
u1 = f ( x k 1 ) + f ( x k ) 3
f ( x k 1 ) f ( x k )
x k 1 x k
2
u2 = u1 f ( xk 1 ) f ( xk )
(8)
12
(9)
Apesar do Mtodo nos levar a crer que a ordem de convergncia seja 3 devido sua
caracterstica cbica, temos na verdade uma ordem de convergncia 2.
12
q( x ) = i =1 f i
3
(x x )
(x x )
j
j i
j i
(10)
x4 =
2 a 23 f 1 + a31 f 2 + a12 f 3
(11)
onde
aij = xi x j , bij = xi x j
2
(12)
13
( ) = f ( x k + d k )
(13)
O critrio ter por base a seguinte funo: (0) + (0) para um valor fixo tal
que 0< <1.
O parmetro considerado como no to grande se
( ) (0) + (0 )
(14)
(15)
14
( ) > (0 ) + (1 ) (0)
(16)
( ) > (1 ) (0)
(17)
15
S ( x, d ) = {y | y = x + d }
f ( y ) = min f ( x + d )
0
(18)
16
Considere:
f (x ) =
1 t
x Qx x t b
2
(19)
onde Q uma matriz n n simtrica positiva definida. Como Q positiva definida, todos
os autovalores de Q so positivos e ainda mais, da teoria de Anlise, como Q positiva
definida temos que f estritamente convexa.
Podemos ento encontrar o nico ponto de mnimo de f igualando o gradiente da
funo zero, ou seja, f ( x ) = 0 , satisfazendo Qx * = b .
(20)
g k = Qx k b
(21)
f ( x k g k ) =
1
(xk g k )t Q(xk g k ) (xk g k )t b = h( )
2
(22)
17
(23)
b ) + g kt Qg k = 0
(24)
dh 1
= 2 g kt Q( x k g k ) + g kt b = 0
d 2
( g )(Qx
t
k
g kt g k
g kt Qg k
(25)
gt g
x k +1 = x k t k k
g k Qg k
gk
(26)
onde g k = Qx k b .
Sobre a convergncia deste procedimento deve-se usar o Teorema 1 para se obter
uma idia de seu comportamento. Introduzindo ento a funo:
E (x ) =
t
1
(
x x * ) Q(x x * )
2
(27)
1 *t *
x Qx + f ( x )
2
(28)
ou seja,
E (x ) =
assim como ambas diferem apenas por uma constante procura-se minimizar E ( x ) ao invs
de f .
t
1
(
x x * ) Q(x x * ) , em todo passo k temos que:
2
18
Aa
E ( x k +1 )
E (xk )
A+a
A
(tambm conhecido
a
A
2
(A a)
1
r 1
Aa
a
a
=
A
r + 1
1(
A+a
A + a)
+ 1
a
(29)
19
( )
Aa
melhor que
.
A+ a
Mais uma vez, deseja-se minimizar uma funo f , que pode ser aproximada
localmente por uma funo quadrtica, funo esta que pode ser minimizada de maneira
exata. Assim, pode-se aproximar f pela srie de Taylor truncada aps a primeira derivada
na vizinhana de x k :
f ( x ) f ( x k ) + f ( x k )( x x k )
(30)
(31)
(32)
Este mtodo bem definido perto da soluo x * devido ao fato de f ter segundas
( )
derivadas parciais contnuas e de que matriz Hessiana F x * positiva definida num ponto
20
de mnimo local. Quando iniciado prximo suficiente da soluo, o Mtodo de Newton tem
ordem de convergncia 2 como mostra o Teorema 3:
Teorema 3: Seja f C 3 em E n , e assumimos que no ponto de mnimo local x * a matriz
( )
(33)
Nota-se que perto da soluo, chega-se ao Mtodo de Newton em sua forma pura
com k 1 . Esta modificao no to boa, pois corre-se o risco de que a funo objetivo
se afaste do mnimo para k = 1 devido aos termos no-quadrticos de f .
A segunda modificao deve ser analisada, para isso parte-se da expresso geral dos
algoritmos:
x k +1 = x k M k g k
(34)
M k = I Inclinao Mxima
possvel perceber claramente que se
M k = [F ( x k )]1 Newton
21
(Mtodo de Newton) tem convergncia mais rpida perto da soluo mas para um ponto em
geral distante da soluo o mtodo pode no gerar uma direo de descida uma vez que
f ( x k +1 ) = f ( x k ) + f ( x k )(x k +1 x k ) + x k +1 x k
),
substituindo
pela
( )
f ( x k +1 ) = f ( x k ) g kt M k g k + 2
(35)
minimizar f ( x ) =
1 t
x Qx b t x
2
22
(36)
g kt d k
k = t
d k Qd k
(37)
g k = Qx k b
(38)
com
e ainda
g kt d k
O termo k = t
a grande diferena desta classe de mtodos. Este termo foi
d k Qd k
encontrado a partir do seguinte raciocnio: os vetores no-nulos d 0 , d1 ,..., d n 1 formam uma
base e a partir da a soluo x * pode ser escrita como uma combinao linear dos elementos
dessa base, ou seja, x * = 0 d 0 + ... + n 1 d n 1 , para algum conjunto de i , i = 0 ,..., n 1 .
Agora, fazendo o produto com Q e tomando o produto escalar com respeito d i , tem-se:
i =
d it Qx *
d it b
,
=
d it Qd i d it Qd i
i = 0,..., n 1 .
(39)
23
k =
g kt d k
d kt Qd k
(40)
x k +1 = x k + k d k
(41)
g k +1 = Qx k +1 b
(42)
g kt +1Qd k
k = t
d k Qd k
(43)
d k +1 = g k +1 + k d k
(44)
24
Trs grandes vantagens devem ser destacadas neste mtodo. Primeiro, o gradiente
sempre no-nulo e linearmente independente de todos os vetores direo obtidos
anteriormente; segundo, o mtodo de fcil implementao; e por ltimo, como o mtodo
baseado na direo do gradiente ele tem um bom progresso uniforme at a soluo em cada
passo, o que muito importante para estudar a generalizao para os problemas noquadrticos.
Agora, o Mtodo dos Gradientes Conjugados ser extendido para problemas noquadrticos, para isso so realizadas as seguintes aproximaes em x k : g k substitudo
por f ( x k ) e a matriz Q por F ( x k ) .
t
O Mtodo dos Gradientes Conjugados, quando utilizado em problemas noquadrticos, geralmente no ir terminar em n passos como no caso quadrtico. A sada
para essa questo buscar novas direes de acordo com o algoritmo abaixo e somente
terminar a busca aps um critrio de parada ser atingido, esse procedimento conhecido
como restart. Assim, o Mtodo Geral dos Gradientes Conjugados definido da seguinte
maneira:
Passo 1.
Passo 2.
Para k = 0,1,..., n 1 :
a) Defina x k +1 = x k + k d k , onde k =
g kt d k
.
d kt F ( x k )d k
b) Calcule g k +1 = f ( x k +1 ) .
t
g kt +1 F ( x k )d k
d kt F ( x k )d k
25
e repita (a).
Neste mtodo a busca em linha est embutida no prprio mtodo, pois a cada passo,
Mtodo Fletcher-Reeves
Ao invs de substituir Q por F ( xk ) existe a opo de usar um dos mtodos de
busca em linha descritos na Seo 5.1. Diferentemente dos mtodos de direes conjugadas
anteriores, k ser ento determinado de modo que minimize a funo objetivo enquanto
k ser determinado por uma nova frmula. O Mtodo Fletcher-Reeves pode realizar estas
mudanas:
Passo 1.
Passo 2.
Para k = 0,1,..., n 1 :
26
g kt +1 g k +1
g kt g k
e repita (a).
Nota-se claramente que as nicas alteraes se encontram nos itens (a) e (c) como
explicado anteriormente.
Mtodo Polak-Ribiere
k =
(g k +1 g k )t g k +1
g kt g k
(44)
27
(45)
S k = H 1 Mtodo de Newton.
S k = I Mtodo da Inclinao Mxima.
S k H 1 Mtodo Quasi-Newton.
Para garantir que a Equao 43 seja um mtodo de descida necessrio que S k seja
positiva definida para valores pequenos de k .
Analisando mais uma vez o caso quadrtico:
f (x ) =
1 t
x Qx b t x
2
(46)
28
(47)
g k = Qx k b
k =
(48)
g kt S k g k
g kt S k QS k g k
(49)
(50)
A eficincia deste mtodo est relacionada com a variao nos valores da matriz
Hessiana calculada no ponto x k +1 e no ponto x0 . Quanto menor essa variao melhor o
mtodo.
29
Mtodo Davidon-Fletcher-Powell
Este mtodo foi originalmente desenvolvido por Davidon para encontrar uma
aproximao para a inversa da matriz Hessiana e depois melhorado por Fletcher e Powell.
Alm de construir a aproximao da inversa da matriz Hessiana esse mtodo gera as
direes do gradiente conjugado. O algoritmo do mtodo ser visto a seguir:
Passo 1.
Faa d k = H k g k .
Passo 2.
g k +1 = f ( x k +1 ) .
t
Passo 3.
Faa q k = g k +1 g k e
H k +1 = H k +
p k p kt H k q k q kt H k
t
p kt q k
qk H k qk
(51)
30
6 Mtodos Restritos
O enfoque agora estudar os problemas do tipo:
Minimizar
f (x )
Sujeito a
hi (x ) = 0 , g j ( x ) 0
(52)
x En
onde
( )
f sujeito s restries h( x ) = 0 .
Assumimos ainda que x * seja um ponto regular desse conjunto de restries. Ento existe
um E m tal que:
( )
( )
f x * + t h x * = 0
(53)
31
l ( x , ) = f ( x ) + t h ( x )
(54)
x l ( x, ) = 0
(55)
l ( x, ) = 0
(56)
Assumimos ainda que x * seja um ponto regular desse conjunto de restries. Ento existe
um E m tal que:
( )
( )
f x * + t h x * = 0
(57)
L(x * ) = F (x * ) + t H (x * )
(58)
E m tal que
( )
( )
f x * + t h x * = 0
( )
( )
(59)
( )
( )
( )
problema (52) e suponhamos que x * seja um ponto regular das restries. Ento existe um
vetor E m e um vetor E p com 0 tais que
33
( )
( )
( )
f x * + t h x * + t g x * = 0
(60)
t g (x * ) = 0
(61)
(62)
(63)
t g (x * ) = 0
(64)
34
( )
( )
( )
f x * + t h x * + t g x * = 0
(65)
L(x * ) = F (x * ) + t H (x * ) + t G (x * )
(66)
e a matriz Hessiana
onde
( )
J = j : g j x * = 0, j .
35
7 Implementaes
Alm do estudo terico tambm foi abordada a implementao dos mtodos
estudados para se perceber na prtica as caractersticas de cada mtodo, as vantagens, as
desvantagens, a facilidade ou dificuldade de implementao. A linguagem de programao
utilizada foi o C/C++ e os seguintes programas foram implementados com sucesso:
Fibonacci
Golden Section
Newton
Falsa Posio
Ajuste Cbico
Ajuste Quadrtico
Critrio de Armijo
Polak-Ribiere
Fletcher-Reeves
36
70
60
50
40
30
20
10
0
-6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12
Percebe-se tanto pelo grfico quanto analiticamente que a funo tem seu valor
mnimo na abscissa x * = 3 . Na Tabela 1 observa-se como cada um dos mtodos se
comportou quando executados:
37
Mtodo
Soluo Encontrada
Nmero de Iteraes
Fibonacci
2.999726
20
Razo urea
2.999801
20
Newton
Falsa Posio
Ajuste Cbico
No convergiu
38
Tabela 2 Resultados obtidos com os mtodos de busca para vrias variveis no caso quadrtico
Mtodo
Soluo Encontrada x * , y *
Nmero de Iteraes
Inclinao Mxima
(1,0.331923)
16
Gradientes Conjugados
(1,0.333334)
Polak-Ribiere
(1,0.333318)
18
Flecther-Reeves
(1,0.333318)
18
encontrar
ponto
de
mnimo
da
funo:
39
Tabela 3 Resultados obtidos com os mtodos de busca de vrias variveis no caso no-quadrtico
Mtodo
Soluo Encontrada (x * , y * )
Nmero de Iteraes
Inclinao Mxima
(19.996469,2.999756)
210
Gradientes Conjugados
(20.000001,3.000061)
12
Fletcher-Reeves
(19.979500,2.998498)
162
Polak-Ribiere
(19.979500,2.998498)
162
40
8 Simulated Annealing
O Simulated Annealing um mtodo baseado na teoria termodinmica, o qual
simula o processo de recozimento de um slido at que este alcance seu estado mnimo de
energia. Este mtodo ser utilizado como uma ferramenta para a otimizao global e
posteriormente trabalhado conjuntamente com mtodos estudados anteriormente para a
construo de programas hbridos de busca.
Annealing pode ser traduzido neste caso como recozimento, nome dado pela
termodinmica ao processo de aquecimento de um slido at o seu ponto de fuso, seguido
de um resfriamento gradual e vagaroso, at que se alcance novamente o seu enrijecimento.
Nesse processo, a etapa de resfriamento essencial para se manter um equilbrio
trmico do slido, se feito de maneira correta esse resfriamento gradual e vagaroso far
com que os tomos encontrem tempo suficiente para se organizarem em uma estrutura
uniforme com energia mnima. Se o slido resfriado bruscamente, seus tomos formaro
uma estrutura irregular e fraca, com alta energia em conseqncia do esforo interno gasto.
Sob o aspecto computacional e matemtico, esse recozimento pode ser considerado
como um processo estocstico de determinao da estrutura dos tomos de um slido que
apresente energia mnima em seu estado final. Em altas temperaturas, os tomos se movem
livremente e, com grande probabilidade, movem-se para posies que incrementaro a
energia total do sistema. Quando se baixa a temperatura, os tomos gradualmente se
movem em direo uma estrutura regular e, somente com pequena probabilidade,
incrementaro suas energias.
De acordo com Metropolis et al. (1953) nos estudos iniciais desta rea, quando os
tomos se encontram em equilbrio, em uma temperatura T , a probabilidade de que a
energia do sistema seja E , proporcional e
kt
Bolzmann.
Desta forma, a probabilidade de que a energia de um sistema seja ( E + E ) pode ser
expressa por:
prob (E + E ) = prob(E ) prob(E ) = prob(E )e E kT
( 67 )
41
conjunto finito que contm todas as combinaes possveis que representam as solues
viveis para o problema. Seja f uma funo de valores reais definida sobre S , f : S R .
O problema caracterizado em encontrar uma soluo (ou estado) x S , tal que f ( x ) seja
mnimo.
Uma das formas mais simples de tentar resolver o problema, utilizando uma busca
local em S, seria utilizar algum dos mtodos de descida j estudados dentre os quais
destacaram-se o Mtodo de Descida Mxima e o Mtodo dos Gradientes Conjugados.
Porm, como o interesse maior na obteno do timo global, um processo de
busca por uma soluo pode ser iniciado a partir de uma soluo inicial x 0 tomada de
forma aleatria. Uma outra soluo x1 ento gerada, na vizinhana desta atravs de algum
42
mtodo sistemtico. Caso tenhamos uma soluo melhor, para o caso de minimizao,
f (x1 ) < f ( x0 ) , a mesma passa a ser considerada a soluo atual e o processo se repete.
Caso contrrio, a nova soluo rejeitada e uma outra ser buscada. Esse processo se
repete at que no se obtenha uma soluo satisfatria na vizinhana da soluo atual aps
um nmero determinado de iteraes. O algoritmo retorna o valor da ltima soluo
encontrada, considerada uma soluo de mnimo local.
A deficincia do mtodo acima, apesar de ser simples e rpido, que o mnimo
local encontrado pode estar longe de ser um mnimo global, o que seria uma soluo
inaceitvel para o problema. Uma estratgia simples para melhorar a soluo obtida atravs
desse tipo de algoritmo, seria escolher a menor soluo, de um conjunto de solues obtidas
de execues sucessivas, realizadas a partir de diferentes solues iniciais.
O Simulated Annealing, em contraposio, tenta evitar a convergncia para um
mnimo local, aceitando, s vezes, uma nova soluo gerada, mesmo que essa incremente o
valor de f . O aceitar ou o rejeitar de uma nova soluo, que causar um incremento de
g ( , T ) = e T
( 68 )
Caso = f ( x1 ) f (x0 ) for menor que zero, a soluo x1 ser aceita como a nova
soluo. Caso contrrio, a nova soluo somente ser aceita se:
g ( , T ) > random(0,1)
( 69 )
43
quando T alto, a maioria dos movimentos (de um estado para outro ou de uma
soluo para outra) aceita, entretanto, a medida que T se aproxima de zero, a
grande maioria das solues so rejeitadas.
Para evitar uma convergncia precoce para um mnimo local, o algoritmo inicia com
um valor de T relativamente alto. Esse parmetro gradativamente reduzido e, para cada
um dos seus valores, so realizadas vrias tentativas de se alcanar uma melhor soluo nas
vizinhanas da soluo atual (processo dito como restart nos programas anteriores).
Passo 1.
n0
Passo 2.
calcular f (v0 )
Passo 3.
ento v0 v1
seno se random(0 , 1) < e ( f (v1 ) f (v0 )) T
ento v0 v1
volte ao Passo 3 k vezes
Passo 4.
T T
n n +1
volte ao Passo 3 at atingir o critrio de parada
f ( x ) = x sin (10 x ) + 1
( 70 )
45
x0
que
f ( x0 ) f ( x ), para todo x [- 1 , 2] .
Este
exemplo
foi
retirado
de
MICHALEWICZ (1996).
v0 : soluo inicial
46
T: temperatura inicial
parmetros
v0
t
alfa
viz
T
restart
MAX
resultados
max f(x)
temp final
iteraes
avaliaes
1
valor
0
0.0001
0.95
1.0
100
10
10000
valor
2,850184
0,000097
270
965
47
(71)
48
varivel
v0
v1
t
alfa
viz
T
restart
MAX
resultados
maior f(x)
temp final
iteraes
avaliaes
49
f ( x1 , x2 ) = 38,8456 enquanto
que
(11.624089 , 5.725650)
a
melhor
soluo
anteriormente
nos
50
9 Mtodos Hbridos
O desenvolvimento de mtodos hbridos mostra-se necessrio quando nos
deparamos com um problema que envolva uma funo extremamente complicada, ou seja,
repleta de vales, picos e regies planas. Nestes casos os mtodos estudados no incio do
trabalho mostram-se inadequados, pois encontraro uma soluo que ser apenas local no
gerando assim o timo desejado pelo usurio.
A primeira abordagem a escolha de um mtodo que escape desses timos locais e
para isso o mtodo do Simulated Annealing foi estudado, o qual por um lado se mostrou
bastante eficiente, mas por outro demandou um alto custo computacional.
neste ponto que o desenvolvimento de mtodos hbridos se mostra relevante, uma
vez que pode ser possvel aproveitar a caracterstica positiva de fugir de timos locais do
Simulated Annealing e os mtodos de busca local. Cada uma delas ser explicada e
exemplificada a seguir.
51
Estratgia 1
Consiste em realizar uma busca fina (local) aps o trmino do restart do Simulated
Annealing, ou seja, antes do decaimento da temperatura realiza-se uma busca local para
chegar num ponto de melhor qualidade. A visualizao deste procedimento encontra-se
abaixo. O passo 4 representa a modificao introduzida.
Passo 1.
n0
Passo 2.
calcular f (v0 )
Passo 3.
ento v0 v1
seno se random(0 , 1) < e ( f (v1 ) f (v0 )) T
ento v0 v1
volte ao Passo 3 k vezes
Passo 4.
Passo 5.
T T
n n +1
52
Estratgia 2
Passo 1.
n0
Passo 2.
calcular f (v0 )
Passo 3.
ento v0 v1
seno se random(0 , 1) < e ( f (v1 ) f (v0 )) T
ento v0 v1
volte ao Passo 3 k vezes
Passo 4.
T T
n n +1
volte ao Passo 3 at atingir o critrio de parada
Passo 5.
53
Annealing em conjunto com o mtodo de busca local da Inclinao Mxima. Esse mtodo
hbrido aplicado para as estratgias 1 e 2 apresentadas na Seo 9 e os respectivos cdigos
fonte encontram-se nos Anexos G e H.
Para correto funcionamento da unio dos mtodos e para ganhos de eficincia foram
necessrias algumas adaptaes em ambos mtodos. O Simulated Annealing pde ter
alguns de seus parmetros relaxados uma vez que teremos buscas finas ao longo do
processo, este relaxamento diminui o nmero de iteraes e principalmente o nmero de
avaliaes da funo em questo. J no mtodo da Inclinao Mxima, foi necessrio uma
mudana dos parmetros do Critrio de Armijo e do valor inicial da varivel , essa readequao foi necessria devido alta sensibilidade do problema utilizado como exemplo
assim, tem um valor muito prximo de zero assim como as constantes de verificao do
Critrio de Armijo.
Simulated Annealing, criando assim uma busca menos robusta, com menos iteraes e
54
menor esforo computacional que sero recompensados pelas buscas locais utilizadas nos
mtodos hbridos.
varivel
v0
v1
t
alfa
viz
T
restart
MAX
resultados
maior f(x)
temp final
iteraes
avaliaes
Comparaes e Resultados
S.A.
S.A. com IM (1) S.A. com IM (2) S.A. com GC (1) S.A. com GC (2)
valor
valor
valor
valor
valor
0
0
0
0
0
5
5
5
5
5
0.0001
0.01
0.01
0.01
0.01
0,99
0,99
0,99
0,99
0,99
1,2
1,2
1,2
1,2
1,2
10000
10000
10000
10000
10000
10
10
10
10
10
10000
10000
10000
10000
10000
valor
valor
valor
valor
valor
38,850399
38,845600
38,850307
38,849518
38,850494
0,0001
0,00942
0,00942
0,00942
0,00942
1833
917
1000
917
1000
18331
9171
10001
9171
10001
Annealing puro uma vez que os hbridos chegaram a solues melhores dos que as j
encontradas pelo Simulated Annealing com uma reduo significativa do nmero de
iteraes e principalmente do nmero de avaliaes da funo.
A temperatura final foi reduzida em sua preciso em duas casas decimais e mesmo
assim os mtodos hbridos tiveram um bom desempenho conforme esperado.
O mtodo de maior destaque foi o hbrido de Simulated Annealing com Gradientes
55
Conjugados
que
com
utilizao
da
estratgia
com
um
mximo
f ( x1 , x2 ) = 38,850399 .
Os mtodos hbridos com Inclinao Mxima tiveram um desempenho pouco
inferior aos hbridos com Gradientes Conjugados, entretanto tiveram desempenho muito
superior ao Simulated Annealing.
56
O problema de tomografia por impedncia eltrica pode ser descrito pelo seguinte
problema de otimizao (ROLNIK E SELEGHIM, 2006):
Min e ( 0 , 1 ,..., n ) ,
s.a.
min i ( x, y ) max
=
=
(72)
i = 1..n ,
(73)
(74)
(75)
57
al., 2003 e processo Fapesp no 03/12537-7), foi fornecido seu programa computacional que
realiza o clculo do erro (Eq. 72). Os dados utilizados em sua implementao so:
58
A i j-1 + B i 1 j + C ij + D i +1 j + E ij+1 = 0
(76)
com
1
A = .( L1 + L 2 )
2
(76.a)
1
B = .( L1 + L 4 )
2
(76.b)
1
C = 1.( L1 + L 6 ) + .( L 2 + L 3 + L 4 + L 5 )
2
(76.c)
1
D = .( L3 + L 6 )
2
(10.d)
1
E = .( L 5 + L 6 )
2
(76.e)
Contraste
80
1
1
15
22
29
36
43
50
57
64
71
78
85
92
Elementos discretos
70
60
50
40
30
20
10
0
1
6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96 101 106 111 116 121 126 131 136 141 146 151 156 161
Elementos discretos
60
df
f (x + ) f (x )
=
dx
2
(77)
61
11 Concluso
As hipteses e metas determinadas no incio do projeto foram constatadas e
cumpridas uma vez que os mtodos hbridos foram desenvolvidos e com isso atingir o
objetivo de se obter um processo de otimizao consistente e eficiente.
Dentre os mtodos implementados, o mtodo hbrido que une o Simulated
62
12 Referncias Bibliogrficas
CERNY. Thermodynamical approach to the traveling salesman problem: An efficient
simulation algorithm. Journal of Optimization Theory and Applications. vol 45, No. 1,
pp. 41-51.
DAVIDON, W.C. Variance Algorithm for Minimization Computer J. 10, 1968, pages
406-410.
FLETCHER, R., POWELL, M.J.D., A Rapidly Convergent
Society of Mechanical Sciences and Engineering, Vol. XXVIII, n. 4, pp. 378 390.
63
64
main(){
float x,y;
float g0, g1, g,fmin;
int n=0,nmax=30;
float e=0.01;
float d0=1, d=1;
float alpha=0.1;
float phi0, philinha0, phia, large, penultimo;
int teste;
printf("::::::::::: Metodo de Descida ::::::::::::::::::\n\n\n");
printf("Entre com o valor inicial da primeira variavel:\nx=");
scanf("%f",&x);
printf("Entre com o valor inicial da segunda variavel:\ny=");
scanf("%f",&y);
g0=derivadax0(x,y);
g1=derivadax1(x,y);
while((d0>e || d>e) && n<nmax ){
65
printf("\nDerivada em x %f\n",g0);
printf("Derivada em y %f\n",g1);
alpha=penultimo;
} // FIM SE
if(teste==1){
while(large<0){
alpha=alpha/2;
phi0=phi(x,y,0,g0,g1);
philinha0=g0*g0+g1*g1;
phia= phi(x,y,alpha,g0,g1);
large= phi0 + 0.2*philinha0*alpha - phia;}
}//:::::::::::::::: fim do ARMIJO :::::::::::::::::::::::::
x= x - alpha*g0;
y= y - alpha*g1;
g0=derivadax0(x,y);
d0=g0;
g1=derivadax1(x,y);
d=g1;
if(d0<0)
66
d0=d0*(-1);
if(d<0)
d=d*(-1);
n=n+1;
printf("\n\n\ninteracao numero: %d",n);
printf("\nalpha:%f",alpha);
printf("\nx=%f\ny=%f\n",x,y);
fmin=funcao(x,y);
printf("Valor de F=%f",fmin); } // fim do while
printf("\n\n::::::::::::::::::::::::RESULTADO::::::::::::::::::::::::::");
if(n==300){
printf("\n\nx,y MINIMO :\nx=%f\ny=%f\n",x,y);
printf("Interacoes necessarias=%d(maximo possivel)\n\n", n);}
if (n<300){
printf("\n\nx,y MINIMO :\nx=%f\ny=%f\n",x,y);
printf("Interacoes necessarias=%d\n\n ", n);}
system("PAUSE");}
67
68
69
// Calculo de gt*Q
for(i=0;i<1;i++){
for(j=0;j<=1;j++){
numaux_beta[i][j] = 0;
for(k=0;k<=1;k++){
numaux_beta[i][j]=gt[i][k]*Q[k][j] + numaux_beta[i][j];}}}
// Calculo de [gt*Q]*d
70
for(i=0;i<1;i++){
for(j=0;j<1;j++){
num_beta = 0;
for(k=0;k<=1;k++){
num_beta = numaux_beta[i][k]*d[k][j] + num_beta;}}}
den_beta = den_alpha;
beta = num_beta/den_beta;
//:::::::::::::: FIM BETA ::::::::::::::::::::::::::::::
//:::::::::::::: CALCULA NOVO D ::::::::::::::::::::::::::::::
for(i=0;i<=1;i++){
for(j=0;j<1;j++){
d[i][j]= -1*g[i][j]+ beta*d[i][j];}}
// ::::::::::::::::::: FIM D ::::::::::::::::::::::::::::::::::::::::::
n=n+1;}
printf("\nx=%f\ny=%f\n\n",x[0][0],x[1][0]);
if(xdif[0][0]<e && xdif[1][0]<e)
teste=1;
restart=restart+1;}
printf("\n\nValores minimos\nx=%f\ny=%f\n\n",x[0][0],x[1][0]);
system("PAUSE");
}
71
printf(":::::::::::
printf(":::::::::::
printf(":::::::::::
72
}
while(teste_restart==0 && restart<restart_max){
printf("\nRESTART:%d",restart);
derivada[0][0]= derivadax0(x[0][0], x[1][0]);
derivada[0][1]= derivadax1(x[0][0], x[1][0]);
for(i=0;i<1;i++){ // Transposto da Derivada
for(j=0;j<=1;j++){
g[j][i]=derivada[i][j];}}
d[0][0]= -1*g[0][0];
d[1][0]= -1*g[1][0];
n=0;
while(n<nmax ){
printf("\ninteracao:%d",n);
alpha=penultimo;
} // FIM SE
if(teste==1){
while(large<0){
73
alpha=alpha/2;
phi0=phi(x[0][0],x[1][0],0,g[0][0],g[1][0]);
philinha0=g[0][0]*g[0][0]+g[1][0]*g[1][0];
phia= phi(x[0][0],x[1][0],alpha,g[0][0],g[1][0]);
large= phi0 + 0.2*philinha0*alpha - phia;}
}
//:::::::::::::: FIM ALPHA ::::::::::::::
// ::::::::::::::::::: CALCULO DO X ::::::::::::::::::::::::::::::::::::::
for(i=0;i<=1;i++){
for(j=0;j<1;j++){
xaux[i][j] = x[i][j] ;}}
for(i=0;i<=1;i++){
for(j=0;j<1;j++){
x[i][j] = x[i][j] + alpha*d[i][j];}}
for(i=0;i<=1;i++){
for(j=0;j<1;j++){
xdif[i][j] = x[i][j] - xaux[i][j] ;
if(xdif[i][j]<0)
xdif[i][j]=xdif[i][j]*-1;
}}
74
// Calculo de gt*g
for(i=0;i<1;i++){
for(j=0;j<1;j++){
num_beta = 0;
for(k=0;k<=1;k++){
num_beta = gt[i][k]*g[k][j] + num_beta;}}}
// calc denominador Beta
for(i=0;i<1;i++){
for(j=0;j<1;j++){
den_beta = 0;
for(k=0;k<=1;k++){
den_beta = gauxt[i][k]*gaux[k][j] + den_beta;}}}
beta = num_beta/den_beta;
//:::::::::::::: FIM BETA ::::::::::::::::::::::::::::::
//:::::::::::::: CALCULA NOVO D ::::::::::::::::::::::::::::::
for(i=0;i<=1;i++){
for(j=0;j<1;j++){
d[i][j]= -1*g[i][j]+ beta*d[i][j];}}
// ::::::::::::::::::: FIM D ::::::::::::::::::::::::::::::::::::::::::
n=n+1;}
printf("\nx=%f\ny=%f\n\n",x[0][0],x[1][0]);
if(xdif[0][0]<e && xdif[1][0]<e)
teste_restart=1;
restart=restart+1;}
printf("\n\nValores minimos\nx=%f\ny=%f\n\n",x[0][0],x[1][0]);
system("PAUSE");
}
75
76
77
//printf("\nT=%f",T);
i=i+1;}
printf("\n\n:::::::::::::::::::::::\n\nx=%f",v0);
printf("\nf(x)=%f",y0);
printf("\n\nT=%f",T);
printf("\nem %d iteracoes\n",i);
printf("\n\nnum aval=%d\n\n",aval);
fclose(saida);
system("PAUSE");}
78
79
//_____________________ SA ____________________________________________________
saida=fopen("SAmaisVAR.dat","w");
iniciaRand();
//v0=randFloat(a,b);
v0[0]=0; // ENTRADA DAS VARIAVEIS INICIAIS
v0[1]=5;
//v0[2]=0;
//...
FIM DA ENTRADA DAS VARIAVEIS INICIAIS
for(k=0;k<N;k++){
while(v1[k]<a[k]||v1[k]>b[k]){
v1[k]=randFloat(n0[k],n1[k]);}
}
80
y1=f(v1,N);
aval=aval+1;
if(y0<y1){
for(k=0;k<N;k++){
v0[k]=v1[k];}
y0=y1;
if(y0>y){
it=aval;
y=y0;
for(k=0;k<N;k++){
v[k]=v0[k];}
}
fprintf(saida,"\n%f",y0);
}
else{
p=randFloat(0,1);
//printf("\np=%f",p);
e=expon(y1,y0,T);
//printf("\ne=%f",e);
if(p<e){
for(k=0;k<N;k++){
v0[k]=v1[k];}
y0=y1;
fprintf(saida,"\n%f",y0);
} // fim if
} // fim do else
}//fim do j
T=alfa*T;
//printf("\nT=%f",T);
i=i+1;}
for(k=0;k<N;k++){
printf("\nx[%d]=%f",k,v0[k]);}
printf("\nf(x)=%f",y0);
printf("\n\nT=%f",T);
printf("\nem %d iteracoes",i);
printf("\nem %d avaliacoes\n\n\n",aval);
printf(":::: BEST EVER ::::::::::\n\n");
for(k=0;k<N;k++){
printf("\nv[%d]=%f",k,v[k]);}
printf("\nf(x*)=%f",y);
printf("\nna %d avaliacao\n\n\n",it);
fclose(saida);
system("PAUSE");}
81
82
/******************************************************************************/
//Gradientes conjugados
void im(void){
int N=2,i;
float x[N], v[N];
float fmin;
float g[N], d[N], gaux[N];
int n=0,nmax=3;
float e=0.01;
float alpha=0.000001;
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//printf("::::::::::: Metodo de Descida ::::::::::::::::::\n\n\n");
for(i=0;i<N;i++){
d[i]=100;}
for(i=0;i<N;i++){
x[i]=v0[i];
}
for(i=0;i<N;i++){
//printf("\nx[%d]:%f",i,x[i]);
}
derivef(x,N);
83
for(i=0;i<N;i++){
g[i]=derivada[i];
gaux[i]=g[i];
if(gaux[i]<0)
gaux[i]=gaux[i]*-1;
if(gaux[i]<e)
parada=parada+1;
}
philinha0=0;
for(i=0;i<N;i++){
philinha0 = g[i]*g[i]+ philinha0;}
//printf("\nphilinha=%f\n",philinha0);
for(i=0;i<N;i++){
v[i]=x[i]-alpha*g[i];}
phia=f(v,N);
//printf("\nphia=%f\n",phia);
large= phi0 + 0.000001*philinha0*alpha - phia;
if (large>=0)
teste=0;
else
teste=1;
if (teste==0){
while(large>=0){ // INICIO WHILE
penultimo=alpha;
alpha=alpha*2;
//printf("\nerro");
for(i=0;i<N;i++){
v[i]=x[i]-alpha*g[i];}
phia=f(v,N);
large= phi0 + 0.000001*philinha0*alpha - phia;} // FIM WHILE
alpha=penultimo;
} // FIM SE
84
if(teste==1){
while(large<0){
alpha=alpha/2;
for(i=0;i<N;i++){
v[i]=x[i]-alpha*g[i];}
phia=f(v,N);
large= phi0 + 0.000001*philinha0*alpha - phia;}
}
// :::::: fim do ARMIJO :::::::::::::::::::::::::
for(i=0;i<N;i++){
x[i] = x[i] - alpha*g[i];
v0[i]=x[i];
}
parada=0;
derivef(x,N);
for(i=0;i<N;i++){
g[i]=derivada[i];
d[i]=g[i];
if(d[i]<e && d[i]>-e)
parada=parada+1;
}
n=n+1;
//printf("\n\n\niteracao numero: %d",n);
//printf("\nalpha:%f",alpha);
for(i=0;i<N;i++){
//printf("\nx[%d]=%f",i,x[i]);
}
for(i=0;i<N;i++){
//printf("\ng[%d]:%f",i,g[i]);
}
fmin=f(x,N);
//printf("\nValor de F=%f",fmin);
} // fim do while
//printf("\n\n::::::::::::::::::::::::RESULTADO::::::::::::::::::::::::::");
if(n==nmax){
//printf("\n\nIteracoes necessarias=%d(maximo possivel)\n\n", n);
}
if (n<nmax){
//printf("\n\nIteracoes necessarias=%d\n\n ", n);
}
85
//_____________________ SA ____________________________________________________
printf("Inicio SA\n\n");
//system("pause");
saida=fopen("SAmaisVAR.dat","w");
iniciaRand();
//v0=randFloat(a,b);
v0[0]=0; // ENTRADA DAS VARIAVEIS INICIAIS
v0[1]=5;
//v0[2]=0;
//...
FIM DA ENTRADA DAS VARIAVEIS INICIAIS
86
//
printf("%f ",v0[j]);
}
// printf("\n");
//system("pause");
j=0;
while(j<restart){
// printf("j = %d\n",j);
j=j+1;
for(k=0;k<N;k++){
n0[k]=v0[k]-viz;
n1[k]=v0[k]+viz;}
for(k=0;k<N;k++){ // Iiniciacao das V1
v1[k]=-10;}
for(k=0;k<N;k++){
while(v1[k]<a[k]||v1[k]>b[k]){
v1[k]=randFloat(n0[k],n1[k]);}
}
//
printf("avaliacao da f\n");
y1=f(v1,N);
// printf("f = %f\n",y1);
aval=aval+1;
// printf("numero de avaliacoes\n");
if(y0>y1){
for(k=0;k<N;k++){
v0[k]=v1[k];
}
y0=y1;
//
//
fprintf(saida,"\n%f",y0);
}
else{
p=randFloat(0,1);
//printf("\np=%f",p);
e=expon(y1,y0,T);
//printf("\ne=%f",e);
if(p<e){
for(k=0;k<N;k++){
v0[k]=v1[k];}
y0=y1;
fprintf(saida,"\n%f",y0);
} // fim if
} // fim do else
}//fim do j
printf("Solucao final para o Simulated Annealing\n");
for(j=0;j<N;j++){
printf("\nantes do gc\nv[%d]=%f f=%f",j,v0[j],y0);
87
}
//
printf("\n");
//system("pause");
// chamar Gradientes Conjugados
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
im();
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
//printf("\nsaiu do GC\n");
y0=f(v0,N);
for(j=0;j<N;j++){
printf("\ndepois do gc\nv0[%d]=%f f=%f",j,v0[j],y0);
}
for(k=0;k<N;k++){
if(v0[k]<a[k]){
//
printf("o gc encontrou um ponto fora do dominio\n\n\n\n");
v0[k]=a[k];
}
if(v0[k]>b[k]){
//
printf("o gc encontrou um ponto fora do dominio\n\n\n\n");
v0[k]=b[k];
}
}
y0=f(v0,N);
if(y0<y){
it=aval;
y=y0;
for(k=0;k<N;k++){
v[k]=v0[k];}
}
T=alfa*T;
//printf("\nT=%f",T);
i=i+1;}
88
89
/******************************************************************************/
//Gradientes conjugados
void im(void){
int N=2,i;
float x[N], v[N];
float fmin;
float g[N], d[N], gaux[N];
int n=0,nmax=3;
float e=0.01;
float alpha=0.000001;
for(i=0;i<N;i++){
d[i]=100;}
for(i=0;i<N;i++){
x[i]=v0[i];
}
for(i=0;i<N;i++){
//printf("\nx[%d]:%f",i,x[i]);
}
derivef(x,N);
for(i=0;i<N;i++){
g[i]=derivada[i];
gaux[i]=g[i];
90
if(gaux[i]<0)
gaux[i]=gaux[i]*-1;
if(gaux[i]<e)
parada=parada+1;
}
philinha0=0;
for(i=0;i<N;i++){
philinha0 = g[i]*g[i]+ philinha0;}
//printf("\nphilinha=%f\n",philinha0);
for(i=0;i<N;i++){
v[i]=x[i]-alpha*g[i];}
phia=f(v,N);
//printf("\nphia=%f\n",phia);
large= phi0 + 0.000001*philinha0*alpha - phia;
if (large>=0)
teste=0;
else
teste=1;
if (teste==0){
while(large>=0){ // INICIO WHILE
penultimo=alpha;
alpha=alpha*2;
//printf("\nerro");
for(i=0;i<N;i++){
v[i]=x[i]-alpha*g[i];}
phia=f(v,N);
large= phi0 + 0.000001*philinha0*alpha - phia;} // FIM WHILE
alpha=penultimo;
} // FIM SE
if(teste==1){
while(large<0){
91
alpha=alpha/2;
for(i=0;i<N;i++){
v[i]=x[i]-alpha*g[i];}
phia=f(v,N);
large= phi0 + 0.000001*philinha0*alpha - phia;}
}
92
//_____________________ SA ____________________________________________________
printf("Inicio SA\n\n");
//system("pause");
saida=fopen("SAmaisVAR.dat","w");
iniciaRand();
//v0=randFloat(a,b);
v0[0]=0; // ENTRADA DAS VARIAVEIS INICIAIS
v0[1]=5;
//v0[2]=0;
//...
FIM DA ENTRADA DAS VARIAVEIS INICIAIS
93
for(k=0;k<N;k++){
while(v1[k]<a[k]||v1[k]>b[k]){
v1[k]=randFloat(n0[k],n1[k]);}
}
//
printf("avaliacao da f\n");
y1=f(v1,N);
// printf("f = %f\n",y1);
aval=aval+1;
// printf("numero de avaliacoes\n");
if(y0>y1){
for(k=0;k<N;k++){
v0[k]=v1[k];
}
y0=y1;
if(y0<y){
it=aval;
y=y0;
for(k=0;k<N;k++){
v[k]=v0[k];}
}
//
fprintf(saida,"\n%f",y0);
}
else{
p=randFloat(0,1);
//printf("\np=%f",p);
e=expon(y1,y0,T);
//printf("\ne=%f",e);
if(p<e){
for(k=0;k<N;k++){
v0[k]=v1[k];}
y0=y1;
fprintf(saida,"\n%f",y0);
94
} // fim if
} // fim do else
}//fim do j
T=alfa*T;
//printf("\nT=%f",T);
i=i+1;}
im();
for(k=0;k<N;k++){
if(v0[k]<a[k]){
printf("o gc encontrou um ponto fora do dominio\n\n\n\n");
v0[k]=a[k];
}
if(v0[k]>b[k]){
printf("o gc encontrou um ponto fora do dominio\n\n\n\n");
v0[k]=b[k];
}
}
printf("\n\n:::: BEST EVER no HIBRIDO::::::::::\n\n");
for(k=0;k<N;k++){
printf("\nv[%d]=%f",k,v0[k]);}
y=f(v0,N);
printf("\nf(x*)=%f\n\n",-y);
fclose(saida);
system("PAUSE");}
95
96
/******************************************************************************/
//Gradientes conjugados
void gc(void){
float x[2][1],xaux[2][1], xdif[2][1],vet[2];
float Q[2][2];
float g[2][1], derivada[1][2], d[2][1];
float gt[1][2], dt[1][2],ffinal;
double num_alpha, den_alpha, alpha, num_beta, den_beta, beta, e=0.01;
double denaux_alpha[1][2], numaux_beta[1][2];
int n=0,nmax=2,i,j,k, teste=0, restart=0,iter=1,itermax=3;
//printf("\nentrou no GC\n");
//printf("::::::::::: x^2 - 5xy + y^4 - 25x - 8y
::::::::::::::::::\n\n\n");
while(teste==0){
// printf("\n NUMERO DE ITERAES:%d",iter);
// printf("\nRESTART:%d",restart);
97
98
// Calculo alpha
alpha = -1*(num_alpha/den_alpha);
// printf("\n\nalpha=%f",alpha);
//:::::::::::::: FIM ALPHA ::::::::::::::
// ::::::::::::::::::: CALCULO DO X ::::::::::::::::::::::::::::::::::::::
for(i=0;i<=1;i++){
for(j=0;j<1;j++){
xaux[i][j] = x[i][j] ;}}
for(i=0;i<=1;i++){
for(j=0;j<1;j++){
x[i][j] = x[i][j] + alpha*d[i][j];}}
for(i=0;i<=1;i++){
for(j=0;j<1;j++){
xdif[i][j] = x[i][j] - xaux[i][j] ;
if(xdif[i][j]<0)
xdif[i][j]=xdif[i][j]*-1;
}}
// Calculo de gt*Q
for(i=0;i<1;i++){
for(j=0;j<=1;j++){
numaux_beta[i][j] = 0;
for(k=0;k<=1;k++){
numaux_beta[i][j]=gt[i][k]*Q[k][j] + numaux_beta[i][j];}}}
99
// Calculo de [gt*Q]*d
for(i=0;i<1;i++){
for(j=0;j<1;j++){
num_beta = 0;
for(k=0;k<=1;k++){
num_beta = numaux_beta[i][k]*d[k][j] + num_beta;}}}
den_beta = den_alpha;
beta = num_beta/den_beta;
//:::::::::::::: FIM BETA ::::::::::::::::::::::::::::::
//:::::::::::::: CALCULA NOVO D ::::::::::::::::::::::::::::::
for(i=0;i<=1;i++){
for(j=0;j<1;j++){
d[i][j]= -1*g[i][j]+ beta*d[i][j];}}
// ::::::::::::::::::: FIM D ::::::::::::::::::::::::::::::::::::::::::
n=n+1;}
// printf("\nx=%f\ny=%f\n\n",x[0][0],x[1][0]);
if((xdif[0][0]<e && xdif[1][0]<e)||(iter>itermax))
teste=1;
restart=restart+1;
iter=iter+1;
}
100
//Programa Principal
main(){
int N =2;
int i=0, MAX=1000, j=0, restart=10, k=0;
float v1[N], v[N], y0, y1, y, p, e, n0[N], n1[N]; // n sao auxiliares para viz
float a[N], b[N];
float T=100, temp; /* altere aqui a temperatua inicial */
float viz=1.2; /* raio da vizinhanca */
float alfa=0.99; // taxa de reducao da temperatura
float t=0.01; //precisao da temperatura
int aval=0, it=0;
//_____________________ SA ____________________________________________________
printf("Inicio SA\n\n");
//system("pause");
saida=fopen("SAmaisVAR.dat","w");
iniciaRand();
//v0=randFloat(a,b);
v0[0]=0; // ENTRADA DAS VARIAVEIS INICIAIS
v0[1]=5;
//v0[2]=0;
//...
FIM DA ENTRADA DAS VARIAVEIS INICIAIS
101
//system("pause");
j=0;
while(j<restart){
// printf("j = %d\n",j);
j=j+1;
for(k=0;k<N;k++){
n0[k]=v0[k]-viz;
n1[k]=v0[k]+viz;}
for(k=0;k<N;k++){ // Iiniciacao das V1
v1[k]=-10;}
for(k=0;k<N;k++){
while(v1[k]<a[k]||v1[k]>b[k]){
v1[k]=randFloat(n0[k],n1[k]);}
}
//
printf("avaliacao da f\n");
y1=f(v1,N);
// printf("f = %f\n",y1);
aval=aval+1;
// printf("numero de avaliacoes\n");
if(y0>y1){
for(k=0;k<N;k++){
v0[k]=v1[k];
}
y0=y1;
//
fprintf(saida,"\n%f",y0);
}
else{
p=randFloat(0,1);
//printf("\np=%f",p);
e=expon(y1,y0,T);
//printf("\ne=%f",e);
if(p<e){
for(k=0;k<N;k++){
v0[k]=v1[k];}
y0=y1;
fprintf(saida,"\n%f",y0);
} // fim if
} // fim do else
}//fim do j
printf("Solucao final para o Simulated Annealing\n");
for(j=0;j<N;j++){
printf("\nantes do gc\nv[%d]=%f",j,v0[j]);
}
// printf("\n");
//system("pause");
//
102
gc();
//printf("\nsaiu do GC\n");
for(j=0;j<N;j++){
printf("\ndepois do gc\nv0[%d]=%f",j,v0[j]);
}
for(k=0;k<N;k++){
if(v0[k]<a[k]){
//
printf("o gc encontrou um ponto fora do dominio\n\n\n\n");
v0[k]=a[k];
}
if(v0[k]>b[k]){
//
printf("o gc encontrou um ponto fora do dominio\n\n\n\n");
v0[k]=b[k];
}
}
y0=f(v0,N);
if(y0<y){
it=aval;
y=y0;
for(k=0;k<N;k++){
v[k]=v0[k];}
}
T=alfa*T;
//printf("\nT=%f",T);
i=i+1;}
fclose(saida);
system("PAUSE");}
103
104
/******************************************************************************/
//Gradientes conjugados
void gc(void){
float x[2][1],xaux[2][1], xdif[2][1],vet[2];
float Q[2][2];
float g[2][1], derivada[1][2], d[2][1];
float gt[1][2], dt[1][2],ffinal;
double num_alpha, den_alpha, alpha, num_beta, den_beta, beta, e=0.001;
double denaux_alpha[1][2], numaux_beta[1][2];
int n=0,nmax=2,i,j,k, teste=0, restart=0,iter=1,itermax=100;
while(teste==0){
// printf("\n NUMERO DE ITERAES:%d",iter);
// printf("\nRESTART:%d",restart);
derivada[0][0]= derivadax0(x[0][0], x[1][0]);
derivada[0][1]= derivadax1(x[0][0], x[1][0]);
for(i=0;i<1;i++){ // Transposto da Derivada
for(j=0;j<=1;j++){
g[j][i]=derivada[i][j];}}
d[0][0]= -1*g[0][0];
d[1][0]= -1*g[1][0];
n=0;
while(n<nmax ){
//
printf("\ninteracao:%d",n);
105
106
// Calculo de gt*Q
for(i=0;i<1;i++){
for(j=0;j<=1;j++){
numaux_beta[i][j] = 0;
for(k=0;k<=1;k++){
numaux_beta[i][j]=gt[i][k]*Q[k][j] + numaux_beta[i][j];}}}
// Calculo de [gt*Q]*d
for(i=0;i<1;i++){
for(j=0;j<1;j++){
num_beta = 0;
for(k=0;k<=1;k++){
num_beta = numaux_beta[i][k]*d[k][j] + num_beta;}}}
den_beta = den_alpha;
beta = num_beta/den_beta;
//:::::::::::::: FIM BETA ::::::::::::::::::::::::::::::
//:::::::::::::: CALCULA NOVO D ::::::::::::::::::::::::::::::
for(i=0;i<=1;i++){
107
for(j=0;j<1;j++){
d[i][j]= -1*g[i][j]+ beta*d[i][j];}}
// ::::::::::::::::::: FIM D ::::::::::::::::::::::::::::::::::::::::::
n=n+1;}
// printf("\nx=%f\ny=%f\n\n",x[0][0],x[1][0]);
if((xdif[0][0]<e && xdif[1][0]<e)||(iter>itermax))
teste=1;
restart=restart+1;
iter=iter+1;}
//_____________________ SA ____________________________________________________
108
printf("Inicio SA\n");
//system("pause");
saida=fopen("SAmaisVAR.dat","w");
iniciaRand();
//v0=randFloat(a,b);
v0[0]=0; // ENTRADA DAS VARIAVEIS INICIAIS
v0[1]=5;
//v0[2]=0;
//...
FIM DA ENTRADA DAS VARIAVEIS INICIAIS
for(k=0;k<N;k++){
while(v1[k]<a[k]||v1[k]>b[k]){
v1[k]=randFloat(n0[k],n1[k]);}
}
// printf("avaliacao da f\n");
y1=f(v1,N);
//printf("f = %f\n",y1);
109
aval=aval+1;
// printf("numero de avaliacoes\n");
if(y0>y1){
for(k=0;k<N;k++){
v0[k]=v1[k];
}
y0=y1;
if(y0<y){
it=aval;
y=y0;
for(k=0;k<N;k++){
v[k]=v0[k];}
}
fprintf(saida,"\n%f",y0);
}
else{
p=randFloat(0,1);
//printf("\np=%f",p);
e=expon(y1,y0,T);
//printf("\ne=%f",e);
if(p<e){
for(k=0;k<N;k++){
v0[k]=v1[k];}
y0=y1;
fprintf(saida,"\n%f",y0);
} // fim if
} // fim do else
}//fim do j
T=alfa*T;
//printf("\nT=%f",T);
i=i+1;}
110
gc();
for(k=0;k<N;k++){
if(v0[k]<a[k]){
printf("o gc encontrou um ponto fora do dominio\n\n\n\n");
v0[k]=a[k];
}
if(v0[k]>b[k]){
printf("o gc encontrou um ponto fora do dominio\n\n\n\n");
v0[k]=b[k];
}
}
printf("\n\n:::: BEST EVER no HIBRIDO::::::::::\n\n");
for(k=0;k<N;k++){
printf("\nv[%d]=%f",k,v0[k]);}
y=f(v0,N);
printf("\nf(x*)=%f\n\n",-y);
fclose(saida);
system("PAUSE");}
111