ENFRIAMIENTO ENFRIAMIENTO SIMULADO Juan Felipe Muñoz Fernández
[email protected] 14-Oct-2014
En cualquier lenguaje de programación programe un algoritmo de Enfriamiento simulado para optimizar la siguiente función (Rosenbrock). n −1
f ( x) =
∑100( x
2 i
− x i +1 )
2
+ (1 −
xi )
2
i =1
n = 2,
− 5.12 ≤ xi ≤ 5.12
Comience por una solución x1 = 3 y x2
=
3 y corra el algoritmo mínimo 50 veces.
Elija los parámetros que considere adecuados. Pruebe con dos temperaturas diferentes y para cada una: 1. Grafique la secuencia secuencia de búsqueda: iteración iteración vs vs f ( x) 2. ¿Cuál es la mejor solución x' y f ( x' ) encontrada? En general: 3. Saque conclusiones del uso de la temperatura. Cuál fue más conveniente según tiempo de convergencia o calidad de la solución 4. ¿Qué ventajas le ve al algoritmo? 5. ¿Qué desventajas le ve al algoritmo? Debe entregar: diagrama de flujo (o seudocódigo), algoritmo (con comentarios) y resultados.
PSEUDOCÓDIGO Inicio Temperatura = T0 TemperaturaFinal = Tf VelocidadEnfriamiento = Ve AlfaEnfriamiento = Ae
σ = [5.12 − (−5.12)] / 6 X1 = 3 X2 = 3 n −1
f ( x1 , x 2 ) =
∑100( x
2 1
− x 2 )
2
+ (1 − x1
)
2
i =1
Aceptado = 0 Anterior = Mejor =
f ( x1 , x2 )
f ( x1 , x2 )
Repetir CuentaEnfriamiento = 1 Repetir
x'1
= X1 +
N (0, σ )
x'2
= X2 +
N (0, σ )
ρ =
f ( x'1 , x' 2 ) − f ( x1 , x2 )
Si ( ρ < 0) Aceptado = 1 Sino
P ( ρ )
=
e
− ρ Temperatur a
Si (NumeroAletorioUniforme(0,1) <
P ( ρ ) )
Aceptado = 1 Fin Si Fin Si Si (Aceptado = 1) X1 =
x '1
X2 =
x '2
F = f ( x1 , x 2 ) Si (F <= Mejor) Mejor = F X1Mejor = X1 X2Mejor = X2 Fin Si Anterior = F Aceptado = 0 Fin Si CuentaEnfriamiento = CuentaEnfriamiento + 1 Hasta (CuentaEnfriamiento = VelocidadEnfriamiento) TemperaturaActual = Temperatura Temperatura = AlfaEnfriamiento * TemperaturaActual Hasta (Temperatura <= TemperaturaFinal) Mostrar(X1Mejor,X2Mejor,Mejor) Fin
ALGORITMO IMPLEMENTADO EN LENGUAJE R # # # # # # # # #
Implementacion algoritmo Simulated Annealing para optimizacion de la funcion de Rosenbrock en lenguaje R. Autor: Juan Felipe Munoz Fernandez email:
[email protected] Universidad Nacional de Colombia - Sede Medellin Facultad de Minas Fecha ultima actualizacion: 10-Oct-2014
# Se define la funcion de Rosenbrock. # Para la implementacion pedida, la # la dimension: n=2, por tal razon el # ciclo for que implementa la sumatoria # va hasta 1. rosenbrock=function function( (x){ fr = 0 for (i in 1:1){ fr = fr+((100*(((x[i]^2)-x[i+1])^2))+((1-x[i])^2))
} return (fr)
} # Definicion del dominio de la variable x limInf = -5.12 limSup = 5.12 # Parametro para calcular la velocidad de enfriamiento velEnfriamiento = 50 # Parametro alfa para calculo de la temperatura inicial alfaInicial = 0.99 # Parametro para definir como se va a enfriar el sistema. # En este caso se elige un numero aleatorio # segun las recomendaciones que indican que # alfa debe estar entre 0.8 y 0.99 para la funcion # de enfriamiento del sistema alfaEnfriamiento = runif(1,0.8 0.8, ,0.99) # Parametro para detener la busqueda basado en # la definicion de una temperatura final del sistema tempFinal = 0.05 # Contador de ejecuciones del algoritmo cuentaRepeticiones = 0 # Numero maximo de ejecuciones del algoritmo maxRepeticiones = 50
# Inicia ciclo de ejecuciones maximas del algoritmo
repeat {
# Se pide iniciar x1=3 y x2=3 x = c(3,3) # Calculamos el valor de la funcion # con base en x1 y x2 iniciales g = rosenbrock(x) # Calculamos sigma para la estructura del # vecindario sigma=(limSup-limInf)/6 #temp=g*alfaInicial # Temperatura inicial tomando como # ejemplo: http://www.r-bloggers.com/simulated-annealing-in-julia/ temp = 10000 # Flag para saber si una solucion fue o no aceptada aceptado = 0 # Variables para controlar quien es la mejor solucion # encontrada en cada iteracion anterior = g mejor = g # Inicia ciclo de control de temperatura # este ciclo se detiene cuando el sistema # se enfria, es decir, temp <= tempFinal
repeat { # Inicia un contador para el control # de la velocidad de enfriamiento cVelEnfriamiento = 1 # Inicia ciclo de velocidad de enfriamiento
repeat { # # # #
Este ciclo se usa para validar que las perturbaciones hechas a x1 y x2 se mantengan en el dominio de la variable (-5.12 <= Xi <= 5.12)
repeat { # Se hacen las perturbaciones # a x1 y x2 con un numero aleatorio # que sigue la distribucion # normal. xPrima1 = x[1] + rnorm(1,0,sigma) xPrima2 = x[2] + rnorm(1,0,sigma) # Control de parada del ciclo de perturbacion if ( (xPrima1 >= limInf && xPrima1 <= limSup) && (xPrima2 >= limInf && xPrima2 <= limSup)) { break }
}
# Se crea una lista de x1 y x2 # perturbadas xPrima = c(xPrima1,xPrima2) # Se evalua el costo de la funcion # de Rosenbrock de acuerdo a la # solucion inicial y la solucion # perturbada rho = rosenbrock(xPrima) - rosenbrock(x) # Evaluacion para aceptar o no la solucion # que minimiza la funcion de Rosenbrock if (rho < 0) { aceptado = 1
} else { # # # # #
Si no se acepta la solucion se calcula la probabilidad de Boltzman para darle otra oportunidad de ser aceptada. Algoritmo Metropolis
pBoltzman=exp((-abs(rho))/temp) if (runif(1,0,1) < pBoltzman) { aceptado = 1
} } # Cuando la solucion se acepta... if (aceptado == 1) { # Solucion actual = Solucion perturbada x = xPrima # # # g
Se calcula nuevamente la funcion Rosenbrock con la solucion aceptada = rosenbrock(x)
# Control de soluciones aceptadas aceptado = 0 # # # #
Se va guardando el mejor valor de la funcion de Rosenbrock para las soluciones aceptadas en cada Iteracion if (g <= mejor) { mejor = g guardar = c(x,temp,mejor)
} anterior = g
} # Incremento del contador de control # de la velocidad de enfriamiento cVelEnfriamiento = cVelEnfriamiento + 1
# Control del ciclo de velocidad de # enfriamiento if (cVelEnfriamiento == velEnfriamiento) { break }
} # Funcion de enfriamiento: Enfriamiento geometrico. tempActual = temp temp = alfaEnfriamiento * tempActual # Control del ciclo de control de temperatura if (temp <= tempFinal) { break }
} # Se guardan los resultados de la busqueda en un archivo cat(cuentaRepeticiones,guardar, cuentaRepeticiones,guardar,file file="datos.csv" "datos.csv",sep ,sep="," ",",fill ,fill=TRUE,append
=TRUE TRUE) ) # Incremento del contador de ejecuciones del algoritmo cuentaRepeticiones = cuentaRepeticiones + 1 # Control del ciclo de ejecuciones del algoritmo if ( cuentaRepeticiones == maxRepeticiones ) { break }
}
RESULTADOS PRUEBA No. 1.
Los siguientes resultados corresponden a una temperatura inicial fijada en 10000, de acuerdo a como lo hacen en [1]. Es importante aclarar que esta tabla corresponde a los resultados de ejecutar 50 veces el algoritmo completo, seleccionando en cada iteración el mejor valor de x1 , x2 y f ( x) . Los siguientes parámetros se usaron para los resultados ilustrados a continuación.
-
Temperatura inicial: 10000 Velocidad de enfriamiento: 50, el ciclo más interno (el de búsqueda) itera 50 veces
antes de cambiar de temperatura. Alfa enfriamiento: Se selecciona un número aleatorio uniforme entre 0.8 y 0.99 [2]. Función de enfriamiento: Temp = Temp [k-1] [k-1] * Alfa enfriamiento, tomando como referencia la temperatura de la iteración [k-1] , es decir, la temperatura de la iteración con la que terminó el ciclo que controla la velocidad de enfriamiento.
-
Criterio de parada: Temp ≤ 0.05.
-
Número de corridas del algoritmo: 50. ���������
��
��
�����������
����
�
�
�
�����
����
�
���������
���������
��������
����������
�
��������
��������
�������
����������
�
��������
��������
��������
����������
�
���������
���������
����������
����������
�
���������
���������
��������
����������
�
��������
��������
��������
����������
�
���������
���������
��������
����������
�
�������
���������
���������
����������
�
��������
��������
��������
����������
��
������
��������
��������
����������
��
���������
���������
��������
����������
��
��������
��������
���������
����������
��
��������
��������
���������
����������
��
���������
���������
��������
����������
��
��������
��������
��������
����������
��
��������
��������
��������
����������
��
��������
��������
��������
����������
��
���������
��������
��������
����������
���������
��
��
�����������
����
��
���������
�������
��������
����������
��
���������
���������
��������
����������
��
���������
���������
��������
���������
��
���������
���������
�������� ����������
��
���������
���������
�������� �
����������
��
��������
��������
��������
����������
��
���������
���������
��������
����������
��
��������
��������
��������
����������
��
��������
������
���������
����������
��
��������
��������
��������
����������
��
��������
��������
��������
����������
��
��������
��������
���������
���������
��
���������
���������
��������
����������
��
��������
��������
���������
���������
��
��������
���������
��������
����������
��
���������
���������
��������
����������
��
��������
��������
��������
����������
��
��������
���������
�����
����������
��
���������
���������
��������
����������
��
��������
��������
��������
����������
��
��������
���������
�������
����������
��
���������
��������
�������
����������
��
��������
���������
���������
����������
��
���������
���������
�������� �
����������
��
��������
��������
���������
����������
��
���������
���������
��������
���������
��
��������
��������
������
���������
��
��������
��������
�������
����������
��
���������
�������
���������
����������
��
���������
���������
�������� �
����������
��
���������
���������
��������
����������
��
�������
�������
���������
����������
Tabla 1: Resultados de la búsqueda del algoritmo de enfriamiento simulado para una
temperatura inicial de 10000 y 50 ejecuciones del mismo. El mejor valor mínimo de la función de Rosenbrock se alcanzó en la ejecución número 22 del algoritmo. La siguiente gráfica ilustra este proceso de búsqueda.
���� �� ��������� ������ ����� ���� ���
����
� ����
�� ��� ���� ����� �
�
�
�� �� �� �� �� �� �� �� �� �� �� �� �� ��
���������
Figura 1: Gráfica del resultado de la búsqueda del valor mínimo de la función de Rosenbrock
para 50 ejecuciones del algoritmo con una temperatura inicial de 10000.
Se observa en la gráfica como en la iteración 22, la función alcanza su valor mínimo (casi cero) para un x1
=
0.9881718
y x 2
=
0.9755089 con una temperatura de T
= 106.6917
.
Nótese que aunque el sistema no llegó a enfriarse por completo, su óptimo se alcanzó con una temperatura muy por encima del valor fijado como temperatura final: 106.691 >> 0.05.
RESULTADOS PRUEBA No. 2.
Para esta prueba se seleccionó como temperatura inicial, una temperatura cercana al valor de f ( x) para la solución inicial, es decir, x1
=3
y x2
= 3.
El valor de la temperatura para esta
prueba fue f (3,3) * 0.99 . Los demás parámetros se mantienen: -
Temperatura inicial: f (3,3) * 0.99 .
-
Velocidad de enfriamiento: 50, el ciclo más interno (el de búsqueda) itera 50 veces
-
antes de cambiar de temperatura. Alfa enfriamiento: Se selecciona un número aleatorio uniforme entre 0.8 y 0.99 [2]. Función de enfriamiento: Temp = Temp [k-1] [k-1] * Alfa enfriamiento, tomando como referencia la temperatura de la iteración [k-1] , es decir, la temperatura de la iteración con la que terminó el ciclo que controla la velocidad de enfriamiento.
-
Criterio de parada: Temp ≤ 0.05.
-
Número de corridas del algoritmo: 50.
La siguiente tabla ilustra los resultados de esta prueba.
���������
��
��
�����������
����
�
�
�
�������
����
�
��������
��������
�������
����������
�
���������
���������
��������
���������
�
��������
��������
���������
�������
�
��������
��������
��������
����������
�
�������
��������
��������
����������
�
��������
��������
��������
����������
�
��������
��������
��������
����������
�
���������
���������
���������
����������
�
��������
��������
��������
����������
��
�������
��������
��������
����������
��
��������
��������
��������
����������
��
��������
��������
��������
����������
��
��������
��������
��������
����������
��
���������
���������
�������� �
����������
��
���������
���������
��������
����������
���������
��
��
�����������
����
��
��������
�����
��������� ����������
��
��������
��������
��������
����������
��
��������
��������
��������
���������
��
���������
���������
�������� �
����������
��
���������
���������
��������
����������
��
���������
���������
����������
����������
��
��������
�������
���������
����������
��
��������
��������
���������
����������
��
��������
��������
��������
����������
��
��������
��������
��������
����������
��
������
��������
��������
����������
��
���������
���������
��������
����������
��
��������
��������
��������
����������
��
��������
��������
���������
����������
��
��������
���������
��������
����������
��
��������
��������
��������
����������
��
���������
���������
��������
����������
��
��������
��������
����������
����������
��
��������
���������
��������
����������
��
���������
���������
�������
����������
��
���������
���������
��������
����������
��
��������
��������
��������
����������
��
���������
���������
��������
����������
��
��������
��������
���������
����������
��
��������
��������
��������
����������
��
��������
�������
����������
����������
��
���������
���������
�������� �
����������
��
���������
���������
��������
����������
��
���������
���������
�������� �
����������
��
���������
��������
��������
����������
��
���������
���������
��������
����������
��
���������
���������
���������
���������
��
��������
��������
��������
����������
��
��������
�������
� �������
����������
��
��������
���������
��������
����������
Tabla 2: Resultados de la búsqueda del algoritmo de enfriamiento simulado para una
temperatura inicial de f (3,3) * 0.99 y 50 ejecuciones del mismo.
La siguiente gráfica ilustra el proceso de búsqueda para esta prueba.
���� �� ��������� ����� ���� ��� �
���� ��
����
��� ���� ����� �
�
�
�� �� �� �� �� �� �� �� �� �� �� �� �� ��
���������
Figura 2: Gráfica del resultado de la búsqueda del valor mínimo de la función de Rosenbrock
para 50 ejecuciones del algoritmo con una temperatura inicial de f (3,3) * 0.99 .
Como se observa en la tabla de resultados, el óptimo de la función de Rosenbrock se encontró en la corrida número 16 del algoritmo. En este caso, la convergencia del algoritmo coincidió con la temperatura más baja de dicha iteración: 0.0583221, casi la temperatura final del sistema. Entre las dos pruebas, quién presenta una solución de mejor calidad, corresponde a la prueba 1, ya que se sabe que el mínimo de la función de Rosenbrock es 0 cuando x1 = 1 y x2 = 1 [3]. La siguiente tabla corresponde al comparativo entre ambas pruebas. ���������
��
��
�����������
����
������ �
��
���������
���������
��������
����������
������ �
��
��������
�����
���������
����������
Tabla 3: Comparación de los mejores valores para la función de Rosenbrock en cada una de las pruebas realizadas.
VENTAJAS DEL ALGORITMO
-
El algoritmo cuenta con varios parámetros ajustables por parte del analista: temperatura, temperatura, criterio de parada, número de repeticiones, función de enfriamiento, entre otros. Todos estos parámetros permiten refinar la búsqueda y escapar de óptimos locales con un costo computacional relacionado estrechamente con la calidad de los parámetros elegidos.
-
Con una mayor temperatura temperatura inicial se hace una búsqueda más precisa, precisa, obteniendo un óptimo global más cerca al valor óptimo de la función.
-
La ejecución del algoritmo no se atora en ningún punto.
DESVENTAJAS DEL ALGORITMO
-
Dificultad para establecer establecer claramente los parámetros como la temperatura inicial, el criterio de parada, la función de enfriamiento, entre otros. Dependen mucho del problema que se esté trabajando y de la experiencia del analista.
-
Dependiendo de la temperatura inicial elegida, elegida, el criterio de parada y del dominio de la variable xi (por las validaciones que se requieren) se puede dar un costo computacional alto.
-
Temperaturas iniciales pequeñas confinan la búsqueda a óptimos locales.
CONCLUSIONES
-
Se nota como en la prueba de mayor temperatura inicial, la búsqueda escapa con más facilidad del óptimo local acercándose al valor óptimo de la función (casi cero). Mientras que en la prueba de menor temperatura inicial, la búsqueda permanece en una zona de valores sin que se produzcan movimientos significativos a valores más cercanos al óptimo de la función.
-
La prueba de mayor temperatura inicial inicial requirió más costo costo computacional computacional (tardó más) que la prueba de temperatura inicial menor.
-
En la la prueba de mayor temperatura inicial se alcanzó alcanzó un óptimo global sin que el sistema sistema se haya enfriado por completo, mientras que en la prueba de temperatura inicial baja, el óptimo local encontrado demuestra que se alcanzó sólo cuando el sistema estaba casi frio.
-
Se requieren controles adicionales para finalizar la búsqueda cuando se haya encontrado el óptimo de la función para no iterar más de lo necesario. Es decir, debería reforzarse el criterio de parada del algoritmo con validaciones adicionales. Por ejemplo, un porcentaje de las mejores soluciones aceptadas.
-
A temperaturas iniciales bajas, la búsqueda parece quedar confinada a óptimos locales como lo demuestra la gráfica de la figura 2.
-
En la prueba de mayor temperatura temperatura inicial, la búsqueda se concentra al principio en un espacio local, pero al bajar lentamente la temperatura se aceptó un movimiento de escape que le permitió a la búsqueda acercarse con más precisión al óptimo global.
-
La prueba de mayor costo computacional computacional obtuvo obtuvo un resultado de mejor calidad que la prueba de menor costo computacional.
-
Debido a que en cada iteración completa del algoritmo se está guardando la mejor solución, entonces se presenta elitismo como lo demuestra la prueba de mayor temperatura, en donde se alcanzó el óptimo sin que el sistema se enfriara por completo.
REFERENCIAS
[1] MYLES WHYTE, John. Simulated Annealing in Julia. Abril 4 de 2012 [en línea]. http://www.r-bloggers.com/simulated-annealing-in-julia/ [2] GARCIA PARDO, Eduardo. Optimización de Sistemas de Comunicación. Tema 3.3. Recocido Simulado. 2012 2013. p. 11 [en línea]. http://docencia.etsit.urjc.es/moodle/pluginfile.php/23584/mod_resource/content/2/Recocido%20 Simulado.pdf [3] Wolfram MathWorld. Rosenbrock http://mathworld.wolfram.com/RosenbrockFunction.html
Function
[en
línea].
[4] BROWNLEEE, BROWNLEEE, Jason. Clever Algorithms: Nature-Inspired Programming Recipes. Simulated Annealing [en línea]. http://www.cleveralgorithms.com/natureinspired/physical/simulated_annealing.html [5] JARAMILLO, Gloria Patricia. Sesión 6. Enfriamiento Simulado (Simulated Annealing). Universidad Nacional de Colombia, Sede Medellín. Facultad de Minas. Semestre 2014-II. Curso de Computación Evolutiva y Optimización Heurística. [6] TUNJANO, Jairo Alonso. Recocido Simulado (Simmulated Annealing SA). Universidad Nacional de Colombia. 2003 [en línea]. http://dis.unal.edu.co/~fgonza/courses/2003/pmge/present/Recocido_simulado.pdf [7] VILCHES, Erika. Recocido Simulado. Inteligencia Computacional TC 3023 [en línea]. http://www.erikavilches.com/TC3023.01.200913/diapositivas/Tema%202%20%20Recocido%20simulado.pdf [8] ALGORITMICA 2009 - 2010. Tema 3. Algoritmos de Enfriamiento Simulado [en línea]. http://sci2s.ugr.es/docencia/algoritmica/Tema03-EnfriamientoSimulado-09-10.pdf [9] PAVÓN MARIÑO, Pablo. Planificación y Gestión de Redes. Práctica 2. Algoritmos de enfriamiento simulado (simulated annealing). Curso 2012 – 2013 [en línea]. http://www.net2plan.com/teaching/files/PyGRC/P3/P3_planif_main.pdf
NOTAS
Este documento PDF incluye los siguientes archivos adjuntos: -
rosenbrock.r resultados-rosenbrock-simulated-annealing.xlsx