Exemplo n.º 1
0
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
Exemplo n.º 2
0
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