Documentación automática¶
Módulos generales¶
Optimizar¶
Clase para utilizar como un modulo de optimizacion, los problemas se deben definir en la carpeta Problemas, cada problema debera tener definida dos clases, una generica para poder extraer las funciones del problema en orden y una clase que define al problema, el nombre del archivo debera ser igual al nombre de la clase que define al problema, esta segunda condicion tambien es necesaria para el caso de los algoritmos, los cuales se deben definir en la carpeta Algoritmos y mantener una estructura aproximada a los algoritmos ya definidos.
Algoritmos:
- “AFSA”
- “GA”
*Nota 1: En la carpeta config_files se pueden modificar los parametros para cada algoritmo, en la misma carpeta se pueden encontrar ejemplos para cada algoritmo.
*Nota 2: A la hora de cargar los parametros del GA, se deben escoger los operadores geneticos adecuadamente segun el tipo de problema, i.e., si el problema es combinatorio o si es continuo.
Ejemplos:
- Para problemas combinatorios:
- ga_operators=(“proportional_selection”,”ordered_crossover”,”swap_mutation”,”elitism”)
- Para problemas continuos:
- ga_operators=(“proportional_selection”,”heuristic_crossover”,”continuous_mutation”,”elitism”)
Problemas:
Combinatorios:
- “TSP” -> Travelling salesman problem
- “Nqns” -> N queens
*Nota 3: vector_len debe ser > 1, pues indica el numero de ciudades o reinas.
Continuos:
- “Ackley” -> Funcion Ackley
- “Rosenbrock” -> Funcion Rosenbrock
- “Rastrigin” -> Funcion Rastrigin
*Nota 4: Para dimension=3, se graficá la superficie en 3D, se recomienda un size_space bajo no mayor de 30 para apreciar mejor la grafica.
-
class
Optimizar.
Optimizar
[fuente]¶ Clase para definir al “modulo” Optimizar
-
procesar
(fitness_data: List[float], best_finded: object, metrica: int, algoritmo: str) → None[fuente]¶ Funcion de uso opcional, se utiliza para graficar la evolucion del fitness, especialmente util para comparar varios algoritmos, ver ejemplo en Ejecucion_multiple.py
Parámetros: - fitness_data – Lista con la evolucion del fitness.
- best_finded – Objeto con la mejor solucion encontrada, actualmente sin uso.
- metrica – Unidad metrica para el eje de las X, actualmente iteraciones * poblacion.
- algoritmo – Nombre del algoritmo para la leyenda.
Devuelve: None
-
static
set_algorithm
(class_object: str) → Tuple[Callable, str][fuente]¶ Funcion para establecer el algoritmo a utilizar, esta funcion puede ser llamada varias veces para instanciar varios algoritmos.
Parámetros: class_object – Nombre de la clase que define al algoritmo. Devuelve: Un Callable del algoritmo escogido, i.g., AFSA.AFSA, ademas, retorna le nombre del algoritmo.
-
static
set_parameters
(archivo: str = None) → Dict[str, float][fuente]¶ Funcion extraer los parametros de un archivo de texto.
Formato:
param1=value1 param2=value2 param3=value3Parámetros: archivo – Nombre del archivo que contiene los parametros del algoritmo Devuelve: Diccionario con los parametros del algoritmo
-
static
set_problem
(elproblema: str, vector_len: int, size_space: int, dimension: int) → Any[fuente]¶ Funcion para establecer el problema base y las funciones asociadas a la clase de dicho problema.
Parámetros: - elproblema – Nombre de la clase que define al problema.
- vector_len – Tamaño del problema combinatorio ig. numero de ciudades para TSP.
- size_space – Espacio del problema, para ciertos problemas puede que no se use.
- dimension – Dimension del problema, i.g., 2 para TSP
Devuelve: Diccionario con el problema base y las funciones de la clase del problema
-
Clase con métodos de uso general¶
Funciones de uso general, se puede heredar para los algoritmos o usar como modulo de funciones
-
class
funciones_generales.
General
[fuente]¶ Clase de funciones de uso general
-
static
calcular_centroide
(grupo: object, problema_base: List[Tuple[int, int]], vector_len: int, vecinos: List[Tuple[int, int]]) → List[Tuple[float, float]][fuente]¶ Metodo para calcular el centroide
Parámetros: grupo – Grupo de candidatos Devuelve: xc, el centroide
-
static
calcular_vecinos
(index: int, candidato: List[Tuple[float]], visual: int, grupo: List[object]) → List[object][fuente]¶ Metodo para calcular los vecinos dado el rango visual
Parámetros: - index – Indice del pez actual
- candidato – candidato actual
- visual – Rango visual a utilizar para el calculo de los vecinos
- grupo – Grupo de candidatos
Devuelve: vecinos, una lista con los vecinos obtenidos
-
static
getbestsolution
(soluciones: List[object], cantidad: int = 1) → object[fuente]¶ Metodo para obtener la mejor solucion del grupo de soluciones actuales.
Parámetros: - soluciones – Grupo de soluciones al que se le obtendra la mejor respuesta basado en el fitness
- cantidad – Numero de soluciones a retornar
Devuelve: La mejor o mejores soluciones, ie. la solucion o soluciones con menor fitness
-
static
Algoritmos¶
Algoritmo de la escuela de peces artificiales¶
Algoritmo de escuela de peces artificiales (AFSA). Se puede utilizar por medio de la clase Optimizar, para mas detalles estudiar el ejemplo Ejecucion_simple.py o Ejecucion_multiple.py
*Nota 1: El AFSA se modifico ligeramente para el caso de los problemas continuos dado que esta planteado para problemas combinatorios, si se quiere un mejor desempeño para estos casos, se recomienda plantear el AFSA para problemas continuos.
-
class
AFSA.
AFSA
(maxiteration: str = 5000, visual: str = 4, crowfactor: str = 0.83, n_fish: str = 10, step: str = 1, try_numbers: str = 10, problema: List[Tuple[int, int]] = None, funciones: List[Callable] = None)[fuente]¶ Clase base de la escuela de peces artificiales, incluye los movimientos necesarios para el algoritmo.
-
empezar
(queue: None = None, show_results: bool = True, position: int = 0) → Tuple[List[float], AFSA.Fish, int][fuente]¶ Empieza el proceso de optimizacion, hace el llamado para guardar el mejor pez despues de cada iteracion y llama a la funcion de imprimir respuesta.
Parámetros: - queue – Variable de multiproceso (cola), se utiliza para devolver informacion al thread principal.
- show_results – Bandera para escoger el llamado a imprimir_respuesta().
Devuelve: Lista con la evolucion del fitness, objeto Fish con la mejor solucion encontrada, numero de
operaciones realizadas (iteraciones * n_fish).
-
follow_behavior
(index: int, fish: AFSA.Fish) → int[fuente]¶ Se obtiene el mejor pez dentro de los vecinos del pez actual, se asigna su posicion en caso de que el fitness sea mejor y que no haya mucha congestion.
Parámetros: - index – Indice del pez actual
- fish – Pez actual
Devuelve: 0, con fines de acabar la funcion
-
move_behavior_modificado
(index: int, fish: AFSA.Fish) → int[fuente]¶ Se modifico el move_behavior() original propuesto por Yun Cai (2010) el cual consistia en obtener una posicion random y sustituir la posicion del pez actual si dicha posicion generaba un mejor fitness.
Dado que en las pruebas este metodo no genero buenos resultados se opto por realizar un numero step de swaps entre posiciones random, el mejor valor conseguido para step fue de 1 y 2, para mayores valores de step, se tiende a generar una respuesta parecida al move_behavior() original, dado que se termina obteniendo una posicion random
Por otro lado, se agrego una version alterna en caso de que el problema a resolver sea de tipo continuo.
Parámetros: - index – Indice del pez actual
- fish – Pez actual
Devuelve: 0, con fines de acabar la funcion
-
prey_behavior
(index: int, fish: AFSA.Fish, visual: int) → int[fuente]¶ Se escoge de manera random un pez vecino, si su fitness es mejor, la posicion del pez actual se reemplaza con la de dicho pez, este proceso se repite try_numbers veces.
Parámetros: - index – Indice del pez actual
- fish – Pez actual
- visual – Rango visual del pez actual
Devuelve: 0, con fines de acabar la funcion
-
swarm_behavior
(index: int, fish: AFSA.Fish) → int[fuente]¶ Se calcula el centroide entre los vecinos, al pez actual se le asigna la posicion dada por el centroide si el fitness en dicha posicion es mejor y si la posicion no esta muy congestionada.
Parámetros: - index – Indice del pez actual
- fish – Pez actual
Devuelve: 0, con fines de acabar la funcion
-
Algoritmo Genético¶
Algoritmo Genetico. Se puede utilizar por medio de la clase Optimizar, para mas detalles estudiar el ejemplo Ejecucion_simple.py o Ejecucion_multiple.py.
*Nota 1: A la hora de cargar los parametros del GA, se deben escoger los operadores geneticos adecuadamente segun el tipo de problema, i.e., si el problema es combinatorio o si es continuo.
Ejemplos:
- Para problemas combinatorios:
- ga_operators=(“proportional_selection”,”ordered_crossover”,”swap_mutation”,”elitism”)
- Para problemas continuos:
- ga_operators=(“proportional_selection”,”heuristic_crossover”,”continuous_mutation”,”elitism”)
-
class
GA.
Chromosome
(p: List[Tuple[int, int]], f: float)[fuente]¶ Clase para definir los objetos tipo cromosoma(Chromosome)
-
class
GA.
GA
(maxgenerations: str = 1000, poppulation_size: str = 100, mutation_rate: str = 0.01, selection_rate: str = 0.5, ga_operators: str = ('proportional_selection', 'ordered_crossover', 'swap_mutation', 'elitism'), problema: List[Tuple[int, int]] = None, funciones: List[Callable] = None)[fuente]¶ Clase base del Algoritmo Genetico, incluye los operadores geneticos necesarios para el algoritmo.
-
continuous_mutation
(individuo: GA.Chromosome, mutation_rate: float = 0.01) → GA.Chromosome[fuente]¶ Funcion para realizar mutacion agregando un valor random entre -1 y 1 si se cumple la probabilidad de que suceda dicha mutacion dado por el mutation_rate. Esta mutacion solo puede suceder a una posicion del genoma.
Parámetros: - individuo – Cromosoma que posiblemente mutará.
- mutation_rate – Porcentaje relativo de mutaciones a realizar para una posicion en el genoma del cromosoma.
Devuelve: Cromosoma mutado.
-
elitism
(old_generation: List[GA.Chromosome]) → List[GA.Chromosome][fuente]¶ Funcion para reducir la poblacion basado en el principio de elitismo, donde solo los cromosomas con mejor fitness sobreviven. EL tamaño de la poblacion luego del crossover se reduce a al tamaño de la poblacion antes del crossover.
Parámetros: old_generation – Generation anterior + hijos generados del crossover Devuelve: Nueva generacion de un tamaño igual a population_size
-
empezar
(queue: None = None, show_results: bool = True, position: int = 0) → Tuple[List[float], GA.Chromosome, int][fuente]¶ Empieza el proceso de optimizacion, hace el llamado para guardar el mejor cromosoma despues de cada iteracion y llama a la funcion de imprimir respuesta.
Parámetros: - queue – Variable de multiproceso (cola), se utiliza para devolver informacion al thread principal.
- show_results – Bandera para escoger el llamado a imprimir_respuesta().
Devuelve: Lista con la evolucion del fitness, objeto Chromosome con la mejor solucion encontrada, numero de
operaciones realizadas (iteraciones * population_size).
-
heuristic_crossover
(parent1: GA.Chromosome, parent2: GA.Chromosome) → Tuple[GA.Chromosome, GA.Chromosome][fuente]¶ Funcion para calcular el crossover en el caso de problemas continuos. Se selecciona una posicion random dentro de la dimension del problema, luego, se modifica dicha posicion para el padre y para la madre tomando informacion de ambos y utilizando un factor beta que tomara valores entre 0 y 1.
- Formula:
- Padre Madre
P(N1, N2, N3,…, Nn) y M(N1, N2, N3,…, Nn)
Ni_pnew = Ni_p - beta*(Ni_p - Ni_m) Ni_mnew = Ni_m + beta*(Ni_p - Ni_m)Con Ni como la posicion a modificar con i € Naturales y 0 <= i < dimension
Parámetros: - parent1 – Cromosoma correspondiente al padre.
- parent2 – Cromosoma correspondiente a la madre.
Devuelve: Cromosomas correspondientes a los hijos generados.
-
ordered_crossover
(parent1: GA.Chromosome, parent2: GA.Chromosome) → Tuple[GA.Chromosome, GA.Chromosome][fuente]¶ Funcion para generar los hijos, quienes seran los candidatos a formar la siguiente generacion. El proceso consta de tomar dos puntos de cortes en el padre y la madre, la informacion rodeada de dichos cortes se preserva para para los hijos, y el resto se rellena de manera secuencial con la data faltante, si el corte es tomado del padre, el resto de la data se rellena con informacion de la madre, y viceversa.
Parámetros: - parent1 – Cromosoma correspondiente al padre.
- parent2 – Cromosoma correspondiente a la madre.
Devuelve: Cromosomas correspondientes a los hijos generados.
-
static
proportional_selection
(chromosomes: List[GA.Chromosome], max_value: float) → GA.Chromosome[fuente]¶ Funcion para seleccionar los padres, los padres con un mejor fitness tienen una probabilidad mayor de ser escogidos.
Parámetros: - chromosomes – Lista de cromosomas correspondiente a la generacion actual.
- max_value – sumatoria total de fitness de la generacion actual.
Devuelve: Padre seleccionado.
-
swap_mutation
(individuo: GA.Chromosome, mutation_rate: float = 0.01) → GA.Chromosome[fuente]¶ Funcion para realizar mutacion por medio de un swap, dicho swap se ejecuta para cada posicion del genoma, si se cumple la probabilidad de que suceda dada por el mutation_rate.
Parámetros: - individuo – Cromosoma que posiblemente mutará.
- mutation_rate – Porcentaje relativo de mutaciones a realizar por cada posicion en el genoma del cromosoma.
Devuelve: Cromosoma mutado.
-
Problemas¶
Problema del agente viajero¶
Problema del agente viajero
-
class
TSP.
TSP
[fuente]¶ Clase para definir el problema del agente viajero.
-
calcular_fitness
(recorrido: List[Tuple[int, int]], _) → float[fuente]¶ Metodo para calcular el fitness, para este problema de TSP se plantea como funcion fitness la suma de distancias euclidianas entre cada ciudad de manera secuencial partiendo de la ciudad fija y finalizando en la misma.
Parámetros: - recorrido – Recorrido a seguir entre las ciudades.
- _ – None
Devuelve: fitness
-
static
crear_recorrido
(cities: List[Tuple[int, int]]) → List[Tuple[int, int]][fuente]¶ Genera el recorrido a realizar
Parámetros: cities – Ciudades base menos la ciudad inicial, el recorrido de crea a partir de esta. Devuelve: recorrido random
-
distancia_euclidean
[fuente]¶ Metodo para el calculo de la distancia euclidiana
Parámetros: - punto1 – se explica solo
- punto2 – se explica solo
Devuelve: distancia entre el punto 1 y el punto 2
-
imprimir_respuesta
(problema_base: List[Tuple[int, int]], bestfitnes: object, cola: None = None) → None[fuente]¶ Metodo para imprimir una representacion de los resultados obtenidos
Parámetros: - problema_base – Ciudades base y por tanto, el problema a resolver
- bestfitnes – objeto con el mejor fitness encontrado junto con la posicion para dicho fitness
- cola – Para determinar el mostrado de las figuras.
Devuelve: None
-
ini_tsp
(n_ciudades: int, size_space: int, dimension: int, _) → List[Tuple[int, int]][fuente]¶ Inicializa las ciudades base a resolver. La creacion de las ciudades posee dos formas, uno de manera random, una con forma de circunferencia + ruido, ademas, se agrega en comentarios un set de ciudades fijo para probar el algoritmo de manera mas consistente.
Parámetros: - n_ciudades – Numero de ciudades a recorrer
- size_space – Tamaño del espacio en el que se ubican las ciudades ig. 100x100
- dimension – dimension del problema (x1, x2, x3,…,x_dimension)
- _ – None
Devuelve: Las ciudades generadas
-
Problema de las N reinas¶
Problema de las N reinas
-
class
Nqns.
Nqns
[fuente]¶ Clase para definir el problema de las N reinas.
-
static
calcular_fitness
(reinas_position: List[int], n_reinas: int) → int[fuente]¶ Calculo del fitness para el problema de las N reinas.
Parámetros: - reinas_position – Posicion actual en el tablero.
- n_reinas – Numero de reinas.
Devuelve: fitness dado por el numero total de colisiones.
-
static
crear_tablero
(reinas: List[int]) → List[int][fuente]¶ Genera la respuesta inicial random.
Parámetros: reinas – Tablero base. Devuelve: Respuesta inicial random.
-
static
imprimir_respuesta
(tablero: List[int], mejor_posicion: object, cola: None = None) → None[fuente]¶ Metodo para impirmir la mejor posicion en funcion del mejor fitness, ademas, grafica un tablero con la posicion de las reinas.
Parámetros: - tablero – Problema base.
- mejor_posicion – Mejor posicion encontrada.
- cola – Para determinar el mostrado de las figuras.
Devuelve: None
-
static
Función Ackley¶
Funcion Ackley
-
class
Ackley.
Ackley
[fuente]¶ Clase para definir el problema de la funcion Ackley.
-
static
calcular_fitness_ackley
(x: List[Tuple[float, float,...,dimension]], _) → float[fuente]¶ Genera el valor f(x) correspondiente a la funcion Ackley.
Parámetros: - x – Punto x que contiene (x1, x2, x3,…,x_n) con n = self.dimension
- _ – None
Devuelve: Ackley(x)
-
crear_x
(_) → List[Tuple[float, float,...,dimension]][fuente]¶ Genera un valor real aleatorio en el rango +/- size_space/2 de dimension igual a dimension.
Parámetros: _ – None Devuelve: valor real aleatorio.
-
imprimir_respuesta
(_, mejor_posicion: object, cola: None = None) → None[fuente]¶ Imprime la mejor respuesta encontrada, ademas, en caso de dimension=3 (self.dimension = 2), grafica la superficie en 3D y el punto encontrado.
Parámetros: - _ – None
- mejor_posicion – Mejor valor encontrado para la funcion Ackley.
- cola – Para determinar el mostrado de las figuras.
Devuelve: None
-
ini_funcionesmath
(_, size_space: int, dimension: int, problema: str) → List[int][fuente]¶ Para guardar las variables necesarias para el resto de funciones.
Parámetros: - _ – None
- dimension – Numero de demensiones a resolver.
- size_space – Tamaño del espacio.
- problema – Nombre del problema.
Devuelve: Lista con len = 1 para establecer el problema como continuo.
-
static
Función Rosenbrock¶
Funcion Rosenbrock
-
class
Rosenbrock.
OrderedClassMembers
[fuente]¶ Meta clase para poder extraer funciones de manera ordenada
-
class
Rosenbrock.
Rosenbrock
[fuente]¶ Clase para definir el problema de la funcion Rosenbrock.
-
static
calcular_fitness_rosen
(x: List[Tuple[float, float,...,dimension]], _) → float[fuente]¶ Genera el valor f(x) correspondiente a la funcion Rosenbrock.
Parámetros: - x – Punto x que contiene (x1, x2, x3,…,x_n) con n = self.dimension
- _ – None
Devuelve: Rosenbrock(x)
-
crear_x
(_) → List[Tuple[float, float,...,dimension]][fuente]¶ Genera un valor real aleatorio en el rango +/- size_space/2 de dimension igual a dimension.
Parámetros: _ – None Devuelve: valor real aleatorio.
-
imprimir_respuesta
(_, mejor_posicion: object, cola: None = None) → None[fuente]¶ Imprime la mejor respuesta encontrada, ademas, en caso de dimension=3 (self.dimension = 2), grafica la superficie en 3D y el punto encontrado.
Parámetros: - _ – None
- mejor_posicion – Mejor valor encontrado para la funcion Rosenbrock.
- cola – Para determinar el mostrado de las figuras.
Devuelve: None
-
ini_funcionesmath
(_, size_space: int, dimension: int, problema: str) → List[int][fuente]¶ Para guardar las variables necesarias para el resto de funciones.
Parámetros: - _ – None
- dimension – Numero de demensiones a resolver.
- size_space – Tamaño del espacio.
- problema – Nombre del problema.
Devuelve: Lista con len = 1 para establecer el problema como continuo.
-
static
Función Rastrigin¶
Funcion Rastrigin
-
class
Rastrigin.
OrderedClassMembers
[fuente]¶ Meta clase para poder extraer funciones de manera ordenada
-
class
Rastrigin.
Rastrigin
[fuente]¶ Clase para definir el problema de la funcion Rastrigin.
-
static
calcular_fitness_rastrigin
(x: List[Tuple[float, float,...,dimension]], _) → float[fuente]¶ Genera el valor f(x) correspondiente a la funcion Rastrigin.
Parámetros: - x – Punto x que contiene (x1, x2, x3,…,x_n) con n = self.dimension
- _ – None
Devuelve: Rastrigin(x)
-
crear_x
(_) → List[Tuple[float, float,...,dimension]][fuente]¶ Genera un valor real aleatorio en el rango +/- size_space/2 de dimension igual a dimension.
Parámetros: _ – None Devuelve: valor real aleatorio.
-
imprimir_respuesta
(_, mejor_posicion: object, cola: None = None) → None[fuente]¶ Imprime la mejor respuesta encontrada, ademas, en caso de dimension=3 (self.dimension = 2), grafica la superficie en 3D y el punto encontrado.
Parámetros: - _ – None
- mejor_posicion – Mejor valor encontrado para la funcion Rastrigin.
- cola – Para determinar el mostrado de las figuras.
Devuelve: None
-
ini_funcionesmath
(_, size_space: int, dimension: int, problema: str) → List[int][fuente]¶ Para guardar las variables necesarias para el resto de funciones.
Parámetros: - _ – None
- dimension – Numero de demensiones a resolver.
- size_space – Tamaño del espacio.
- problema – Nombre del problema.
Devuelve: Lista con len = 1 para establecer el problema como continuo.
-
static