Módulo PySAG.crossover
Módulo que implementa operadores de cruce para algoritmos genéticos.
Este módulo proporciona varias estrategias de cruce que pueden ser utilizadas en algoritmos genéticos. Las funciones están diseñadas para ser flexibles y eficientes, utilizando Numba para la optimización del núcleo computacional.
- Operadores de Cruce Disponibles:
crossover_single_point: Cruce de un solo punto.
crossover_two_points: Cruce de dos puntos.
crossover_uniform: Cruce uniforme, gen a gen.
crossover_arithmetic: Cruce aritmético para valores numéricos.
crossover_order_ox1: Cruce de orden (OX1) para permutaciones.
- PySAG.crossover.crossover_arithmetic(parent1, parent2, alpha=0.5, **kwargs)[fuente]
Realiza un cruce aritmético entre dos padres.
Produce dos descendientes mediante una combinación lineal de los padres: child1 = alpha * parent1 + (1 - alpha) * parent2 child2 = (1 - alpha) * parent1 + alpha * parent2 Este operador es adecuado para cromosomas con genes de valor real o entero. Si se usan enteros, el resultado será flotante y puede requerir conversión.
- Parámetros:
parent1 (ndarray[tuple[int, ...], dtype[float64]]) – Primer padre (array NumPy 1D de tipo numérico).
parent2 (ndarray[tuple[int, ...], dtype[float64]]) – Segundo padre (array NumPy 1D, misma forma y tipo que parent1).
alpha (float) – Factor de ponderación para la combinación lineal. Un valor común es 0.5 (promedio simple). Debe estar entre 0 y 1 para interpolación.
**kwargs (Any) – Argumentos adicionales (no utilizados).
- Devuelve:
Una tupla (child1, child2) con los dos descendientes (arrays de flotantes).
- Muestra:
TypeValidationError – Si los padres no son arrays de NumPy, o si sus dtype no son numéricos (flotante o entero).
ParameterError – Si los padres no tienen la misma forma o no son 1D.
RangeError – Si alpha está fuera del rango [0, 1] (opcional, pero común).
CrossoverError – Si ocurre un error inesperado durante el cruce.
- Tipo del valor devuelto:
Tuple[ndarray[tuple[int, …], dtype[float64]], ndarray[tuple[int, …], dtype[float64]]]
Ejemplo
>>> import numpy as np >>> p1 = np.array([1.0, 2.0, 3.0]) >>> p2 = np.array([4.0, 5.0, 6.0]) >>> c1, c2 = crossover_arithmetic(p1, p2, alpha=0.5) >>> c1 array([2.5, 3.5, 4.5]) >>> c2 array([2.5, 3.5, 4.5]) >>> p_int1 = np.array([1, 2, 3]) >>> p_int2 = np.array([4, 6, 8]) >>> c_int1, c_int2 = crossover_arithmetic( p_int1.astype(float), p_int2.astype(float), alpha=0.2 ) >>> c_int1 # Resultado es flotante array([3.4, 5.2, 7. ])
- PySAG.crossover.crossover_order_ox1(parent1, parent2, **kwargs)[fuente]
Realiza un cruce de orden (OX1) entre dos padres de permutación.
Este operador es adecuado para cromosomas que representan permutaciones de enteros. 1. Se seleccionan dos puntos de cruce aleatorios. 2. El segmento del primer padre entre estos puntos se copia al primer hijo. 3. Los genes restantes se toman del segundo padre en el orden en que aparecen,
omitiendo los genes ya presentes del primer padre.
El proceso se invierte para crear el segundo hijo.
- Parámetros:
parent1 (ndarray[tuple[int, ...], dtype[int64]]) – Primer padre (array NumPy 1D de enteros, debe ser una permutación).
parent2 (ndarray[tuple[int, ...], dtype[int64]]) – Segundo padre (array NumPy 1D de enteros, misma forma y tipo, debe ser una permutación de los mismos elementos).
**kwargs (Any) – Argumentos adicionales (no utilizados).
- Devuelve:
Una tupla (child1, child2) con los dos descendientes (permutaciones).
- Muestra:
TypeValidationError – Si los padres no son arrays de NumPy o no son de tipo entero.
ParameterError – Si los padres no tienen la misma forma, no son 1D, o su longitud es menor que 1 (o 3 para un cruce significativo). También si no parecen ser permutaciones válidas (opcional).
CrossoverError – Si ocurre un error inesperado durante el cruce.
- Tipo del valor devuelto:
Tuple[ndarray[tuple[int, …], dtype[int64]], ndarray[tuple[int, …], dtype[int64]]]
Ejemplo
>>> import numpy as np >>> p1 = np.array([1, 2, 3, 4, 5, 6, 7, 8]) >>> p2 = np.array([8, 6, 4, 2, 7, 5, 3, 1]) >>> # Los puntos de cruce son aleatorios, el resultado varía. >>> # Para un ejemplo determinista, necesitaríamos fijar los puntos de cruce. >>> c1, c2 = crossover_order_ox1(p1, p2) >>> c1.shape == p1.shape and c2.shape == p2.shape True >>> np.array_equal(np.sort(c1), np.sort(p1)) True >>> np.array_equal(np.sort(c2), np.sort(p2)) True
- PySAG.crossover.crossover_single_point(parent1, parent2, **kwargs)[fuente]
Realiza un cruce de un solo punto entre dos padres.
Selecciona un punto de cruce aleatorio y crea dos descendientes intercambiando las secciones de los padres después de este punto. Funciona con cualquier tipo de dato en los arrays NumPy.
- Parámetros:
- Devuelve:
Una tupla (child1, child2) con los dos descendientes.
- Muestra:
TypeValidationError – Si los padres no son arrays de NumPy.
ParameterError – Si los padres no tienen la misma forma, no son 1D, o su longitud es menor que 2.
CrossoverError – Si ocurre un error inesperado durante el cruce.
- Tipo del valor devuelto:
Tuple[ndarray[tuple[int, …], dtype[ChromosomeType]], ndarray[tuple[int, …], dtype[ChromosomeType]]]
Ejemplo
>>> import numpy as np >>> p1 = np.array([1, 2, 3, 4, 5]) >>> p2 = np.array([6, 7, 8, 9, 10]) >>> c1, c2 = crossover_single_point(p1, p2) >>> c1.shape == p1.shape and c2.shape == p2.shape True >>> (c1 == p1).all() # Puede ser False si ocurre cruce False
- PySAG.crossover.crossover_two_points(parent1, parent2, **kwargs)[fuente]
Realiza un cruce de dos puntos entre dos padres.
Selecciona dos puntos de cruce aleatorios y crea dos descendientes intercambiando la sección entre estos dos puntos. Funciona con cualquier tipo de dato en los arrays NumPy.
- Parámetros:
- Devuelve:
Una tupla (child1, child2) con los dos descendientes.
- Muestra:
TypeValidationError – Si los padres no son arrays de NumPy.
ParameterError – Si los padres no tienen la misma forma, no son 1D, o su longitud es menor que 3.
CrossoverError – Si ocurre un error inesperado durante el cruce.
- Tipo del valor devuelto:
Tuple[ndarray[tuple[int, …], dtype[ChromosomeType]], ndarray[tuple[int, …], dtype[ChromosomeType]]]
Ejemplo
>>> import numpy as np >>> p1 = np.array([1, 2, 3, 4, 5, 6]) >>> p2 = np.array([10, 20, 30, 40, 50, 60]) >>> c1, c2 = crossover_two_points(p1, p2) >>> c1.shape == p1.shape and c2.shape == p2.shape True
- PySAG.crossover.crossover_uniform(parent1, parent2, mix_probability=0.5, **kwargs)[fuente]
Realiza un cruce uniforme entre dos padres.
Para cada gen, se decide con mix_probability si los genes de los padres se intercambian para esa posición en los hijos. Si no se intercambian, el hijo1 toma el gen del padre1 y el hijo2 del padre2. Si se intercambian, el hijo1 toma del padre2 y el hijo2 del padre1. Funciona con cualquier tipo de dato en los arrays NumPy.
- Parámetros:
parent1 (ndarray[tuple[int, ...], dtype[ChromosomeType]]) – Primer padre (array NumPy 1D).
parent2 (ndarray[tuple[int, ...], dtype[ChromosomeType]]) – Segundo padre (array NumPy 1D, misma forma y tipo que parent1).
mix_probability (float) – Probabilidad de intercambiar los genes de los padres para una posición dada. Debe estar entre 0 y 1. Por defecto es 0.5.
**kwargs (Any) – Argumentos adicionales (no utilizados).
- Devuelve:
Una tupla (child1, child2) con los dos descendientes.
- Muestra:
TypeValidationError – Si los padres no son arrays de NumPy.
ParameterError – Si los padres no tienen la misma forma o no son 1D.
RangeError – Si mix_probability está fuera del rango [0, 1].
CrossoverError – Si ocurre un error inesperado durante el cruce.
- Tipo del valor devuelto:
Tuple[ndarray[tuple[int, …], dtype[ChromosomeType]], ndarray[tuple[int, …], dtype[ChromosomeType]]]
Ejemplo
>>> import numpy as np >>> p1 = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) >>> p2 = np.array([10.0, 20.0, 30.0, 40.0, 50.0]) >>> c1, c2 = crossover_uniform(p1, p2, mix_probability=0.5) >>> c1.shape == p1.shape and c2.shape == p2.shape True