import numpy as np import random from src.config import cfg def crossover(parent1, parent2): """ Operatore di Uniform Crossover vettorializzato. Scambia le agende settimanali intere (righe) tra i due genitori per mantenere la coerenza dei vincoli e del target ore sul singolo dipendente. """ rate = cfg.genetic_params.get('crossover_rate', 0.85) # Bypass dell'operatore in base alla probabilità (preservazione dei tratti parentali) if random.random() > rate: return parent1.copy(), parent2.copy() rows, _ = parent1.shape # Generazione di una maschera booleana 1D per l'estrazione delle righe (dipendenti) mask = np.random.rand(rows) < 0.5 child1 = parent1.copy() child2 = parent2.copy() # Swap vettorializzato: incrociamo i genomi sovrascrivendo le righe mascherate child1[mask] = parent2[mask] child2[mask] = parent1[mask] return child1, child2