Source code for gaggle.operators.crossover.base_crossovers.uniform_crossover

import torch

from gaggle.population.individual import Individual
from gaggle.operators.crossover.crossover import Crossover
from gaggle.arguments.ga_args import GAArgs


[docs]class UniformCrossover(Crossover): r"""Crossover where each gene has equal probability of coming from either parent See the following tutorial for a more in depth description https://www.tutorialspoint.com/genetic_algorithms/genetic_algorithms_crossover.htm Generates two children from two parents """ mates_per_crossover = 2 children_per_crossover = 2 def __init__(self, ga_args: GAArgs = None): super(UniformCrossover, self).__init__(ga_args=ga_args)
[docs] def crossover_individual(self, individuals: list[Individual]) -> list[Individual]: assert len(individuals) == self.mates_per_crossover individual_1, individual_2 = individuals assert individual_1.get_genome_size() == individual_2.get_genome_size() assert individual_1.sys_args.device == individual_2.sys_args.device genome_1 = individual_1.get_gene_pool() genome_2 = individual_2.get_gene_pool() for key in genome_1.keys(): size = genome_1[key]["param"].data.size() data_1 = genome_1[key]["param"].data.clone().detach() data_2 = genome_2[key]["param"].data.clone().detach() # generate the random mask mask_1 = torch.rand(size, dtype=torch.float, device=data_1.device) > 0.5 mask_2 = torch.logical_not(mask_1).to(torch.float) mask_1 = mask_1.to(torch.float) genome_1[key]["param"].data = torch.mul(data_1, mask_1) + torch.mul(data_2, mask_2) genome_2[key]["param"].data = torch.mul(data_1, mask_2) + torch.mul(data_2, mask_1) return [individual_1, individual_2]