# Algoritmo firefly

El algoritmo firefly (FA por sus siglas en inglés, "firefly algorithm"; algoritmo luciérnaga en español) es un algoritmo metaheurístico, inspirado en el comportamiento del centelleo de las luciérnagas. El propósito primario de una luciérnaga es generar destellos de luz para actuar como sistema de señal para atraer a otras luciérnagas. Xin-She Yang formuló este algoritmo con las siguientes premisas:
* Todas las luciérnagas son "unisexuales", de modo que cualquier luciérnaga individual será atraída por todas las demás;
* La atracción es proporcional a su brillo, y para cualquier par de luciérnagas, la menos brillante será atraída por (y por lo tanto se desplazará hacia) la más brillante; aun así, la intensidad (el brillo aparente) decrece cuando aumenta la distancia entre ambas;
* Si no hay luciérnagas más brillantes que una dada, esta se mueve aleatoriamente.
El brillo es asociado con los valores de una función objetivo.
El algoritmo firefly es un procedimiento metaheurístico de optimización inspirado en la naturaleza.

## Descripción del algoritmo

El pseudocódigo puede ser resumido como:
La fórmula de actualización principal para cualquier par de dos luciérnagas $\mathbf {x} _{i}$ y $\mathbf {x} _{j}$ es
       $\mathbf {x} _{i}^{t+1}=\mathbf {x} _{i}^{t}+\beta \exp[-\gamma r_{ij}^{2}](\mathbf {x} _{j}^{t}-\mathbf {x} _{i}^{t})+\alpha _{t}{\boldsymbol {\epsilon }}_{t}$
donde $\alpha _{t}$ es un parámetro que controla la medida del paso, mientras que ${\boldsymbol {\epsilon }}_{t}$ es un vector extraído de una distribución Gaussiana u otra distribución.
Puede demostrarse que el caso limitativo $\gamma \rightarrow 0$ corresponde a la optimización por enjambre de partículas estándar (PSO). De hecho, si el bucle interior (for j) es eliminado y el brillo $I_{j}$ es reemplazado por el mejor actual global $g^{*}$, entonces FA esencialmente se convierte en el estándar PSO.

## Guías de implementación

$\gamma$ tiene que ser relacionado con la escala de variables de diseño. Idealmente, el término $\beta$ tendría que ser de orden uno, lo que requiere que $\gamma$ tendría que ser enlazado con las escalas. Por ejemplo, una posible elección es utilizar $\gamma =1/{\sqrt {L}}$ , donde $L$ es la escala media del problema. En el caso de que las escalas varíen significativamente, $\gamma$ puede ser considerado como un vector para adoptar escalas diferentes en dimensiones diferentes. De modo parecido, $\alpha _{t}$ también tendría que ser enlazada con las escalas. Por ejemplo, $\alpha _{t}\leftarrow 0.01L\alpha _{t}$. Se puede señalar que la descripción anterior no incluye la reducción aleatoria. De hecho, en su implementación real por diversos investigadores, el movimiento de las luciérnagas es gradualmente reducido por una especie de suavizamiento aleatorio como $\alpha =\alpha _{0}\delta ^{t}$ donde$0<\delta <1(e.g.,\delta =0.97)$, aunque este valor puede depender del número de iteraciones. En algún problema difícil, pueda ser útil aumentar $\alpha _{t}$ en algunas etapas, y reducirlo cuando sea necesario. Esta variación no-monótona de $\alpha _{t}$ capacita al algoritmo para salir de cualquier óptimo local como en el caso improbable de que pudiera bloquearse si el término aleatorio es reducido demasiado deprisa.
Estudios paramétricos muestran que n (el número de luciérnagas) tendría que ser aproximadamente entre 15 y 40 para la mayoría de problemas. Hay una versión disponible del algoritmo programada en python, aunque con funcionalidades limitadas.
Estudios recientes muestran que el algoritmo firefly es muy eficaz, y puede superar a otros algorítmicos metaheurísticos que incluyen optimización por enjambre de partículas. Otros algoritmos metaheurísticos pueden tener dificultad en tratar funciones de prueba estocástica, y parece que el algoritmo firefly puede tratar la prueba estocástica de forma muy eficientemente. Además, también es mejor en el tratamiento de problemas de optimización de ruido, con una notable facilidad de implementación.
Chatterjee y otros han demostrado que el algoritmo firefly puede ser superior a la optimización por enjambre de partículas en sus aplicaciones. Además, puede solucionar eficientemente problemas no convexos con condiciones de contorno complejas no lineales. Se han hecho mejoras posteriores en el rendimiento con resultados prometedores.

## Análisis teórico

A pesar de que se han hecho muchos progresos en algorítmos basados en el FA desde 2008, todavía se necesitan esfuerzos significativos para mejorar su rendimiento:
* Análisis teórico para convergencia de trajectorias;
* Deducción de las condiciones suficientes y necesarias para la selección de los coeficientes de control;
* Mecanismos o estrategias eficaces para la selección de los parámetros de control;
* Reglas no-homogéneas de actualización para realzar la capacidad de búsqueda.
Las variantes clásicas del algoritmo tienen encuadres de parámetros inesperados y leyes de actualización limitada, notablemente la regla homogénea necesita ser mejorada para hacer más búsquedas en escenarios de formas físicas diferentes. Se ha efectuado el análisis de la trayectoria de una sola luciérnaga en el algoritmo tradicional y en una variante adaptativa, respectivamente. Estos análisis llevan a un modelo general de los algoritmos que incluyen un conjunto de las condiciones de frontera para los parámetros que garantizan las tendencias de convergencia de los dos algoritmos.

## Variantes del algoritmo firefly

Una revisión recopilatoria reciente ha mostrado que el algoritmo firefly y sus variantes han sido utilizados en casi todas las áreas de la ciencia:
* Adaptive Firefly Algorithm (AdaFa)
* Discrete Firefly Algorithm (DFA)
* Multiobjective FA
* Lagrangian FA
* Chaotic FA
* Algoritmos híbridos
* Firefly Algorithm Based Memetic Algorithm
* Parallel Firefly Algorithm with Predation (pFAP)
* Modified Firefly Algorithm

## Aplicaciones

* Compresión de imagen digital y procesamiento de imagen
* Optimización de autovalores
* Sistemas nanoelectronicos y Diseño de circuitos integrados
* Selección de características y detección de fallos
* Diseño de antenas
* Diseño estructural
* Planificación y TSP (Problema del viajante)
* Servicios web semánticos
* Equilibrio de fase químico
* Agrupamientos
* Problemas dinámicos
* Problemas de procesados de imagen rígidos
* Predicción de la estructura de proteínas
* Optimización de parámetros de máquinas de vectores de soporte (Comportamiento de la bolsa y predicciones meteorológicas)
* IK-FA (Solución de problemas cinemáticos inversos)