import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore", category=UserWarning)
Práctica 2: Optimizar función#
Usaremos el paquete Pygad para hallar óptimos de una función diferenciable.
Objetivo#
Hallar el óptimo de la función

Fig. 46 Función de dos variables#
Sabemos que \(f\) tiene un mínimo (local) en el punto \((2,2)\). ¿Cómo?
Vamos a comprobar si el algoritmo genético es capaz de hallar dicho punto.
def fitness_func(ga_instance, solution, solution_idx):
x,y=solution
fvalue = (x-2)**2+(y-2)**2
# maximization problem
return 1/fvalue #attention possible inf
fitness_function = fitness_func
#https://pygad.readthedocs.io/en/latest/README_pygad_ReadTheDocs.html#life-cycle-of-pygad
def on_generation(ga):
print('Generación',ga.generations_completed)
print(ga.population)
def on_start(ga):
print('Starting generation',ga.generations_completed)
print(ga.population)
Librería PyGAD#
pip3 install pygad
conda install pygad
PyGAD es una biblioteca Python de código abierto para construir algoritmos genéticos y con los que optimizar algoritmos de aprendizaje automático.
Entre los problemas de aprendizaje automático que se pueden abordar con un algoritmo genético:
Clustering: Ejemplo 2D y Ejemplo 3D.
También es posible entrenar un modelo de red neuronal para efectuar regresión o una clasificación con un algoritmo genético. (Ver explicación). Los pesos de la red son cromosomas y la función de fitness está conectada con el resultado de la función de pérdida. Para ello PyGAD cuenta con el módulo torchga.
En un algoritmo genético, se comienza con una población inicial de cromosomas, que son posibles soluciones a un problema determinado. Esos cromosomas constan de una serie de genes, que pueden ser bits/ints/floats… También se especifica un rango de valores permitidos (por ejemplo, números enteros del 0 al 9).
Todo el problema de optimización está codificado en una función de aptitud (fitness), que recibe un cromosoma y devuelve un número que indica la aptitud (o bondad) de la solución. Cuanto mayor sea la aptitud, mejor será la solución codificada en el cromosoma.
Luego comienza el bucle. En cada iteración (generación), se selecciona una cantidad de cromosomas buenos para la reproducción (selección de padres). Los padres se combinan de dos en dos (cruzamiento) para generar nuevos cromosomas (hijos). Finalmente, los hijos son mutados modificando de forma un tanto aleatoria parte de sus genes, lo que permite que surjan soluciones completamente nuevas. Los hijos pasan a la siguiente generación y comienza una nueva iteración (En algunos casos, es posible dejar que algunos padres sobrevivan; esto se maneja desde el parámetro keep_parents en PyGAD).
El ciclo se detiene después de un número determinado de generaciones (= iterations) o según un criterio de detención (por ejemplo, no hay mejora durante un tiempo).
Parámetros#
Librería PyGAD de Algoritmos Genéticos
num_generations : número de generaciones.
num_parents_mating : número de padres necesarios para el cruzamiento.
sol_per_pop : número de soluciones (es decir cromosomas) dentro de la población. Este parámetro no tiene efecto si existe el parámetro initial_population.
initial_population: Una población inicial definida por el usuario. Es útil cuando el usuario desea iniciar las generaciones con una población inicial personalizada. El valor predeterminado es None, lo que significa que el usuario no especifica ninguna población inicial. En este caso, PyGAD crea una población inicial utilizando los parámetros sol_per_pop y num_genes. Se genera una excepción si la población_inicial es None mientras cualquiera de los 2 parámetros (sol_per_pop o num_genes) es tambiém None.
num_genes: número de genes en cada solución o cromosoma.
mutation_num_genes: numero de genes a mutar. El valor defecto None significa que ningún número es especificado.
init_range_low: el valor mínimo en el valor de los genes a aplicar en la selección random.
init_range_high: el valor máximo en el valor de los genes a aplicar en la selección random.
parent_selection_type: Tipo de selección de los padres (Parent Selection Methods in PyGAD).
“sss” : Selección de estado estacionario.
“rank” : Selección de rango.
“random” : Aleatoriamente.
“tournament” : Por torneos.
“rws” : Por ruleta.
“sus” : Muestreo universal estocástico.
keep_parents: Número de padres en la siguiente generación.
-1: mantener todos los padres.
0: ningún padre.
>1: número de padres a mantener.
gene_type: Controla el tipo de gen. Se puede asignar a un único tipo de datos que se aplica a todos los genes o puede especificar el tipo de datos de cada gen individual. El valor predeterminado es float, lo que significa que todos los genes son del tipo de datos flotantes. Los tipos que se pueden usar son int, float, y numpy.int/uint/float(8-64). Para definir tipos específicos en cada gen se usa una tupla, lista o numpy.ndarray; (por ejemplo gene_type=[int, float, numpy.int8])
crossover_type: Tipo de operación de cruce. Los tipos admitidos son single_point (para cruce de un solo punto), two_points (para cruce de dos puntos), uniform (para cruce uniforme) y scattered (para cruce disperso). El cruce disperso es compatible con PyGAD 2.9.0 y superiores. El valor predeterminado es single_point.
mutation_type: Tipo de operación de mutación. Los tipos admitidos son random (para mutación aleatoria), swap (para mutación de intercambio), inversion (para mutación por inversión), scramble (para mutación codificada) adaptive (para mutación adaptativa) y None (no se aplica mutación). Por defecto es random.
mutation_percent_genes: Porcentage de genes a mutar. El valor por defecto es default que indica un 10%. Se debe indicar, si no, un valor > 0 y <=100.
Tipos de selección de padres#
La selección de padres hace referencia al modo en como se eligen los individuos de una generación para cruzarse y dar lugar a los individuos de la siguiente generación.
Steady-state selection (sss, default) : En un algoritmo genético de estado estacionario, sólo se reemplazan unos pocos individuos a la vez, lo que significa que la mayoría de los individuos pasarán a la siguiente generación; no hay generación per se.
Roulette wheel selection (rws): La selección de rueda de ruleta es un algoritmo de selección proporcional de aptitud (FPS), una de las formas más populares de selección de padres. Cada individuo puede convertirse en padre con una probabilidad proporcional a su aptitud. La elección de un individuo se puede representar como hacer girar una ruleta que tiene tantas casillas como individuos en la generación actual, con tamaños que dependen de su probabilidad. Por tanto, no existe una garantía sólida de “supervivencia del más fuerte”: los buenos candidatos pueden ser eliminados, mientras que los peores pueden sobrevivir. Cada vez que es necesario seleccionar a un padre, se hace girar la rueda, lo que significa que un individuo puede ser seleccionado varias veces, y los más aptos tienen un fuerte sesgo.
Stochastic universal sampling selection (sus): La Selección de muestreo universal estocástico es una selección proporcional de aptitud insesgada y tiene una dispersión mínima. Se utiliza la misma ruleta que en RWS, con las mismas proporciones, pero en lugar de usar un único punto de selección y girar la ruleta una y otra vez hasta que se hayan seleccionado todos los individuos necesarios, aquí se seleccionan todos los padres a la vez. Para ello, la rueda se hace girar sólo una vez y múltiples puntos de selección espaciados uniformemente alrededor de la rueda determinan qué individuos se sortean. Esto da a los miembros más débiles de la población (según su aptitud) la oportunidad de ser elegidos, y también anima a los más aptos a ser elegidos al menos una vez.
Rank selection (rank): La selección de rango es útil cuando la población tiene valores de aptitud muy cercanos. En este caso, usar una ruleta (RWS, SUS) significaría que todos los individuos tendrían básicamente la misma probabilidad de ser elegidos… Entonces, la idea es basar las probabilidades no en el valor de aptitud en sí, sino en el rango del individuo. Es decir, primero clasificamos a los individuos del valor de aptitud más alto al más bajo (i = 1..N), asignamos las probabilidades de ser elegidos en función de la suma de los valores de aptitud / i y finalmente hacemos girar la rueda. Tenga en cuenta que esto sería una selección de rango lineal: los rangos están en una progresión lineal. Existen otros esquemas de selección de rango, por ejemplo, exponencial.
Random selection (random): Los padres se seleccionan aleatoriamente de la población, sin importar su aptitud.
Tournament selection (tournament): La selección por torneo funciona seleccionando K individuos (tamaño del torneo) al azar (torneo) y escogiendo al más apto de ellos (el ganador) para la reproducción. La presión de selección depende de K: cuanto mayor sea K, más fuerte será la presión, ya que los individuos más débiles tendrán más adversarios y, por tanto, mayores posibilidades de perder. En PyGAD, el tamaño del torneo está controlado por el parámetro K_tournament.
Tipos de cruce#
Cruce por 1 punto: Se toma un punto aleatorio en los dos padres, quedando divididos ambos en cola y cabeza. Las colas se separa para dar forma a los hijos:

