def crossover(self, organism1: Organism, organism2: Organism): if organism1.genome_size != organism1.genome_size: raise ValueError('Genome of organisms should be same size') genome_size = organism1.genome_size one_third_point = int(genome_size / 3) two_third_point = int(genome_size / 3) * 2 crossover_point1 = random.randint(0, one_third_point) crossover_point2 = random.randint(one_third_point, two_third_point) crossover_point3 = random.randint(two_third_point, genome_size) new_genome = [] for i in range(genome_size): if i < crossover_point1: new_genome.append(organism1.genome[i]) elif crossover_point1 <= i < crossover_point2: new_genome.append(organism2.genome[i]) elif crossover_point2 <= i < crossover_point3: new_genome.append(organism1.genome[i]) else: new_genome.append(organism2.genome[i]) return Organism(new_genome)
def introduce(self, organism: Organism): new_genome = [] for i, g in enumerate(organism.genome): r = random.uniform(0, 1) if r < self.frequency_of_mutations: initial_gene = self.initial_organism.genome[i] rand = random.uniform(0, int(initial_gene / self.divider)) new_genome.append(initial_gene - rand) else: new_genome.append(g) return Organism(new_genome)
def __init__(self, path: str): initial_organism_path = os.path.join(path, 'initial_organism.npy') if os.path.isfile(initial_organism_path): self.initial_organism = Organism.from_file(initial_organism_path) else: self.initial_organism = None initial_population_path = os.path.join(path, 'initial_population.npy') if os.path.isfile(initial_population_path): self.initial_population = Population.from_file( initial_population_path) else: self.initial_population = None self.hic_data = HiCData.from_files(path)
def crossover(self, organism1: Organism, organism2: Organism): if organism1.genome_size != organism1.genome_size: raise ValueError('Genome of organisms should be same size') genome_size = organism1.genome_size new_genome = [] for i in range(genome_size): first = random.randint(0, 1) if first: new_genome.append(organism1.genome[i]) else: new_genome.append(organism2.genome[i]) return Organism(new_genome)
def crossover(self, organism1: Organism, organism2: Organism): if organism1.genome_size != organism1.genome_size: raise ValueError('Genome of organisms should be same size') genome_size = organism1.genome_size crossover_point = int(genome_size / 2) new_genome = [] for i in range(genome_size): if i < crossover_point: new_genome.append(organism1.genome[i]) else: new_genome.append(organism2.genome[i]) return Organism(new_genome)
def crossover(self, organism1: Organism, organism2: Organism): if organism1.genome_size != organism1.genome_size: raise ValueError('Genome of organisms should be same size') genome_size = organism1.genome_size #TODO: maybe should use Gaussian? Or cut in half? crossover_point = random.randint(0, genome_size) new_genome = [] for i in range(genome_size): if i < crossover_point: new_genome.append(organism1.genome[i]) else: new_genome.append(organism2.genome[i]) return Organism(new_genome)
def generate_organism(self, original_organism: Organism): new_genome = [] for gene in original_organism.genome: rand = random.uniform(0, gene / 3) new_genome.append(gene - rand) return Organism(new_genome)
dm_path = os.path.join(directory, 'dm.npy') np.save(dm_path, chromosome.distance_matrix.distance_matrix_nparray) not_gaps_path = os.path.join(directory, 'not_gaps.npy') np.save(not_gaps_path, hic_data.not_gaps) curve_path = os.path.join(directory, 'curve.pdf') files_helper.save_3d_plot(sample_name, curve_path, chromosome.points) adj_path = os.path.join(directory, 'adj.png') files_helper.save_adjastency_matrix( sample_name, adj_path, chromosome.distance_matrix.distance_matrix_nparray) if not params.save_initial_population: print('Saved!') sys.exit() initial_organism_genome = distance_matrix_sd.get_futm_except_ordered_coordinates( hic_data.not_gaps) initial_organism = Organism(initial_organism_genome) initial_population_generator = InitialPopulationGenerator() initial_population = initial_population_generator.generate( initial_organism, params.population_size) initial_organism_path = os.path.join(directory, 'initial_organism.npy') initial_organism.save(initial_organism_path) initial_population_path = os.path.join(directory, 'initial_population.npy') initial_population.save(initial_population_path) print('Saved!')
initial_organism = sample.initial_organism initial_population = sample.initial_population else: print('Running shortest distances algorithm... ', end='') start = time.time() distance_matrix_sd = shortest_distances_filler.fill( distance_matrix_with_gaps) end = time.time() elapsed = end - start print('Finished in {0} sec.'.format(timedelta(seconds=elapsed))) print('Generating initial organism (ADAM)... ', end='') start = time.time() initial_organism_genome = distance_matrix_sd.get_futm_except_ordered_coordinates( hic_data.not_gaps) initial_organism = Organism(initial_organism_genome) end = time.time() elapsed = end - start print('Finished in {0} sec.'.format(timedelta(seconds=elapsed))) print('Generating initial population... ', end='') start = time.time() initial_population = initial_population_generator.generate( initial_organism, params.population_size) end = time.time() elapsed = end - start print('Finished in {0} sec.'.format(timedelta(seconds=elapsed))) print('Calculating ADAM\'s error... ', end='') start = time.time() adam_score = fitness_calculator.calculate(initial_organism.genome)
def from_file(cls, path: str): list_of_genomes = np.load(path) organisms = [] for genome in list_of_genomes: organisms.append(Organism(genome.tolist())) return cls(organisms)
def test_10(self): organism1 = Organism([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) organism2 = Organism([2, 2, 2, 2, 2, 2, 2, 2, 2, 2]) crossoverer = MiddlePointCrossoverer() result = crossoverer.crossover(organism1, organism2) self.assertEqual(result.genome, [1, 1, 1, 1, 1, 2, 2, 2, 2, 2])