mos genéticos, usando la teoría de esquemas. Una breve descripción a esta teoría se encuentra expuesta en la Sección 1.5.2. La idea fundamental de unalgoritmo genético es que la población inicial evoluciona sucesivamente hacia mejores regiones del espacio de búsqueda mediante dos procesos fundamentalmente:
• Selección de los individuos más adaptados en la población, (a mayor grado de adaptación mayor probabilidad de dejar descendencia).
• ModiÞcación por recombinación y/o mutación de los individuos seleccionados. La estructura de un algoritmo evolutivo básico es la siguiente:
[01] begin
[02] {t←0;
[03] Inicializar(A(t));
[04] Evaluar(A(t)); [05] while(no parada)
[06] {t←t+1;
[07] Seleccionar A(t) a partir de A(t-1);
[08] Recombinar y/o mutar A(t);
[09] Evaluar A(t);
[10] } [11] } [12] end
Así según Michalewicz [74] y según se menciona en [87], un algoritmo genético ha de tener las siguientes cinco componentes:
1. Una representación genética de las soluciones posibles del problema (codiÞcación). 2. Una manera de crear una población inicial de soluciones posibles (genomas y población). 3. Una función que evalúe a los individuos y haga el efecto de la selección natural, clasiÞcando
las soluciones atendiendo a su “fortaleza” (función objetivo).
4. Operadores genéticos que permitan alterar la composición de las soluciones, (selección cruce y mutación).
5. Valores de varios parámetros que utiliza el algoritmo genético.
A continuación describimos estas componentes diseñadas para el problemaMaxA-p-Pv1(P) y que han sido las utilizadas en la implementación del algoritmo correspondiente cuyo código se encuentra en el Apéndice B.
Codificación
Dada una entrada del problema, un algoritmo genético debe poder alcanzar una solución del problema para dicha entrada. Las posibles soluciones del problema se deben poder representarse de alguna manera en el algoritmo genético mediante un conjunto de parámetros, a menudo lla- mados “individuos” o “genomas”. En términos genéticos, este conjunto de parámetros constituye el “genotipo” y la codiÞcación para una determinada solución constituye el “fenotipo”.
En el algoritmo genético desarrollado para el problemaMaxA-p-Pv1(P)se ha considerado que un individuo es un gen, que viene representado por las coordenadas de un punto, (individuo), interior al polígonoP.
G= ((x, y))
Esta codiÞcación de individuo o genoma será ampliada en el Capítulo 8 donde se estudia el problema MaxA-p-Pvk(P, k) y donde cada individuo de la población estará codiÞcado por un genoma conk genes
G= ((x1, y1),(x2, y2), ...,(xk, yk)) (7.3.12)
siendo kel cardinal del conjunto de puntos cuya visibilidad se quiere maximizar.
Genoma y población
La población para una determinada generación estará formada por un conjunto de genomas. El número total de genomas que hemos de elegir para cada población debe ser tal que tengamos suÞciente diversidad para poder garantizar la eÞciencia del algoritmo y que éste produzca buenos hijos durante el proceso de evolución.
El tamaño de la población deberá ser lo suÞcientemente grande como para garantizar la diversidad pero no tanto que perjudique la eÞciencia del algoritmo. Según la bibliografía [87] un cardinal adecuado de población es el doble de la longitud del genoma, sin embargo, en nuestro caso se ha tomado como tamaño de población el número de vértices del polígono, relacionando de esta manera la entrada del problema con los elementos de la heurística.
Así, la población para la generacióntde nuestro algoritmo vendrá representado por:
A(t) ={Gt1, Gt2, ..., Gtn} (7.3.13) donde cada Gti representa a un individuo o genoma perteneciente a la población A(t) y nes el número de vértices del polígonoP.
Función objetivo
Debemos deÞnir en este paso la función objetivo. Esta función debe ayudarnos a realizar la mejor selección posible de individuos que deberán reproducirse, de manera que asignará valores más altos a las soluciones cuanto más se acerquen a la solución óptima. Así, a cada individuo o genoma G = ((xi, yi)) se le asignará un valor igual al área de la zona iluminada por el gen (xi, yi). Si V(P,(xi, yi)) es el polígono de visibilidad de (xi, yi) dentro del polígono P, éste se
podrá expresar como V(P,(xi, yi)) =Sqj=1Tj, siendoTj j = 1, .., q el conjunto de triángulos en los que se puede descomponer V(P,(xi, yi)) al ser un polígono estrellado. Por tanto la función objetivo de nuestro algoritmo genético se deÞne
f(G) = q
X
j=1
Area(Tj) (7.3.14)
Para el cálculo de los polígonos de visibilidad se ha implementado un algoritmo lineal [72], cuya implementación se encuentra en el Apéndice B. Consideraremos como evaluación de la población A(t), es decir, como Þtness de la población al máximo valor de f(Gt
i) ∀i = 1, ..., n. Denotaremos el Þtness de una población A(t) en la generacióntmediante
F(A(t)) = max i=1,...,nf(G
t
i) (7.3.15)
Pasamos a continuación a explicar los mecanismos de selección cruce y mutación utilizados en nuestro algoritmo y el Þtness de población considerado.
Selección, cruce y mutación
Los operadores de selección, cruce y mutación son elementos importantes en todo algoritmo genético, pues determinarán el éxito de los mecanismos de reproducción del algoritmo. El ope- rador de selección debe elegir aleatoriamente de la población unos padres, de forma que los individuos para los que la función objetivo sea mayor tengan mayor probabilidad de ser elegi- dos. El método de selección utilizado en nuestro algoritmo es el de selección proporcional im- plementado mediante el método de la ruleta, (ver Capítulo 1), de tal forma que los individuos con mayor función objetivo tengan mayor probabilidad de ser elegidos. Los pasos seguidos en la implementación de éste método son los siguientes:
(a) Determinar la sumaS de las adaptaciones de toda la población.
(b) Relacionar una a uno todos los individuos con segmentos contiguos de la recta real [0, S), tal que cada segmento individual sea igual en su tamaño a su grado de adaptación. (c) Generar un número aleatorio en [0, S).
(d) Seleccionar el individuo cuyo segmento cubre el número aleatorio.
(e) Repetir el proceso hasta obtener el número deseado de muestras.
Así, si{Gt1, ..., Gtn} es la población en la generación ty S = n
P
i=1
f(Gti), elegimos un número aleatorio r uniformemente distribuido entre 0 y S. Si r ≤f(Gt
1) elegimos el individuo Gt1, en
otro caso elegimos el individuo Gt
i tal que iP−1 j=1 f(Gt j)< r≤ i P j=1 f(Gt
j). Este mecanismo se repite dos veces para obtener los dos padres de nuestra generación t,Gti yGtj.
Una vez seleccionados los padres para la generación t, (Gti, Gtj) pasamos a modiÞcarlos mediante el operador de cruce como se mencionó en la Sección 1.5.2. Para ello generamos alea- toriamente un número r (0 ≤ r < 1). Si r es mayor que la probabilidad de cruce pc estos individuos pasarán sin ser modiÞcados a la generación siguiente, en caso contrario serán someti- dos al proceso de cruce. El mecanismo de cruce utilizado es el cruce en un solo punto descrito en la fórmula 1.5.19. Elegimos al azar un número aleatorio1≤r≤ke intercambiamos los genes de los padres a partir del gen que ocupa el lugarr. Evidentemente como el caso que nos ocupa en esta sección es k= 1, este operador de cruce producirá , en caso de aplicarse, un intercambio del gen de un padre por el gen del otro padre y viceversa. Por ello, consideramos parak= 1que no tenemos operador de cruce, modiÞcando los genes de una generación a la siguiente mediante el operador de mutación.
Sin embargo sik >1, caso que trataremos en el capítulo siguiente para solucionar el problema MaxA-p-Pvk(P, k), si tendrá sentido este operador de cruce, ya que en este caso cada individuo padre vendrá representado pork genes, conk >1y el operador de cruce en un punto producirá una mezcla de los genes de cada padre a partir del gen r. Así, si los genomas de los padres seleccionados vienen descritos por:
Gti= ³ (x(1i), y(1i)), ...,(x(ri), y(ri)),(x(ri+1) , y(ri+1) ), ...,(x(ki), yk(i)) ´ Gjt =³(x(1j), y1(j)), ...,(x(rj), yr(j)),(x(rj+1) , yr(j+1) ), ...,(x(kj), yk(j)) ´ (7.3.16) tendremos tras el procedimiento de cruce los genomas
G∗it= ³ (x(1i), y1(i)), ...,(xr(i), yr(i)),(x(rj+1) , y (j) r+1), ...,(x (j) k , y (j) k ) ´ Gj∗t=³(x(1j), y1(j)), ...,(x(rj), yr(j)),(x(ri+1) , yr(i+1) ), ...,(xk(i), y(ki)) ´ (7.3.17) Obtenidos los padres, (que son también hijos en el casok= 1), para la generación t+ 1 les aplicaremos el operador de mutación. Para cada individuo G= ((xi, yi))generamos un número aleatorio r (0< r≤1). Si r es mayor que la probabilidad de mutaciónpm no será sometido a mutación, en caso contrario generaremos dos números aleatorio aybque siguen la distribución N(0,1) y sustituiremos el gen (xi, yi) por (xi +a/100, yi +b/100). Debe recordarse en este punto que los polígonos que produce el generador aleatorio de polígonos RP G implementado y descrito en el Apéndice A, se generan en el cuadrado unidad, es decir, en el cuadrado de vértice{(0,0),(0,1),(1,1),(1,0)}, por lo que tiene sentido sumar a cada coordenada de un gen un número aleatorio que siga la distribución N(0,1)dividido por 100.
Condición de parada
Si en un número suÞcientemente grande de generaciones lafunción objetivo no se ha modiÞcado, podemos suponer que estamos cerca del óptimo. Por ello, se ha considerado en nuestro algoritmo genético como condición de parada que el Þtness de la población F(A(t)) no varíe durante un número h de generaciones. En nuestro caso se ha consideradoh= 20. Es decir AGpara cuando
∃t∈N / F(A(t+h))≤F(A(t)) ∀h= 1, ...,20 y por tanto t representa la generación de parada.
Presentamos en la Figura 7.3 un polígono de25 vértices generado aleatoriamente porRP G y la solución aportada por el algoritmo genéticoGA, indicando el punto de máxima iluminación encontrado, el área iluminada y el porcentaje de ésta respecto al área del polígono total. Com- parando con el resultado obtenido con SA se observa con en este caso se mejora el porcentaje de área iluminada. Mostramos en la Figura 8.16 la curva de crecimiento de la función objetivo según avanza el algoritmo en cada generación.
(a) (b)
Figura 7.3:Un ejemplo de la aproximación del problemaMaxA-p-Pv1(P)con GApc= 0.8pm= 0.05
ALGORITMO GENÉTICO GA pc=0.8 pm=0.05: * Polígono de visibilidad calculado
- Punto de área máxima... (0.770995,0.553071) - Área máxima... 0.24740 72.6870%
Debe hacerse notar que la heurística AG para el casok= 1 la podemos considerar un caso particular de un algoritmo random search que estudiamos en la siguiente sección, ya que se omite el operador de cruce al utilizar cruce en un punto. En este sentido, se podrían consi- derar otros operadores de cruce que eliminaran esta diÞcultad, como podrían ser cruce en un punto con cadenas binarias. Sin embargo se ha preferido utilizar esta particularidad para que exista homogeneidad entre los operadores utilizados para resolver el problemaMaxA-p-Pv1(P), (k= 1), y el problemaMaxA-p-Pvk(P, k)conk >1que estudiaremos en el capítulo siguiente. Asimismo, es importante detacar que todas las experimentaciones para esta heurística AG han sido realizadas tomando como probabilidad de cruce pc = 0.8 y como probabilidad de mutación pm = 0.5. Como se mencionará en la sección de conclusiones uno de los trabajos pendientes es intentar ajustar más, mediante la experimentación, estas dos probabilidades.