File size: 958 Bytes
9e62f55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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