next up previous contents
Next: Función real de dos Up: Comportamiento de un Algoritmo Previous: Comportamiento de un Algoritmo   Índice General

Función real multimodal de una variable

El primer ejemplo de esta sección tratará de encontrar el óptimo (máximo en este caso) de la siguiente función, propuesta por Riolo [#!Riolo92!#]:

$\displaystyle f(x) = x + \vert sin(32 \pi x)\vert$     (2.1)

cuya gráfica es la que se muestra en la figura [*]. El problema está en encontrar la $x$ en el intervalo $[0 \ldots 1]$ que maximice la función $f$, esto es, encontrar un $x_0$ tal que

\begin{displaymath}
f(x_0) > f(x) \ \ \ \ \ \forall x \in [0 \ldots 1]
\end{displaymath}

Si observamos la gráfica de la función (figura [*]) vemos que la función es fuertemente multimodal, esto es, en el intervalo $[0 \ldots 1]$ tiene 32 óptimos locales, por lo cual, un método analítico de optimización tenderá a estancarse en alguno de ellos, no llegando al óptimo global ( $x=0.98447395 , f(x)=1.98442447$) si no se le da una aproximación inicial lo suficientemente buena.

Figura: Gráfica de la función objetivo $f(x) = x + \vert sin(32 \pi x)\vert$

Para resolver este problema se ha desarrollado un programa, utilizando la biblioteca OE, lo cual simplemente requiere definir la clase de los individuos, programar la función de evaluación, y elegir los objetos transformadores (operadores genéticos), selectores, terminadores, y el tipo de algoritmo que se utilizará.

Como algoritmo principal del programa se eligió un algoritmo genético simple (clase eoSGA), que básicamente lo que hace es el bucle de un AG, aplicando selección, reproducción/mutación y reemplazo.

La clase a la que pertenecen los individuos es eoBin, lo cual significa que los individuos serán cadenas de bits (como en un AG).

Como operadores de transformación se ha hecho uso de los operadores de mutación (eoBinMutation) y de cruce (eoBinCrossover).

La condición de parada del programa se estableció mediante el uso de un terminador (clase eoGenContinue) que controla el número de iteraciones que se harán.

Por último, la función de evaluación viene dada por la ecuación [*], de forma que, implementando dicha función, como una clase descendiente de eoEvalFunc (la que define la interfaz de cualquier función evaluadora), como se muestra en la figura [*], ya tendremos el programa listo para utilizarlo.

Figura: Codificación de la función de evaluación para resolver el problema de la función Riolo.
\begin{figure}
\begin{center}
\begin{tabular}{\vert l\vert}
\hline
double riolo(...
...sin(32.0 * M\_PI * x)); \\
\}; \\
\hline
\end{tabular}\end{center}\end{figure}

En la figura [*] podemos observar cómo se desarrolla la ejecución del AE implementado que optimiza esta función. Vemos que en las primeras generaciones los individuos quedan bastante alejados de la solución. Conforme avanza la ejecución (generaciones 2 y 3), el AE encuentra individuos que mejoran la solución. Hacia la generación 4, se encuentra un individuo que representa una solución lo suficientemente buena como para, pasadas unas generaciones sin obtener una mejora, conformarnos con la solución obtenida y detener la ejecución.

Figura: Ejecución típica del AE para optimizar la función Riolo: En las primeras generaciones los individuos quedan bastante alejados de la solución. Conforme avanza la ejecución (generaciones 2 y 3), el AE encuentra individuos que mejoran la solución. Hacia la generación 4, se encuentra un individuo que representa una solución adecuada.


next up previous contents
Next: Función real de dos Up: Comportamiento de un Algoritmo Previous: Comportamiento de un Algoritmo   Índice General
Francisco Javier Garcia Castellano
2000-12-14