def mutation(self): """ 突然変異させる このメソッドはサブクラスでoverrideすることを想定している """ if not flip(self.mutation_rate): return for i in range(len(self.gene)): if flip(self.mutation_parameter): self.gene[i] = 0 if self.gene[i] else 1
def perform_mutation(self): """ それぞれの個体にランダムに突然変異を実行する """ if not flip(self.mutation_rate): return for entity in self.entities: entity.mutation()
def crossover(self, mother, father): """ 交叉を行う このメソッドはサブクラスでoverrideすることを想定している """ child1 = Entity([], self.mutation_rate, self.mutation_parameter) child2 = Entity([], self.mutation_rate, self.mutation_parameter) if not flip(self.crossover_rate): return () else: for (m, f) in zip(mother.gene, father.gene): if flip(self.crossover_parameter): child1.gene.append(m) child2.gene.append(f) else: child1.gene.append(f) child2.gene.append(m) return (child1, child2)
def random_gene(length): gene = [] for j in range(length): b = 1 if flip(0.5) else 0 gene.append(b) return gene