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:
    1. Sphere
    2. Ragistrin
    3. Rosenbrock
    4. Ackley
    5. Booth
    6. Michalewicz
    7. 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.
In [3]:
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:

In [6]:
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¶

In [9]:
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 1
report_specification_EE_11()
Median seed: 17266
Correct median simulation confirmation: 0.0032367217398256215  |  0.0032367217398256215
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función objetivo: Ragistrin¶

In [12]:
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 2
report_specification_EE_11()
Median seed: 46614
Correct median simulation confirmation: 1.0407079309781935  |  1.0407079309781935
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función objtivo: Rosenbrock¶

In [15]:
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 3
report_specification_EE_11()
Median seed: 20728
Correct median simulation confirmation: 0.158794930277116  |  0.158794930277116
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función Objetivo: Ashley¶

In [18]:
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 4
report_specification_EE_11()
Median seed: 14223
Correct median simulation confirmation: 0.22029830175065657  |  0.22029830175065657
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función objetivo: Booth¶

In [23]:
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 5
report_specification_EE_11()
Median seed: 40077
Correct median simulation confirmation: 0.008705529659407477  |  0.008705529659407477
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función objetivo: Michalewicz¶

In [26]:
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 6
report_specification_EE_11()
Median seed: 13837
Correct median simulation confirmation: -1.5528200389656472  |  -1.5528200389656472
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función objetivo: Six camel hump¶

In [29]:
initialIndividual = [-5, 5]
individual = initialIndividual.copy()
functionReference = 7
report_specification_EE_11()
Median seed: 42386
Correct median simulation confirmation: -1.015980547679382  |  -1.015980547679382
No description has been provided for this image
Creating plot...
No description has been provided for this image

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:

In [34]:
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¶

In [37]:
functionReference = 1
report_specification_EE_mu_lambda()
Median seed: 13837
Correct median simulation confirmation: 9.294538898045453e-63  |  9.294538898045453e-63
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función Objetivo: Ragistrin¶

In [46]:
functionReference = 2
report_specification_EE_mu_lambda()
Median seed: 433
Correct median simulation confirmation: 0.0  |  0.0
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función objetivo: Rosenbrock¶

In [49]:
functionReference = 3
report_specification_EE_mu_lambda()
Median seed: 24546
Correct median simulation confirmation: 6.380329311400019e-25  |  6.380329311400019e-25
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función objetivo: Ackley¶

In [52]:
functionReference = 4
report_specification_EE_mu_lambda()
Median seed: 433
Correct median simulation confirmation: 4.440892098500626e-16  |  4.440892098500626e-16
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función objetivo: Booth¶

In [55]:
functionReference = 5
report_specification_EE_mu_lambda()
Median seed: 20728
Correct median simulation confirmation: 0.0  |  0.0
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función objetivo: Michalewicz¶

In [58]:
functionReference = 6
report_specification_EE_mu_lambda()
Median seed: 32845
Correct median simulation confirmation: -1.987951412991358  |  -1.987951412991358
No description has been provided for this image
Creating plot...
No description has been provided for this image

Función objetivo: Six camel hump¶

In [61]:
functionReference = 7
report_specification_EE_mu_lambda()
Median seed: 433
Correct median simulation confirmation: -1.0316284534898774  |  -1.0316284534898774
No description has been provided for this image
Creating plot...
No description has been provided for this image

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.