• No se han encontrado resultados

CAPÍTULO 2. CARACTERÍSTICAS E IMPLEMENTACIÓN DE LOS

2.9 Operadores genéticos

2.9.4 Cruzamiento (crossover)

Este operador produce individuos descendientes a partir de combinar o mezclar el material genético de dos (o más) individuos progenitores escogidos aleatoriamente (intercambio de material genético entre dos cromosomas). La motivación detrás de este operador es que la mezcla de subpartes de los progenitores puede crear nuevos individuos con combinaciones favorables de genes. No pasa nada si se emparejan dos descendientes de los mismos padres; ello garantiza la perpetuación de un individuo con buena puntuación (y, además, algo parecido ocurre en la realidad; es una práctica utilizada, por ejemplo, en la cría de ganado, llamada inbreeding, y destinada a potenciar ciertas características frente a otras). Sin embargo, si esto sucede demasiado a menudo, puede crear problemas: toda la población puede aparecer dominada por los descendientes de algún gen, que, además, puede tener

caracteres no deseados. Esto se suele denominar en otros métodos de optimización

atranque en un mínimo local, y es uno de los principales problemas con los que se

enfrentan los que aplican algoritmos genéticos. La aplicación de la recombinación es controlada por un parámetro (la probabilidad o tasa de cruce). Varios operadores de recombinación han sido propuestos en la literatura. Los más conocidos son los de un punto, dos puntos, múltiples puntos y uniforme. En la recombinación de un punto, un único punto de corte es seleccionado aleatoriamente en los progenitores; luego los segmentos antes y después del punto de corte son intercambiados. La recombinación de múltiples puntos es una generalización de esta idea que introduce varios puntos de corte e intercambia los segmentos entre dichos puntos. En la recombinación uniforme, los segmentos intercambiados se reducen a bits únicos. En lugar de puntos de corte, se sortea aleatoriamente de cual progenitor proviene cada bit. Varios trabajos han comparado el desempeño de los distintos operadores de recombinación, sin embargo, no hay evidencia concluyente sobre cuál es mejor. Es probable que la elección del operador más adecuado sea dependiente del problema.

El intercambio genético:

Figura 2.5. Operador de cruce basado en dos puntos.

Figura 2.6. Operador de cruce uniforme.

Implementación de la función de Cruzamiento

El código es una modificación de la función (crossoverscattered) que viene incorporada dentro de la caja de herramientas de algoritmos genéticos del propio MATLAB. Esto permite aprovechar todas las ventajas de estos códigos así como las mismas constantes y variables de sus funciones sin tener que hacer mucho esfuerzo en su programación.

En el cruzamiento de punto simple o doble, los genomas cercanos tienden a sobrevivir conjuntamente, mientras que genomas que son bien apartados tienden a ser separados. La técnica empleada aquí elimina ese efecto. Cada gen tiene una probabilidad igual de

provenir de cualquier padre. Esto en algunos casos es llamado cruzamiento uniforme o aleatorio.

El código de la función es un poco extenso y tiene numerosas particularidades. La parte de mayor interés se muestra a continuación.

Se hace un ciclo para conformar todos los hijos o individuos descendientes necesarios. Para cada hijo se efectúan las siguientes operaciones:

1. Se halla el co-árbol de ambos padres (Co_Tree_P1 y Co_Tree_P2).

2. Se hallan los puntos de cruzamiento candidatos (crossover_point_candidates). 3. Se escoge un punto de cruzamiento al azar (crossover_point).

4. Se halla la rama que se cerrará en el co-árbol uno (Closed_Branch) correspondiente al punto de cruzamiento seleccionado (crossover_point).

5. Se hallan todas las ramas (loop_branch) del ciclo formado en el padre uno al cerrar la rama del punto de cruzamiento escogido.

6. Se hallan las ramas candidatas a remplazar (replace_branch_candidates) a la rama correspondiente al punto de cruzamiento escogido.

7. Se selecciona al azar una rama a remplazar (replace_branch) del conjunto (replace_branch_candidates).

8. Se forma el primer hijo eliminando del co-árbol uno la rama cerrada (Closed_Branch) y adicionándole la rama a remplazar (replace_branch).

9. Se forma un segundo hijo eliminando del co-árbol dos la rama a remplazar (replace_branch) y adicionándole la rama cerrada (Closed_Branch).

El paso 1 tiene el siguiente código:

% Get parents

r1 = parents(index); index = index + 1;

r2 = parents(index); index = index + 1;

% Get the co-tree of parents

Co_Tree_P1 = find(thisPopulation(r1,:)==0); Co_Tree_P2 = find(thisPopulation(r2,:)==0);

Los pasos 2, 3 y 4 serían:

crossover_point_candidates = setdiff(Co_Tree_P1,Co_Tree_P2);

crossover_point = ceil(length(crossover_point_candidates).*rand(1,1)); Closed_Branch = crossover_point_candidates(crossover_point);

El paso 5 necesita pasar los datos de la red que está siendo reconfigurada a una función que devuelve los elementos del lazo formado:

branch_data = ga_mpc.branch;

branch_data(:,11) = 1;%First Close All lines

branch_data(Co_Tree_P1,11) = 0; %Open lines of Co-Tree Parent One (Co_Tree_P1)

Radial_Net = thisPopulation(r1,:); % Parent 1

[B] = GetBranchsInLoop(Closed_Branch, Radial_Net, branch_data); loop_branch = B;

La función que obtiene los elementos que conforman el lazo al cerrar la rama del punto de cruzamiento se implementa tomando en cuenta un algoritmo de la teoría de grafos.

Los pasos 6 y 7 son:

replace_branch_candidates = intersect(loop_branch,Co_Tree_P2); replace_branch = ...

replace_branch_candidates(ceil(length(replace_branch_candidates).*rand(1, 1)));

La primera línea de código obtiene las ramas candidatas a ser remplazadas como una operación de conjuntos. Estas serían las ramas del ciclo que están conformando parte del co-árbol del padre número dos. Esto equivale al intercepto entre estos dos conjuntos.

Los pasos 8 y 9 viene dados por:

% Interchnage

Co_Tree_Child1 = union(setdiff(Co_Tree_P1,Closed_Branch),replace_branch); Co_Tree_Child2 = union(setdiff(Co_Tree_P2,replace_branch),Closed_Branch);

Este paso de obtención de la descendencia es la aplicación del teorema de Kruskal en la implementación de la reconfiguración de redes eléctricas de distribución.

Solamente quedarían por implementar algunos códigos de chequeo rutinarios que no se expondrán para no oscurecer el algoritmo dado por los pasos anteriores.

El código total se encuentra expuesto en la función reconfig_crossoverscattered que se implementó en el trabajo. El código de la función de cruzamiento tiene numerosos puntos de similitud con la función de mutación como se pudo observar. Es más compleja y extensa la implementación de la función de cruzamiento que la implementación de la función de mutación.

Documento similar