Tema 7
Tema 7
Optimización II
Estrategias de
exploración-explotación
del espacio para
algoritmos genéticos
Índice
Esquema 3
Ideas clave 4
© Universidad Internacional de La Rioja (UNIR)
Tema 7. Esquema
Optimización II
Esquema
3
Ideas clave
Cómo podemos evitar caer en óptimos locales que proporcionen malas soluciones
haciendo una correcta exploración-explotación del espacio.
Algoritmo CHC: una implementación de algoritmos genéticos que lleva a cabo una
exploración-explotación del espacio compensada.
Optimización II
4
Tema 7. Ideas clave
Aplicación de métodos que permitan a los algoritmos genéticos converger en
varios óptimos locales al mismo tiempo.
Es muy importante que los algoritmos bioinspirados guarden una buena relación
exploración-explotación del espacio, pero ¿qué significa esto exactamente? ¿Qué
pasa si esa buena relación no se da? A lo largo de este tema veremos a qué retos se
enfrentan los algoritmos genéticos durante su proceso de exploración y explotación
del espacio de soluciones y qué metodologías pueden utilizarse para salir airosos de
ellos.
Antes de nada, pasemos a ver con más detalle en qué consiste exactamente la
exploración y explotación del espacio.
Exploración
Los espacios de soluciones sobre los que trabajan los algoritmos genéticos pueden
ser muy amplios y la mejor solución puede estar localizada en cualquier parte. Por
tanto, es muy importante que los algoritmos genéticos sean capaces de estudiar y
comprobar soluciones pertenecientes a zonas del espacio que se encuentren muy
distantes entre sí. Gracias a la exploración, podemos ser capaces de encontrar zonas
del espacio prometedoras que nos den resultados de gran calidad.
Optimización II
5
Tema 7. Ideas clave
Figura 1. Espacio de soluciones. Fuente: elaboración propia.
Explotación
Optimización II
6
Tema 7. Ideas clave
En esta función, el mínimo local se localiza en 𝑥 = 0 y, conforme nos alejamos de ese
valor, las soluciones obtenidas son cada vez de mayor magnitud. Por tanto, es muy
importante obtener el óptimo local de una zona determinada ya que, al hacerlo,
podemos mejorar sustancialmente la mejor solución obtenida hasta el momento con
un esfuerzo de búsqueda relativamente bajo.
Definición de óptimo local: el óptimo local es el mejor valor de una zona concreta
del espacio. Puede ser una solución mala si otras zonas del espacio agrupan
soluciones mucho mejores.
Optimización II
7
Tema 7. Ideas clave
Como ya comentamos, encontrar el óptimo global en problemas de gran envergadura
puede llegar a convertirse en una tarea casi imposible. Los algoritmos genéticos y,
globalmente, los algoritmos bioinspirados fueron desarrollados para ser capaces de
encontrar buenas soluciones, aunque estas no fueran el óptimo global del problema.
Sin embargo, para obtener buenas soluciones es necesario configurar los algoritmos
y aplicar técnicas que nos permitan encontrar buenos óptimos locales.
Figura 5. Gráfica de una función objetivo con espacio de búsqueda. Fuente: elaboración propia.
Optimización II
8
Tema 7. Ideas clave
Sin embargo, si se exploran diferentes zonas del espacio, podría fácilmente converger
a cualquiera de los otros óptimos, encontrando el óptimo global o una buena
solución. Este es el motivo por el que una buena exploración del espacio en busca de
zonas prometedoras es crítica para poder obtener buenos resultados.
Si analizamos un poco esta situación, puede verse que la mejor metodología que
puede seguir un algoritmo de optimización para encontrar los mejores resultados en
el menor tiempo posible dentro del espacio de soluciones es el siguiente:
Optimización II
9
Tema 7. Ideas clave
Fase 2 - Explotación del área o mejores áreas encontradas: una vez explorado el
espacio, explotamos las mejores soluciones encontradas con el objetivo de
encontrar el óptimo local de cada una de esas zonas prometedoras. Conforme
vaya avanzando el proceso de explotación, las zonas que demuestren ser las
menos prometedoras se irán descartando y, finalmente, se convergerá al óptimo
local encontrado que proporcione la mejor solución.
Es importante tener en cuenta que el óptimo local final en donde se converge puede
no ser el óptimo global. De hecho, es posible que el óptimo global diste mucho de la
solución encontrada. Sin embargo, el procedimiento descrito permite encontrar
varios de estos óptimos locales y quedarnos con el mejor, con lo que las posibilidades
de encontrar el óptimo global o una buena solución aumentan.
Tal y como hemos podido observar, los algoritmos genéticos convergen a una única
solución, pero ¿y si queremos conocer todos los óptimos locales posibles que tiene
una función? Analizando la estructura de los algoritmos genéticos podemos ver
cómo, aplicando ciertas técnicas, sería posible configurar los algoritmos genéticos
para que encontraran varios óptimos a la vez. A este tipo de problemas se les llama:
problemas multimodales.
Optimización II
10
Tema 7. Ideas clave
Dos factores contrapuestos influyen sobre la efectividad de un AG (algoritmo
genético):
Optimización II
11
Tema 7. Ideas clave
Las soluciones propuestas a estos problemas pueden ser:
Selección elitista.
Cruce uniforme HUX.
Prevención del incesto.
Reinicialización.
Eliminación del operador de mutación.
Optimización II
12
Tema 7. Ideas clave
Selección elitista
Intercambia la mitad de los bits (alelos) en los que los padres difieren. De esta forma,
los hijos siempre son lo más diferente posible de ambos padres, pero, a su vez, se
conservan aquellos valores en que los padres son idénticos. Gracias al cruce uniforme
HUX, se generan nuevas soluciones que permiten una correcta exploración del
espacio de soluciones. Nótese que este tipo de cruce genera hijos muy diferentes
Optimización II
13
Tema 7. Ideas clave
cuando los padres son muy diferentes e hijos más parecidos a los padres cuando estos
son muy parecidos.
Optimización II
14
Tema 7. Ideas clave
Previniendo el incesto, cruzamos padres que se diferencian mucho entre sí y
generamos soluciones muy dispares que nos permiten realizar una correcta
exploración del espacio. Para llevar a cabo este proceso debe definirse el umbral de
cruce, 𝜇, que indica el número de bits en que deben diferenciarse dos soluciones para
ser susceptibles de cruzarse.
Se forman 𝑁/2 parejas con los elementos de la población. Sólo se cruzan las parejas
cuyos miembros difieren en un número determinado de bits (umbral de cruce). El
umbral se inicializa a:
𝜇 ⟻𝜇−1
Optimización II
15
Tema 7. Ideas clave
Reinicialización
El algoritmo CHC carece de operador de mutación. Esto es debido a que, con las
técnicas ya vistas, el componente explorador y explotador del espacio de soluciones
es suficientemente bueno. Por tanto, no es necesario el uso del operador de
mutación que, al no aportar ninguna mejora, solo consumiría un tiempo de cómputo
que puede dedicarse a otras tareas.
Optimización II
16
Tema 7. Ideas clave
Figura 11. Esquema para algoritmo CHC. Fuente: elaboración propia.
Es posible realizar una implementación del algoritmo CHC que trabaje con
información real realizando los siguientes cambios al algoritmo CHC original:
Optimización II
17
Tema 7. Ideas clave
7.4. Problemas multimodales
Los problemas multimodales son aquellos en los que, en vez de querer obtener el
óptimo global de una función, nos interesa obtener la localización de todos los
óptimos locales. Por ejemplo, si buscamos valores máximos en la siguiente función
dentro del intervalo [0,17]:
Entonces podemos observar cómo, en dicho intervalo, los óptimos locales los forman
el conjunto de puntos {3, 7, 12, 15}, siendo 𝑥 = 15 el máximo global. Si utilizamos un
algoritmo genético normal, lo más seguro es que converja a uno de los cuatro
óptimos locales disponibles en vez de encontrarlos todos. Para evitar esto y poder
localizarlos todos, pueden aplicarse diversas técnicas.
Por lo general, las técnicas disponibles pueden clasificarse en dos grandes grupos:
Optimización II
18
Tema 7. Ideas clave
Figura 13. Estrategia secuencial. Fuente: elaboración propia.
Optimización II
19
Tema 7. Ideas clave
Almacenamos la solución obtenida en el vector de soluciones encontradas.
Ejecutamos otro algoritmo genético con la siguiente condición: las soluciones que
sean cercanas a las almacenadas en el vector de soluciones obtienen un bajo valor
de idoneidad.
¿La solución encontrada en esta ejecución del algoritmo genético es muy inferior
a las almacenadas en el vector de soluciones?
• Sí: la solución se descarta.
• No: la solución se almacena en el vector de soluciones encontradas.
Optimización II
20
Tema 7. Ideas clave
Dentro de las estrategias paralelas, las más conocidas son:
Una vez que tenemos los elementos dominantes de cada nicho, realizamos el
proceso de selección utilizando únicamente dichas soluciones.
Optimización II
21
Tema 7. Ideas clave
El método de clearing realiza un proceso similar al de sharing, pero es mucho más
restrictivo, ya que elimina soluciones del proceso de selección en vez de modificar
su valor de idoneidad.
Ejercicio 1
Optimización II
22
Tema 7. Ideas clave
T = numerictype(true,wbits,wbits-ibits); % características de la
representación binaria (true: con signo, wbits: tamaño de la representación,
wbits-ibits: número de bits de la representación dedicados a la parte
fraccionaria)
mp = 0.05; % probabilidad de mutación de un bit
mutat = true; % variable lógica para decidir aplicar mutación
%% ITERACIONES %%
N = 2^2; % tamaño de población
rng('shuffle'); % inicializa el generador de números aleatorios con el reloj
x = D(1)+R*rand(1,N); % población inicial
for i = 1:itersNum
% Seleccionar %
y = double(F(x));
p = y/sum(y);
P = [0,cumsum(p)];
P(end) = 1;
idx = 0:N;
pd = makedist('PiecewiseLinear','x',idx,'Fx',P);
idxs = ceil(icdf(pd,rand([1,N])));
% Cruzar %
b = fi(x(idxs),T);
j = 1;
while j < N
prnt1 = b(j);
prnt2 = b(j+1);
bitcut = randi(wbits-1);
ch11 = bitsliceget(prnt1,wbits,bitcut+1);
ch12 = bitsliceget(prnt1,bitcut,1);
ch21 = bitsliceget(prnt2,wbits,bitcut+1);
ch22 = bitsliceget(prnt2,bitcut,1);
ch1 = bitconcat(ch11,ch22);
ch1 = reinterpretcast(ch1,T);
ch2 = bitconcat(ch21,ch12);
ch2 = reinterpretcast(ch2,T);
b(j) = ch1;
b(j+1) = ch2;
j = j+2;
end
Optimización II
23
Tema 7. Ideas clave
% Mutar %
if mutat
u = rand([N,wbits]);
[row,col] = find(u<mp);
for m = 1:length(row)
bitcplt = bitcmp(bitget(b(row(m)),col(m)));
b(row(m)) = bitset(b(row(m)),col(m),bitcplt);
end
end
% Reemplazar %
x = double(b);
end
% Salida %
[Fmax,imax] = max(double(F(x)));
disp('Mejor solución:');
xmax = x(imax)
fmax = double(f(x(imax)))
min 𝑓(𝑥) = 𝑥 − 4𝑥 + 5
∈ℝ
Sujeto a: −30 ≤ 𝑥 ≤ 30
Optimización II
24
Tema 7. Ideas clave
Solución
Selección: ruleta.
Cruce: binario clásico.
Mutación: por bit.
Reemplazamiento: generacional.
Criterio de paro: número de iteraciones.
Al correr el código tres veces para una población de cuatro individuos, se obtienen
las tres soluciones dadas en las tablas adjuntas. Los resultados son de esperarse: una
población mayor nos entrega una mejor estadística.
Optimización II
25
Tema 7. Ideas clave
Dejando el tamaño de la población en dieciséis y omitiendo la mutación, al ejecutar
tres veces el código tenemos la tabla de la izquierda. Por otro lado, si se repite con
una probabilidad de mutación de 0.25, se obtiene la tabla de la derecha. La mutación
con un tamaño de población adecuado es benéfica para obtener un mejor
refinamiento, aunque, por supuesto, el tiempo de procesamiento y la convergencia
se demoran.
Ejercicio 2
Realice las modificaciones al algoritmo del Ejercicio 1 para que se trabaje con la
representación real, utilizando un operador de cruce BLX − 𝛼 —con 𝛼 igual a 0.5,
una mutación con desviación estándar 𝜎 igual a un tercio del valor de precisión de la
representación— y un reemplazo elitista, manteniendo un cuarto de la población.
Solución
Optimización II
26
Tema 7. Ideas clave
ibits = ceil(log(1+R)/log(2)); % bits para representar parte entera
M = 10000; % partes del dominio
prst = R/M; % precisión o diferencia mínima entre individuos
wbits = ceil(log(1+R/prst)/log(2)); % bits para representar todo el individuo
T = numerictype(true,wbits,wbits-ibits); % características de la
representación binaria
%% ITERACIONES %%
% Cruzar %
Optimización II
27
Tema 7. Ideas clave
pntdiff = pntmax - pntmin;
ubound = pntmax + alp*pntdiff;
lbound = pntmin - alp*pntdiff;
bndrang = ubound - lbound;
ch1 = lbound + bndrang * rand;
ch2 = lbound + bndrang * rand;
xnew(j) = ch1;
xnew(j+1) = ch2;
j = j+2;
end
% Mutar %
% Reemplazar %
ynew = double(F(xnew)); % valores de idoneidad nuevos
[ynews,inews] = sort(ynew,"descend"); % ordena los valores de idoneidad
[ys,is] = sort(y,"descend"); % obten la permutación de índices del
ordenamiento de idoneidad
x = [xnew(inews(1:n)),x(is(1:(N-n)))]; % forma la nueva población
manteniendo la subpoblación élite
x = x(randperm(N)); % mezcla aleatoriamente los individuos
end
% Salida %
[Fmax,imax] = max(double(F(x)));
disp('Mejor solución:');
disp('x = '+string(x(imax)));
disp('f(x) = '+string(double(f(x(imax)))));
Optimización II
28
Tema 7. Ideas clave
Al ejecutar el código en tres ocasiones se obtiene:
Ejercicio 3
Solución
Cruce uniforme HUX: la mitad de aquellos bits en los que difieren los progenitores
se utilizan para un intercambio entre ellos
Prevención del incesto: se define un número mínimo de bits en que deben diferir
los progenitores para que se dé apareamiento, que disminuirá cada vez que el
número de apareamientos sea pequeño.
Optimización II
29
Tema 7. Ideas clave
Se introduce una operación de reinicio de ejecución del código un número de
veces predefinido (cada vez que el umbral de incesto ha llegado a cero y no hay
mejora considerable en el mejor individuo obtenido).
Optimización II
30
Tema 7. Ideas clave
dx = zeros([1,itersNum]); % definición del vector de diferencias
noimprv = 0; % contador de iteraciones sin mejora
nomatingnum = 0; % contador de cruzas no exitosas en una iteración
execount = 0; % contador de reinicializaciones
%% ITERACIONES %%
i = 1;
while i < itersNum && execount < execNum
% Seleccionar %
y = double(F(x)); % valores de idoneidad
p = y/sum(y); % valores de probabilidad de los individuos
P = [0,cumsum(p)]; % probabilidades acumuladas comenzando en cero
P(end) = 1; % asegurar a pesar de la precisión que el último valor es uno
idx = 0:N; % índices para asociar con las probabilidades acumuladas
pd = makedist('PiecewiseLinear','x',idx,'Fx',P); % crear una distribución
de probabilidad
idxs = ceil(icdf(pd,rand([1,N]))); % obtener una muestra de índices según
sea más probables
% Cruzar %
b = fi(x(idxs),T); % representación binaria
nomatingnum = 0; % contador de parejas no cruzadas por incesto
j = 1; % contador de parejas a cruzar
while j < N
pc1 = b(j); % obten el primer progenitor de la lista
pc2 = b(j+1); % obten el segundo progenitor de la lista
chrs = bin(bitxor(pc1,pc2)); % operador XOR sobre los bits de los
progenitores
chrs = chrs(end:-1:1); % ordena la cadena de bits de la comparación igual
que la posición de bits
indxs = 1:wbits; % índices de los bits de una representación
indxs = indxs(chrs == '1'); % índices de las posiciónes de bits diferentes
indxs = indxs(randperm(length(indxs))); % permutación aleatoria de los
índices del paso previo
m = floor(length(indxs)/2); % número de bits diferentes a intercambiar
if length(indxs) > mu % cruza si el número de bits diferentes supera el
umbral de incesto
for k = 1:m % proceso de cruza entre los bits diferentes
bitcplt = bitcmp(bitget(pc1,indxs(k)));
pc1 = bitset(pc1,indxs(k),bitcplt);
Optimización II
31
Tema 7. Ideas clave
bitcplt = bitcmp(bitget(pc2,indxs(k)));
pc2 = bitset(pc2,indxs(k),bitcplt);
end
else
nomatingnum = nomatingnum+1;
end
b(j) = pc1; % sustitución de padres por hijos
b(j+1) = pc2;
j = j+2; % avanza el contador de parejas
end
% Reemplazar %
xnew = double(b); % nueva población obtenida en representación real
ynew = double(F(xnew)); % valores de idoneidad nuevos
[ynews,inews] = sort(ynew,"descend"); % ordena los valores de idoneidad
[ys,is] = sort(y,"descend"); % obten la permutación de índices del
ordenamiento de idoneidad
x = [xnew(inews(1:n)),x(is(1:(N-n)))]; % forma la nueva población
manteniendo la subpoblación élite
x = x(randperm(N)); % mezcla aleatoriamente los individuos
% Mejor solución %
[Fmax,imax] = max(double(F(x)));
xi(i+1) = x(imax);
ofi(i+1) = double(f(x(imax)));
Fi(i+1) = Fmax;
% Incesto %
if nomatingnum > n
noimprv = noimprv+1; % si el número de apareamientos fallidos es mayor al
número de la población elitista se incrementa en uno el contador de
iteraciones que no mejoran la solución obtenida
end
if mu > 0 % si el mínimo número de bits de diferenciación de los padres es
mayor a cero y no ha habido mejora en la solución un número de veces dado
entonces decrementa el umbral de incesto y reinicia el conteo de iteraciones
sin mejora
if noimprv > noimprvNum
mu = mu-1;
noimprv = 0;
Optimización II
32
Tema 7. Ideas clave
end
else % en caso de haber llegado a umbral de incesto cero reinicializa la
ejecución del código
% Reinicialización %
[bestFmax,bestimax] = max(Fi(1:i));
xi(1) = xi(bestimax);
ofi(1) = fi(bestimax);
Fi(1) = bestFmax;
dx = zeros([1,itersNum]);
x(1) = xi(1);
x(2:end) = D(1)+R*rand([1,N-1]);
noimprv = 0;
execount = execount+1;
i = 1;
continue
end
end
Optimización II
33
Tema 7. Ideas clave
Ejercicio 4
Basado en las opciones que pueden elegirse para ejecutar el algoritmo genético de
Optimization Toolbox de MATLAB, proponga modificaciones al pequeño código del
Ejercicio 3, de tal suerte que se privilegie la explotación y convergencia para que,
dada una población en una subzona del dominio, explore solo esa zona y obtenga el
óptimo de ella.
Utilice la versión del algoritmo CHC genético para la representación real del Ejercicio
2. Proponga modificaciones al código de tal suerte que se privilegie la explotación y
convergencia, con la intención de que, dada una población en una subzona del
dominio, explore lo más posible solo esa zona y obtenga el óptimo en ella. Pruebe el
código generando una población inicial en el subdominio [−0.5,0.5] × [0.5,1.5], donde
se sabe, de la exploración de la gráfica, que el mínimo está en el punto (𝑥 = 0,
𝑦 = 1).
Optimización II
34
Tema 7. Ideas clave
Solución
Se pueden apreciar nueve mínimos locales dentro del dominio [−4.5,4.5] y un mínimo
global justo en 𝑥 = 0.
mínimo global. Mientras que, cuando se ejecutó con una población inicial dentro del
subdominio [−4.5, −3.5], se obtuvo (𝑥 = −3.9798, 𝑓(𝑥) = 25.9192), es decir, se
encontró el mínimo local que está más a la izquierda.
Optimización II
35
Tema 7. Ideas clave
De estos resultados se aprecia que el código del Ejercicio 2 tiene un comportamiento
de explotación, exploración y convergencia adecuado para utilizar un método
multimodal paralelo en la búsqueda de soluciones locales con subpoblaciones sobre
diferentes subregiones del dominio.
Ejercicio 5
Donde (𝑥, 𝑦) ∈ ℝ . Esta función cuenta con infinidad de mínimos locales, pero tiene
su mínimo global en (𝑥 ∗ = 0, 𝑦 ∗ = 0) y su valor es evidentemente ras(𝑥 ∗ = 0, 𝑦 ∗ =
0) = 0.
Ejecute, al menos tres veces, el código dentro del dominio de restricción [−30,30]
para ver qué diferencias se observan en las soluciones obtenidas. Vuelva a correr el
código al menos tres veces, ahora en el dominio menor [−3,3] . Por último, grafique
la función en ambos dominios y discuta los resultados.
Solución
Optimización II
36
Tema 7. Ideas clave
y = optimvar("y","LowerBound",-hDSize,"UpperBound",hDSize);
% Construcción del contenedor del problema:
prob = optimproblem("Objective",ras(x,y),"ObjectiveSense","min");
% Inicializa el generador de números aleatorios con el tiempo del reloj:
rng('shuffle');
% Busca la solución en tres ocasiones con el algoritmo genético:
[sol,fval] = solve(prob,"Solver","ga")
[sol,fval] = solve(prob,"Solver","ga")
[sol,fval] = solve(prob,"Solver","ga")
% Grafica:
fsurf(ras,[-hDSize hDSize],"ShowContours","on")
title('Rastrigin in [-' + string(hDSize) + ',' + string(hDSize) + ']^2')
xlabel("x")
ylabel("y")
Al volver a ejecutar el código, esta vez sobre [−3,3] , es decir, haciendo la variable
hDSize = 3, se obtienen las soluciones:
Optimización II
37
Tema 7. Ideas clave
Las gráficas de la función sobre cada dominio se muestran abajo. Se puede ver que,
para el caso del dominio [−30,30] , la cantidad de mínimos entre los que buscar es
mucho mayor que para el dominio [−3,3] ; incluso en la gráfica del primer dominio
apenas se notan los mínimos. Esto hace que al algoritmo le cueste más trabajo
encontrar el mínimo global en [−30,30] que en [−3,3] , lo cual se puede corroborar
con las soluciones encontradas, pues las más precisas fueron del caso [−3,3] . De
hecho, los tiempos de ejecución fueron notablemente menores en este último.
Optimización II
38
Tema 7. Ideas clave
7.6. Referencias bibliográficas
Eshelman, L. J. (1991). The CHC adaptive search algorithm: How to have safe search
when engaging in nontraditional genetic recombination. Foundations of Genetic
Algorithms, 1, 265-283.
https://www.sciencedirect.com/science/article/abs/pii/B9780080506845500203
File:Computational.science.Genetic.algorithm.Crossover.Half.Uniform.Crossover.svg
. (2021, septiembre 11. En Wikimedia Commons.
https://commons.wikimedia.org/wiki/File:Computational.science.Genetic.algorithm
.Crossover.Half.Uniform.Crossover.svg
Optimización II
39
Tema 7. Ideas clave