Reporte 1: Estrategias evolutivas (1+1), (mu + lambda)¶
André Robles Bueckmann¶
En este reporte realizan 2 tipos de estrategias evolutivas (EE) con el propósito de minimizar funciones objetivo:
- EE-(1+1)
- EE-(mu + lambda)
Sobre las cuáles se aplican:
- 500 iteraciones por simulación.
- 20 simulaciones, por estrategia evolutiva (una semilla pseudoaleatoria por simulación).
- 2 variables objetivo.
- 7 funciones prueba por estrategia evolutiva:
- Sphere
- Ragistrin
- Rosenbrock
- Ackley
- Booth
- Michalewicz
- Six Camel Hump
El código para plotting se evita, se llama del módulo "functions".
El output de las siguientes estrategias se presenta como:
- Semilla pseudoaleatoria que generó la simulación de la mediana.
- Confirmar que la simulación seleccionada como la mediana y la reproducción de la mediana para rastrear su mejora es la misma.
- Se presenta un whisker's plot con el mejor individuo de cada simulación (Se enseña el valor dela mediana con 6 cifras significativas).
- Se grafica la mejora continua sobre la función objetivo del mejor individuo.
import numpy as np
from functions import plotting_3D_EE, function_handler, boxPlot
EE-(1+1)¶
La gráfica con la mejora de la trayectoria se traza con el mejor individuo de la simulación que representa la mediana. El código de abajo representa la estrategia evolutiva:
def EE_11(x):
return list(map(lambda i : i + np.random.normal(0, 1), x))
def itr_EE_11():
global individual, itr, functionReference
for i in range(itr):
nIndividual = EE_11(individual)
parent = function_handler(functionReference, individual)
child = function_handler(functionReference, nIndividual)
if child < parent:
individual = nIndividual
return individual
def itr_EE_11_with_history():
global individual, itr, functionReference
history = [individual]
for i in range(itr):
nIndividual = EE_11(individual)
parent = function_handler(functionReference, individual)
child = function_handler(functionReference, nIndividual)
if child < parent:
history.append(nIndividual)
individual = nIndividual
return history
def report_specification_EE_11():
global simulationItr, seeds, individual
topPerformers = []
for i in range(simulationItr):
individual = initialIndividual.copy()
np.random.seed(seeds[i])
bestSimulationIndividual = itr_EE_11()
topPerformers.append(bestSimulationIndividual)
median = int(len(topPerformers)/2)
sortedTopPerformers = sorted(topPerformers, key=lambda x : function_handler(functionReference, x))
sortedTopValues = sorted(list(map(lambda x : function_handler(functionReference, x), sortedTopPerformers)))
medianUnsortedIndex = topPerformers.index(sortedTopPerformers[median])
print("Median seed:", seeds[medianUnsortedIndex])
# Recreate median top performer individual and keep track
np.random.seed(seeds[medianUnsortedIndex])
individual = initialIndividual.copy()
history = itr_EE_11_with_history()
print("Correct median simulation confirmation:", function_handler(functionReference, history[-1]), " | ", function_handler(functionReference, sortedTopPerformers[median]))
boxPlot(sortedTopValues, sortedTopValues[median])
plotting_3D_EE(functionReference, history)
return
seeds = [24546, 5741, 20728, 4218, 12006, 33591, 46614, 40077, 17453, 14223, 433, 42386, 32845, 41432, 17266, 13837, 1219, 13489, 44258, 28384]
simulationItr = 20
itr = 500
Función objetivo: Sphere¶
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 1
report_specification_EE_11()
Median seed: 17266 Correct median simulation confirmation: 0.0032367217398256215 | 0.0032367217398256215
Creating plot...
Función objetivo: Ragistrin¶
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 2
report_specification_EE_11()
Median seed: 46614 Correct median simulation confirmation: 1.0407079309781935 | 1.0407079309781935
Creating plot...
Función objtivo: Rosenbrock¶
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 3
report_specification_EE_11()
Median seed: 20728 Correct median simulation confirmation: 0.158794930277116 | 0.158794930277116
Creating plot...
Función Objetivo: Ashley¶
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 4
report_specification_EE_11()
Median seed: 14223 Correct median simulation confirmation: 0.22029830175065657 | 0.22029830175065657
Creating plot...
Función objetivo: Booth¶
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 5
report_specification_EE_11()
Median seed: 40077 Correct median simulation confirmation: 0.008705529659407477 | 0.008705529659407477
Creating plot...
Función objetivo: Michalewicz¶
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 6
report_specification_EE_11()
Median seed: 13837 Correct median simulation confirmation: -1.5528200389656472 | -1.5528200389656472
Creating plot...
Función objetivo: Six camel hump¶
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 7
report_specification_EE_11()
Median seed: 42386 Correct median simulation confirmation: -1.015980547679382 | -1.015980547679382
Creating plot...
EE-(mu+lambda)¶
La gráfica con la mejora de la trayectoria se traza con el mejor individuo por iteración de la población de la simulación que representa la mediana. El código de abajo representa la estrategia evolutiva:
def EE_mu_lambda(T):
global stDev, population, n, dimensionCount, mu
c = 0.817
childPopulation = list(map(lambda i : i + np.random.normal(0, abs(stDev[-1]), size=n), population))
count = 0
for i in range(len(population)):
if function_handler(functionReference, childPopulation[i]) < function_handler(functionReference, population[i]):
count += 1
else:
continue
tmp_population = population + childPopulation
sorted_Population = sorted(tmp_population, key=lambda x : function_handler(functionReference, x))
population = sorted_Population[:mu]
# regla de exito 1/5
if dimensionCount >= n:
if count/mu > 0.2:
stDev.append(stDev[T-n]/c)
# print("Standard deviation decremented: ", stDev[-1])
elif count/mu < 0.2:
stDev.append(stDev[T-n]*c)
# print("Standard deviaton aumented: ", stDev[-1])
else:
stDev.append(stDev[T-n])
dimensionCount += 1
return
def itr_EE_mu_lambda():
for i in range(itr):
EE_mu_lambda(i)
results = list(map(lambda individual : function_handler(functionReference, individual), population))
minValue = min(results)
minResults = population[results.index(minValue)].tolist()
return minResults
def itr_EE_mu_lambda_with_history():
history = []
for i in range(itr):
EE_mu_lambda(i)
results = list(map(lambda individual : function_handler(functionReference, individual), population))
minValue = min(results)
minIndividual = population[results.index(minValue)]
history.append(minIndividual)
return history
def report_specification_EE_mu_lambda():
global simulationItr, seeds, population, functionReference
globalIndividuals = []
for i in range(simulationItr):
np.random.seed(seeds[i])
population = (np.random.uniform(8, 10, (mu, n))).tolist()
bestSimulationIndividual = itr_EE_mu_lambda()
globalIndividuals.append(bestSimulationIndividual)
median = int(len(globalIndividuals)/2)
sortedTopPerformers = sorted(globalIndividuals, key=lambda x : function_handler(functionReference, x))
sortedTopValues = sorted(list(map(lambda x : function_handler(functionReference, x), sortedTopPerformers)))
medianUnsortedIndex = globalIndividuals.index(sortedTopPerformers[median])
print("Median seed:", seeds[medianUnsortedIndex])
# recreate median top performer individual and keep track
np.random.seed(seeds[medianUnsortedIndex])
population = (np.random.uniform(8, 10, (mu, n))).tolist()
history = itr_EE_mu_lambda_with_history()
historicalValues = list(map(lambda i : function_handler(functionReference, i), history))
print("Correct median simulation confirmation:", function_handler(functionReference, history[-1]), " | ", function_handler(functionReference, sortedTopPerformers[median]))
boxPlot(sortedTopValues, sortedTopValues[median])
plotting_3D_EE(functionReference, history)
return
stDev = [1]
mu =100
n = 2
dimensionCount = 0
Función objetivo: Sphere¶
functionReference = 1
report_specification_EE_mu_lambda()
Median seed: 13837 Correct median simulation confirmation: 9.294538898045453e-63 | 9.294538898045453e-63
Creating plot...
Función Objetivo: Ragistrin¶
functionReference = 2
report_specification_EE_mu_lambda()
Median seed: 433 Correct median simulation confirmation: 0.0 | 0.0
Creating plot...
Función objetivo: Rosenbrock¶
functionReference = 3
report_specification_EE_mu_lambda()
Median seed: 24546 Correct median simulation confirmation: 6.380329311400019e-25 | 6.380329311400019e-25
Creating plot...
Función objetivo: Ackley¶
functionReference = 4
report_specification_EE_mu_lambda()
Median seed: 433 Correct median simulation confirmation: 4.440892098500626e-16 | 4.440892098500626e-16
Creating plot...
Función objetivo: Booth¶
functionReference = 5
report_specification_EE_mu_lambda()
Median seed: 20728 Correct median simulation confirmation: 0.0 | 0.0
Creating plot...
Función objetivo: Michalewicz¶
functionReference = 6
report_specification_EE_mu_lambda()
Median seed: 32845 Correct median simulation confirmation: -1.987951412991358 | -1.987951412991358
Creating plot...
Función objetivo: Six camel hump¶
functionReference = 7
report_specification_EE_mu_lambda()
Median seed: 433 Correct median simulation confirmation: -1.0316284534898774 | -1.0316284534898774
Creating plot...
Observaciones y limitaciones generales¶
- La superioridad de desempeño de la estrategia EE-(mu + lambda) por sobre EE-(1+1) es evidente tanto por la naturaleza de la EE (una población mucho más frecuentemente se va a adaptar y mutará hacia mejores genes que un único individuo) como también con observaciones a los grandes órdenes de magnitud negativos. Sin embargo, el tiempo de cálculo también es un resource-tradeoff a tener en cuenta.
- Los whisker's plot no se expanden en la EE-(mu + lambda) lo suficiente para realmente observar los cuartiles, lo cual se lo atribuyo a:
Datos atípicos, los cuáles en magnitudes sumamente pequeñas pueden expandir la gráfica al punto de hacerla invisible.
Datos con órdenes de magnitud negativo tan minúsculos que no son manejables y comprimen la gráfica haciéndola otra vez invisible.