23.07.2013 Views

Un Algoritmo Genético H´ıbrido Paralelo para Instancias Complejas ...

Un Algoritmo Genético H´ıbrido Paralelo para Instancias Complejas ...

Un Algoritmo Genético H´ıbrido Paralelo para Instancias Complejas ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

implementaciones <strong>para</strong>lelas en clusters de máquinas<br />

distribuidas se propusieron inicialmente en [11].<br />

A. <strong>Algoritmo</strong> genético celular<br />

En esta sección se describe el cGA utilizado en cada<br />

una de las islas. En el <strong>Algoritmo</strong> 1 se puede ver<br />

el pseudocódigo del cGA utilizado en este trabajo.<br />

Usualmente, la población se encuentra estructurada<br />

en una rejilla toroidal de 2 dimensiones, en el que se<br />

define una estructura de vecindario. Iterativamente,<br />

el algoritmo va considerando cada uno de los individuos<br />

que forman la población actual (líneas 3 y 4).<br />

Los individuos sólo pueden interactuar con sus vecinos<br />

(línea 5), por lo que los padres son elegidos del<br />

vecindario del individuo actual (línea 6) de acuerdo a<br />

un criterio dado. Los operadores de recombinación y<br />

mutación son aplicados a los individuos en las líneas<br />

7 y 8 con probabilidades Pc y Pm, respectivamente.<br />

Tras esto, se le aplica la búsqueda local al individuo<br />

resultante (línea 9), y a continuación se calcula su<br />

valor de fitness (i.e., el coste de la solución representada).<br />

El método de búsqueda local aplicado se<br />

explica más abajo. Tras la búsqueda local, el mejor<br />

individuo de entre el actual y el descendiente se<br />

coloca en la posición equivalente de una población<br />

auxiliar (línea 11).<br />

<strong>Un</strong>a vez aplicado el ciclo reproductor explicado<br />

<strong>para</strong> todos los individuos de la población, la población<br />

actual se sustituye por la auxiliar (línea 14),<br />

y se actualizan las estadísticas (línea 15). Este bucle<br />

se repite hasta que la condición de terminación<br />

se cumpla (línea 2). En nuestro caso, la condición<br />

de terminación será realizar 5 000 generaciones o, lo<br />

que es lo mismo, 500 000 evaluaciones.<br />

A continuación se detallan algunos aspectos importantes<br />

de la implementación del cGA utilizado:<br />

Representación de los individuos. La representación<br />

utilizada <strong>para</strong> los individuos es la llamada<br />

GVR (Genetic Vehicle Representation) [12]. En<br />

GVR, el genotipo contiene una permutación de enteros<br />

(representando a los distintos clientes), así como<br />

información de la posición en la que termina cada<br />

ruta. En nuestro algoritmo no se admite la existencia<br />

de individuos no factibles, por lo que cuando se<br />

exceden bien la capacidad del vehículo o bien la lon-<br />

Algorithm 1 Pseudocódigo de un cGA.<br />

1: proc Evoluciona(cga) //Parametros del algoritmo en ‘cga’<br />

2: while not Condición Terminación() do<br />

3: for x ← 1 to WIDTH do<br />

4: for y ← 1 to HEIGHT do<br />

5: vecinos←Obtener Vecindario(cga,posición(x,y));<br />

6: padres←Selección(vecinos);<br />

7: indiv aux←Recombinación(cga.Pc,padres);<br />

8: indivaux aux←Mutación(cga.Pm,indiv aux);<br />

9: indiv aux←Búsqueda Local(cga.Pl,indiv aux);<br />

10: Evalua Fitness(indiv aux);<br />

11: Reemplazo(posición(x,y),indiv aux,cga,pop aux);<br />

12: end for<br />

13: end for<br />

14: cga.pop←pop aux;<br />

15: Actualiza Estadísticas(cga);<br />

16: end while<br />

17: end proc Evoluciona;<br />

Algorithm 2 Pseudocódigo del operador de cruce.<br />

// Sean I1 e I2 los padres seleccionados del vecindario;<br />

Seleccionar una sub-ruta aleatoria SR = {a1, . . . , an} de I2<br />

Buscar el cliente c /∈ SR más cercano geográficamente a a1<br />

Eliminar todos los clientes de I1 que están en SR<br />

El descendiente se obtiene tras insertar SR en el material<br />

genético de I1 de forma que a1 esté situado inmediatamente<br />

después de c<br />

gitud máxima en una ruta, se procede a su re<strong>para</strong>ción<br />

mediante la partición de la ruta en dos rutas (o<br />

más si es necesario) distintas que no violen ninguna<br />

restricción.<br />

Generación de la población inicial. Los individuos<br />

de la población inicial son generados de forma<br />

aleatoria y a continuación son modificados como se<br />

detalla en [12] <strong>para</strong> forzar que representen soluciones<br />

válidas al problema (i.e., no incumplen ninguna<br />

restricción).<br />

Operador de cruce. El operador de cruce utilizado<br />

en PEGA es generic crossover, propuesto originalmente<br />

en [12]. Este operador tiene la principal<br />

característica de promover de una forma importante<br />

la diversidad en la población. Consideramos que<br />

ésta es una característica muy importante del operador,<br />

ya que en nuestra experiencia en trabajos anteriores<br />

[8], [13], [14] la población completa termina<br />

convergiendo hacia un mismo óptimo local en multitud<br />

de ocasiones. Este operador de cruce es algo<br />

inusual, puesto que el descendiente generado no contiene<br />

exactamente una mezcla del material genético<br />

de los padres, como puede verse en la Fig. 3. En el<br />

<strong>Algoritmo</strong> 2 se muestra un pseudocódigo del operador<br />

de cruce utilizado.<br />

Padre 1<br />

Padre 2<br />

Si el cliente<br />

más próximo<br />

geográficamente<br />

a 9 es 6<br />

Sub-ruta<br />

Aleatoria<br />

Descendiente<br />

Fig. 3. El operador de cruce utilizado: Generic crossover.<br />

Mutación. La mutación está compuesta por cuatro<br />

tipos de mutaciones distintas que se aplican con<br />

diferentes probabilidades (sólo se aplica una de ellas<br />

en cada caso), igual que en [12]. El uso de estos cuatro<br />

operadores de mutación nos permite modificar<br />

el itinerario de una ruta, mover clientes entre rutas,<br />

y añadir o eliminar rutas, al igual que sucede con<br />

el operador de cruce utilizado. Estos operadores son<br />

(ver Fig. 4):<br />

• Intercambio. Consiste en intercambiar la posición<br />

de dos clientes (pertenecientes a la misma ruta<br />

o no) elegidos aleatoriamente.<br />

• Inversión. Invierte el orden de visita de los clientes<br />

que se encuentran entre dos clientes elegidos alea-

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!