def createIndividual(possibleGenes=None, sizeIndividual=None, ressessiveChance=0.5, start=0, end=0, defaultGene=None) -> Individual: if possibleGenes is None: possibleGenes = [0, 1] if sizeIndividual == None: return Individual() genes = [] for index in range(sizeIndividual): if index >= start and index <= end: genes.append(rd.choice(possibleGenes)) else: genes.append(defaultGene) ressesive = [ rd.uniform(0, 1) < ressessiveChance for i in range(sizeIndividual) ] ind = Individual(genes=genes, isRessessive=ressesive) ind.start = start ind.end = end return ind
def cross(individual1: Individual, individual2: Individual, newressessiveChance=0.3, defaultGene=None) -> Individual: genes = individual1.genes[:] ressesive = individual1.isRessessive[:] parentGenes = [] if (individual1.start > individual2.start and individual1.end > individual2.end) or (individual2.start > individual1.start and individual2.end > individual1.end): for i in range(len(genes)): if i >= individual2.start and i < individual2.end: genes[i] = individual1.genes[i] ressesive[i] = individual2.isRessessive[i] else: for i in range(len(genes)): if individual2.genes[i] == defaultGene and individual1.genes[ i] == defaultGene: parentGenes.append(defaultGene) continue if individual1.genes[i] == defaultGene: parentGenes.append(defaultGene) genes[i] = individual2.genes[i] ressesive[i] = individual2.isRessessive[i] continue if individual1.isRessessive[i] and not individual2.isRessessive[i]: gene = individual2.genes[i] ress = individual1.genes[i] isRes = rd.uniform(0, 1) < newressessiveChance elif individual2.isRessessive[ i] and not individual1.isRessessive[i]: gene = individual1.genes[i] ress = individual2.genes[i] isRes = rd.uniform(0, 1) < newressessiveChance elif not individual1.isRessessive[i]: gene = rd.choice([individual1.genes[i], individual2.genes[i]]) if gene == individual1.genes[i]: ress = individual2.genes[i] else: ress = individual1.genes[i] isRes = False else: pg1 = None pg2 = None if len(individual1.parentGenes) > 1: pg1 = individual1.parentGenes[i] if len(individual2.parentGenes) > 1: pg2 = individual2.parentGenes[i] gene, ress = getGenes(pg1, pg2, individual1.genes[i], individual2.genes[i], defaultGene) isRes = True genes[i] = gene ressesive[i] = isRes parentGenes.append(ress) ind = Individual(genes=genes, isRessessive=ressesive, parentGenes=parentGenes) ind.start = min(individual1.start, individual2.start) ind.end = max(individual1.end, individual2.end) return ind