Cruce por 2 puntos: Se toman 2 puntos de corte sin que ninguno coincida con los extremos y entre sí, para que se formen 3 segmentos en cada cromosoma padre. Para generar los hijos se escoge el segmento central de uno de los padres y los segmentos laterales del otro padre:

Cruce uniforme: Se lanza una moneda para decidir si cada gen se deja intacto o se toma del otro padre. En otras palabras, cada gen se elige de cualquiera de los padres con la misma probabilidad. La técnica se repite para cada nuevo hijo. En algunas librerías (pero no en PyGAD), es posible sesgar la moneda hacia uno de los padres, lo que hace que los hijos hereden más de él.

Cruce disperso: Cada gen se elige aleatoriamente entre los dos padres. En el cruce disperso, se genera un vector binario aleatorio del tamaño de los cromosomas. Los genes del nuevo hijo se toman de uno de los padres cuando su índice en el vector binario es igual a 0 y del otro padre cuando es igual a 1:

Tipos de mutación#
random (predeterminado): se asigna un valor aleatorio del conjunto de valores permitidos a un gen elegido al azar.
swap: Intercambio, se seleccionan dos genes al azar y se intercambian sus valores.
inversion : Inversión, se selecciona una secuencia consecutiva de genes y se invierten sus valores.
scramble: Mezcla, como en el caso de la inversión, se selecciona una secuencia consecutiva de genes, pero esta vez sus valores se mezclan aleatoriamente.
adaptive: Adaptativo, aplica una serie de mutaciones aleatorias relativas a la aptitud del individuo. Es decir, los hijos con un valor de aptitud alto sufrirán menos mutaciones que los hijos con valores de aptitud bajos. Las variaciones reales están bajo control, especificando un límite inferior y superior en lugar de un valor único para mutación_num_genes/mutation_probability/mutation_percent_genes (consulte Uso de mutación adaptativa en PyGAD). La idea detrás de esto es sencilla: alterar los cromosomas buenos tiene una alta probabilidad de degradarlos, y viceversa.
num_generations = 25
# num_parents_mating: Number of solutions to be selected as parents.
# número de padre
num_parents_mating = 4
# sol_per_pop: Number of solutions (i.e. chromosomes) within the population.
#This parameter has no action if initial_population parameter exists.
sol_per_pop = 20
#num_genes: Number of genes in the solution/chromosome.
#This parameter is not needed if the user feeds the initial population to the initial_population parameter
num_genes = 2
# mutation_num_genes=None: Number of genes to mutate which defaults to None meaning that no number is specified.
mutation_num_genes = 2
#init_range_low=-4: The lower value of the random range from which the gene values
#in the initial population are selected.
#init_range_low defaults to -4.
init_range_low=-10
init_range_high=10
#https://pygad.readthedocs.io/en/latest/pygad.html#parent-selection-methods
parent_selection_type= "sss"
#keep_parents=-1: Number of parents to keep in the current population.
#-1 (default) means to keep all parents in the next population.
#0 means keep no parents in the next population.
#A value greater than 0 means keeps the specified number of parents in the next population.
#Note that the value assigned to keep_parents cannot be < - 1
#or greater than the number of solutions within the population sol_per_pop.
keep_parents = 1
#https://pygad.readthedocs.io/en/latest/README_pygad_ReadTheDocs.html#data-type-for-all-genes-without-precision
gene_type=float
#https://pygad.readthedocs.io/en/latest/README_pygad_ReadTheDocs.html#supported-crossover-operations
crossover_type = "single_point"
#https://pygad.readthedocs.io/en/latest/README_pygad_ReadTheDocs.html#supported-mutation-operations
mutation_type="random"
# mutation_percent_genes="default": Percentage of genes to mutate.
#It defaults to the string "default" which is later translated into the integer 10
#which means 10% of the genes will be mutated.
#It must be >0 and <=100.
#Out of this percentage, the number of genes to mutate is deduced
#which is assigned to the mutation_num_genes parameter.
mutation_percent_genes = 10
Definición del algoritmo genético#
import pygad
ga_instance = pygad.GA(num_generations=num_generations,
sol_per_pop=sol_per_pop,
num_parents_mating=num_parents_mating,
fitness_func=fitness_function,
num_genes=num_genes,
mutation_num_genes=mutation_num_genes,
init_range_low=init_range_low,
init_range_high=init_range_high,
parent_selection_type=parent_selection_type,
gene_type=gene_type,
keep_parents=keep_parents,
crossover_type=crossover_type,
mutation_type=mutation_type,
mutation_percent_genes=mutation_percent_genes,
save_solutions=True,
on_generation=on_generation,
on_start=on_start)
Llamada a la optimización#
ga_instance.run()
Show code cell output
Starting generation 0
[[ 0.75083061 -9.70509238]
[-5.01688456 -9.14293253]
[-0.36107762 0.34850423]
[-1.51829218 -7.02738053]
[ 6.08002096 -1.51167547]
[-9.2112312 7.23897529]
[-8.35450931 -9.43294194]
[ 8.15007613 -9.87311174]
[-6.2759327 1.35851669]
[-3.47021455 -3.17204593]
[-6.83919724 3.42731285]
[-7.86206762 3.24274476]
[ 5.4693332 0.96831895]
[ 0.69095885 -0.78447015]
[ 9.86109439 0.66430977]
[-0.89973494 4.7063791 ]
[ 5.99262731 4.31480133]
[-7.40442129 2.51313812]
[ 0.72114882 3.93078761]
[-8.38250305 4.89378553]]
Generación 1
[[ 0.72114882 3.93078761]
[ 0.96653596 -0.06326049]
[-0.99190734 -1.03849008]
[ 6.37662921 0.32198827]
[ 0.75336913 4.20289754]
[-0.97036512 -0.53066829]
[-1.20458769 -0.4333837 ]
[ 0.62930128 0.15595299]
[ 0.13930815 3.68416104]
[-0.32435725 0.52199117]
[ 0.31883091 -1.42725271]
[ 1.13621173 0.90306585]
[ 4.59529915 3.09167615]
[ 1.39912626 0.96268959]
[-0.20276526 -1.69137747]
[-0.22877882 1.17441756]
[ 1.36034758 3.12993146]
[-0.14215992 0.83959332]
[ 1.65539755 -1.28928417]
[ 5.86094334 1.1323855 ]]
Generación 2
[[ 1.39912626 0.96268959]
[ 0.56940084 3.22159839]
[ 1.28565455 0.05443828]
[ 1.05158126 -0.20817998]
[ 0.80131032 0.92661331]
[ 0.88084747 3.93847393]
[ 1.04538911 1.62622283]
[ 2.06341328 0.1178882 ]
[ 1.15821492 0.68658805]
[ 2.1423807 2.23499553]
[ 1.96681717 1.07059952]
[ 0.38190863 0.97347114]
[ 1.13982543 1.26431393]
[ 1.28544619 3.75455577]
[ 2.25355757 -0.04882452]
[ 0.84372257 0.53387738]
[ 0.08916151 0.26924865]
[ 2.01473254 3.72771886]
[ 1.22088447 0.72223272]
[ 0.09804154 0.95374051]]
Generación 3
[[2.1423807 2.23499553]
[2.77749824 1.02153426]
[1.03251166 1.32882626]
[1.28569822 1.66272268]
[2.38761541 1.7765525 ]
[1.765041 0.69457414]
[0.33327779 2.3435376 ]
[0.13991276 0.56251994]
[1.96064136 3.22081125]
[2.40637911 0.39979239]
[1.17458539 1.19469567]
[1.55171111 0.29216463]
[1.74340827 2.40041704]
[1.75465153 1.87839039]
[2.88689068 1.54199094]
[0.56645039 0.33937285]
[2.56155231 1.66513619]
[2.64725074 1.25582953]
[1.84790009 2.26256535]
[0.34053939 0.4846353 ]]
Generación 4
[[1.75465153 1.87839039]
[2.28857914 3.12012863]
[1.14571587 1.61929303]
[1.66740233 1.5728519 ]
[1.77567287 2.63412946]
[1.22717393 2.92448875]
[2.39582817 1.73316104]
[2.68158899 2.52516139]
[2.16152138 2.69457907]
[0.85083559 2.64198902]
[1.42065393 2.78210819]
[2.2357478 2.29401406]
[2.02639628 1.14411063]
[0.87003552 2.30426129]
[1.64577388 1.87119802]
[2.15307469 2.26867642]
[1.44712142 2.07023705]
[2.05113631 2.11760478]
[1.21696404 1.27621324]
[2.00550309 2.36267868]]
Generación 5
[[2.05113631 2.11760478]
[1.69389863 1.89859446]
[1.87177692 1.31867401]
[2.47838957 2.36727301]
[1.80330572 2.67985679]
[2.80362329 2.00891775]
[1.85059951 2.76697376]
[1.7317837 3.2811066 ]
[1.90677898 2.26684376]
[2.19457204 1.668382 ]
[2.22610013 1.39128433]
[1.39340807 1.48040546]
[2.26807582 1.52001684]
[1.96114625 1.32189943]
[2.17060963 1.72099109]
[2.39955139 1.55879337]
[2.83972483 2.43934239]
[1.8209896 2.16931847]
[1.85897207 1.80559724]
[1.54807048 1.93510468]]
Generación 6
[[2.05113631 2.11760478]
[2.49528986 1.0570129 ]
[1.82537681 2.26017919]
[1.08617237 2.65397855]
[1.75817703 2.08556135]
[1.99569532 1.61989526]
[2.34167695 1.69458363]
[1.2596307 1.6923388 ]
[1.08559876 2.86186045]
[1.16528189 2.5097679 ]
[1.08563615 1.30800591]
[1.18925871 1.71631915]
[2.3709746 2.85278996]
[2.22110546 1.51302991]
[1.6613302 1.5593536 ]
[0.9544993 1.93020205]
[2.8081428 2.26885572]
[2.18421454 1.33529004]
[1.41346219 2.60572174]
[1.4578435 1.40722929]]
Generación 7
[[2.05113631 2.11760478]
[2.52853578 2.49302043]
[2.19672588 2.49558099]
[1.66509493 2.22167389]
[1.94066806 1.80533123]
[2.38130004 3.0269156 ]
[1.17975163 2.6722306 ]
[1.78111909 0.96471847]
[1.96954789 1.46733643]
[2.42586163 1.78738712]
[2.73251531 2.75158241]
[2.25933126 1.08428339]
[2.5227143 2.5762862 ]
[1.97398246 2.27786427]
[0.81507384 1.41896076]
[1.77073634 1.07693543]
[2.52047643 2.63123311]
[2.75948551 1.84685703]
[1.04486631 1.71981958]
[1.54007079 0.9442671 ]]
Generación 8
[[2.05113631 2.11760478]
[1.1581882 1.29347663]
[2.01868126 2.30637489]
[1.23715467 2.50709302]
[1.08945391 1.3547192 ]
[1.322485 1.77292214]
[2.42691764 1.51930973]
[2.62578855 3.2080752 ]
[1.51926614 2.70394599]
[2.76896069 2.80122364]
[1.68133262 1.56900127]
[2.19842985 1.24676661]
[2.33267563 2.14921352]
[3.02724983 1.57896615]
[1.07456897 1.32111631]
[1.77789035 1.22517304]
[2.68388441 1.53009169]
[2.74226371 2.15654121]
[1.15826316 2.33237658]
[0.95603444 1.43091199]]
Generación 9
[[2.05113631 2.11760478]
[2.46595413 2.20832942]
[1.13962434 1.70101302]
[2.19379814 2.45528409]
[2.64185243 1.66472253]
[2.6007845 1.77933991]
[3.28797617 1.6784612 ]
[2.42437998 1.40835019]
[2.86601513 2.58758365]
[2.29074455 1.79233816]
[2.92550279 1.90453015]
[2.56075414 2.18517068]
[1.13692328 1.34704043]
[2.68452577 1.48039759]
[2.8322671 2.74265224]
[2.65642446 1.82186045]
[2.63198702 1.48053954]
[2.59534534 2.09945342]
[2.03029622 2.06898185]
[1.56135157 2.42018277]]
Generación 10
[[2.03029622 2.06898185]
[2.24177917 1.98097602]
[2.49182392 1.65423363]
[1.96478409 1.68135663]
[1.21319068 3.02904188]
[1.79806987 2.98889095]
[2.45544488 1.80123553]
[3.27710048 1.4996062 ]
[2.32887022 1.37939684]
[2.93229193 1.65938501]
[1.94854592 1.54218749]
[1.97439661 2.07440561]
[1.56179133 1.22302253]
[1.61560726 1.41876999]
[2.87601704 1.07644135]
[1.84457179 2.734776 ]
[3.00474153 2.48262278]
[2.99810697 1.79110778]
[2.69817228 1.00626426]
[3.25302671 1.67910842]]
Generación 11
[[2.03029622 2.06898185]
[1.87853096 3.05928721]
[2.43511702 2.30702749]
[1.63481638 2.51851911]
[2.78700742 1.65927998]
[1.13595324 1.84772081]
[2.77043131 1.93242388]
[2.81868459 1.11009726]
[1.44468456 1.42524408]
[2.55823714 1.82883047]
[2.77064249 1.05534401]
[2.19019505 1.83421901]
[1.63061466 1.46226999]
[2.8876065 2.9427098 ]
[2.043899 2.80284581]
[0.99290599 1.49091113]
[1.49572431 1.91166048]
[1.08255325 1.38337331]
[2.93591406 0.98245678]
[1.11824258 1.65334096]]
Generación 12
[[2.03029622 2.06898185]
[2.42453777 2.46466594]
[2.03362888 1.03776177]
[2.4620461 1.32044686]
[2.82797773 2.76251711]
[1.87834952 2.69208343]
[2.40295262 2.24244038]
[1.19096193 2.20120042]
[1.62628247 1.22285569]
[1.66702846 1.76360172]
[1.8713372 2.63996208]
[1.07633858 1.4988972 ]
[1.67562228 1.28079736]
[2.17589974 1.62011609]
[0.55197991 2.76858942]
[3.3053955 2.49995853]
[2.69525117 1.83258921]
[1.87871299 2.4523069 ]
[2.26366253 1.36617355]
[1.88735781 3.29914629]]
Generación 13
[[2.03029622 2.06898185]
[0.8298815 2.40493716]
[1.40037447 2.41226255]
[2.87812659 3.29122397]
[1.91587215 2.38386742]
[0.91455941 1.39352943]
[2.41107774 1.86371169]
[2.91021244 3.24265455]
[2.6153689 1.32674345]
[2.73297772 2.69076599]
[2.20624668 0.62136174]
[2.03915372 1.53872993]
[2.57808479 2.00348932]
[1.1353404 2.53161533]
[2.83600093 2.14726913]
[2.72689885 1.85449044]
[1.5352932 2.87136839]
[1.96621754 1.84899912]
[2.6682349 1.94544095]
[2.83772664 2.11043365]]
Generación 14
[[2.03029622 2.06898185]
[2.86386018 1.93329387]
[1.1398638 2.52946993]
[2.71425562 2.18094425]
[2.061365 2.88690531]
[1.03691562 1.70048161]
[1.20680479 3.09974225]
[2.82541069 1.87454171]
[1.91544546 2.24041464]
[2.85728062 1.28774745]
[2.62887317 2.53202191]
[2.23539026 1.08085013]
[3.15509461 2.2904741 ]
[2.89036239 2.11643607]
[1.49002481 2.42843542]
[1.44889536 2.38037235]
[2.68217511 2.92078497]
[2.81090029 2.07401665]
[2.7424207 1.57681242]
[1.9139648 2.57689037]]
Generación 15
[[2.03029622 2.06898185]
[2.06471978 1.82979711]
[2.52694441 2.83763368]
[1.90739634 1.7722207 ]
[0.95129114 1.6882327 ]
[2.03267866 2.65406513]
[1.5940998 2.499286 ]
[1.45650416 2.55174943]
[2.23856961 2.03107083]
[1.288793 1.87332826]
[2.64370698 2.19969838]
[1.28813472 3.26244575]
[1.15816441 1.54679395]
[1.17360409 2.8708916 ]
[0.98200608 2.4914515 ]
[0.6482259 3.06881019]
[2.06978833 2.50931233]
[1.97284096 1.30485684]
[2.59068347 1.79567157]
[1.67998728 2.53200128]]
Generación 16
[[2.03029622 2.06898185]
[1.10297798 2.62296559]
[2.23001427 2.91318481]
[0.92640624 2.33224751]
[2.57732573 1.73572207]
[2.56799264 2.2680478 ]
[1.84440151 2.68745763]
[1.85847489 2.69646118]
[2.43550489 1.40423575]
[1.67259801 0.89293905]
[2.8824552 2.02228974]
[1.73750987 1.0940422 ]
[2.80415588 1.40589771]
[1.63573955 2.58885644]
[2.06842784 1.45506994]
[1.54577682 1.34415359]
[1.73076741 1.79021282]
[2.3221108 1.6955251 ]
[1.21207583 1.10115225]
[1.59053242 1.45258683]]
Generación 17
[[2.03029622 2.06898185]
[2.10743298 1.59299048]
[3.06362654 0.93144703]
[2.46869092 2.42901245]
[1.34751151 2.44290007]
[1.7915597 1.06830146]
[1.97039323 2.45842648]
[1.69310869 2.2516476 ]
[1.53242143 2.11653326]
[1.68988135 1.53616572]
[2.21350126 2.29412604]
[2.41600516 0.47627027]
[2.0282519 2.02512142]
[1.20375304 2.14656408]
[2.93911253 2.11020002]
[1.25136838 1.73593159]
[2.1332873 2.9752458 ]
[1.38546525 2.09312041]
[1.77800303 1.15813866]
[2.84604172 0.45577809]]
Generación 18
[[2.0282519 2.02512142]
[1.52891542 2.49162923]
[1.50025282 2.21242057]
[1.5070319 1.42453537]
[1.90513857 2.38310771]
[2.60398042 2.6700857 ]
[2.32196609 2.45734879]
[1.23025511 2.98290873]
[1.66981788 1.78551075]
[2.93117781 1.73164821]
[1.4976621 1.71721686]
[1.31361813 2.23707924]
[0.99990868 1.45643492]
[1.26768954 1.5938357 ]
[2.57975586 2.81651927]
[2.36475406 2.28963092]
[2.67824619 2.99138098]
[1.15501126 2.06975402]
[2.04584742 2.459232 ]
[1.63281114 2.3561757 ]]
Generación 19
[[2.0282519 2.02512142]
[0.80000078 2.21034525]
[1.31487392 3.36511137]
[2.17946773 3.12385178]
[1.13844233 2.14552277]
[2.15581447 1.80138929]
[1.48655637 2.92115549]
[1.54115712 3.22957842]
[1.1767403 1.75003991]
[1.69630603 2.35042023]
[1.2985639 2.72226945]
[1.37071102 1.47711999]
[2.93468114 1.42296999]
[1.23340285 2.58834058]
[1.25434594 1.8238421 ]
[1.52823805 1.51769449]
[2.82963507 1.94883899]
[2.04683869 2.7122006 ]
[2.55152205 3.14838045]
[1.34887723 2.58198956]]
Generación 20
[[2.0282519 2.02512142]
[2.31508545 1.84157117]
[1.12042583 1.59567985]
[0.64951445 2.26874346]
[2.61852523 2.04461534]
[2.13818207 2.26032989]
[1.55983908 2.56303113]
[0.98068267 0.97881568]
[2.39142951 1.2646643 ]
[2.5709344 0.99689343]
[2.36103656 2.35091971]
[2.57276935 1.44958634]
[1.1058219 2.03822717]
[2.28214423 2.34786843]
[1.00966861 1.95172322]
[2.33308063 1.30239764]
[0.87347303 1.31362488]
[3.14201125 1.1515221 ]
[0.78354535 1.97186912]
[1.600683 1.02788859]]
Generación 21
[[2.0282519 2.02512142]
[1.26965658 1.78087543]
[2.4408023 1.3408413 ]
[2.20943057 3.17380676]
[2.42154272 1.75938305]
[1.78367909 1.44488086]
[2.98379062 1.5984831 ]
[2.05629126 2.12469046]
[2.72111955 2.19836858]
[2.63061355 2.36788528]
[2.55528089 0.94866879]
[3.18332788 2.15324133]
[2.30545932 2.53373132]
[2.37997892 2.6276723 ]
[2.60712054 2.36190793]
[2.39075769 2.33818293]
[3.06415071 2.52494958]
[2.54194243 1.66166999]
[1.83476994 2.50480575]
[2.7541059 1.53639185]]
Generación 22
[[2.0282519 2.02512142]
[2.96780565 2.60243819]
[2.0283059 2.66382333]
[2.27363243 2.31579172]
[2.03706498 1.28400616]
[1.37536402 1.72529275]
[2.83257139 2.36101724]
[3.36846051 2.67900172]
[1.83961196 2.2214127 ]
[1.80143088 2.48399754]
[1.6359821 1.56877574]
[2.92630016 2.29010513]
[1.37759659 1.69731293]
[1.20029537 1.95236604]
[2.25786748 1.00490893]
[2.62122338 1.59046419]
[2.63388598 1.60200063]
[2.82514828 2.04626231]
[3.1116947 1.39148623]
[2.04626587 2.30963796]]
Generación 23
[[2.0282519 2.02512142]
[1.56676937 1.80814028]
[1.70837165 1.92068649]
[1.05603142 2.20197044]
[1.16239421 2.4757437 ]
[2.5412361 1.65166378]
[1.00985528 1.63599276]
[2.20963232 1.41289709]
[2.84378766 1.32349312]
[1.18948077 2.09364086]
[2.42621329 2.08173783]
[1.37507191 2.58394994]
[1.23229402 1.77312113]
[2.26051801 1.44225988]
[1.10224877 1.6126159 ]
[2.98937112 2.16042109]
[2.64748649 1.56505217]
[1.51321045 2.77972631]
[2.32584469 2.69096078]
[2.5896832 2.51329652]]
Generación 24
[[2.0282519 2.02512142]
[2.66332456 2.34218379]
[2.40700949 2.88515489]
[1.51959634 0.84047666]
[1.56634797 2.58475236]
[1.09983589 0.95830858]
[1.53855735 2.46247376]
[1.29264393 1.31385554]
[1.5150363 1.61439505]
[2.97293742 2.1983896 ]
[1.92385186 1.34489185]
[2.11203468 2.66630328]
[1.25211494 2.60547501]
[1.84178041 1.85982408]
[2.50639555 2.33942254]
[2.44855698 1.99177099]
[2.20041502 1.79257942]
[1.7294464 2.65723216]
[2.29203769 1.2307337 ]
[2.33578122 1.9496825 ]]
Generación 25
[[2.0282519 2.02512142]
[1.44491087 2.42573531]
[0.93856531 1.751696 ]
[1.51395113 2.8678479 ]
[2.68507804 2.50357968]
[2.70761281 1.24021875]
[1.40110453 1.32582378]
[2.06370886 1.47555476]
[2.24804393 2.53538137]
[2.69648705 1.18820084]
[1.66746888 1.73824661]
[1.78373854 2.23596234]
[1.78873945 1.93160976]
[1.00602274 1.18507402]
[2.80352367 1.29358788]
[2.96049313 2.61660469]
[1.40705627 1.56654282]
[2.05311717 2.75249048]
[1.0183345 1.2172174 ]
[2.39396196 2.62119697]]
Resultados#
solution, solution_fitness, solution_idx = ga_instance.best_solution()
print("best_solution: {solution}".format(solution =solution))
best_solution: [2.0282519 2.02512142]
print("best_solution fitness: {}".format(solution_fitness))
print("Valor de f: {}".format(1/solution_fitness))
best_solution fitness: 699.6649572044541
Valor de f: 0.0014292555168055714
solution_idx
0
Parámetros de plot_fitness#
title : título.
xlabel : etiqueta eje x.
ylabel : etiqueta eje y.
linewidth : ancho de la línea.
font_size : tamaño del fuente.
plot_type : “plot”, “scatter”, “bar”.
color : color.
label : etiqueta de la serie. Para un uso multiobjetivo
save_dir : Directorio donde guardar el gráfico.
ga_instance.plot_fitness(plot_type="plot", title="Minimización de una función con PyGAD",
linewidth=5, xlabel="Generación", ylabel="Aptitud", color="blue")
plt.close()
No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.

ga_instance.plot_genes(plot_type="scatter")
plt.close()

ga_instance.population
array([[2.0282519 , 2.02512142],
[1.44491087, 2.42573531],
[0.93856531, 1.751696 ],
[1.51395113, 2.8678479 ],
[2.68507804, 2.50357968],
[2.70761281, 1.24021875],
[1.40110453, 1.32582378],
[2.06370886, 1.47555476],
[2.24804393, 2.53538137],
[2.69648705, 1.18820084],
[1.66746888, 1.73824661],
[1.78373854, 2.23596234],
[1.78873945, 1.93160976],
[1.00602274, 1.18507402],
[2.80352367, 1.29358788],
[2.96049313, 2.61660469],
[1.40705627, 1.56654282],
[2.05311717, 2.75249048],
[1.0183345 , 1.2172174 ],
[2.39396196, 2.62119697]])