pythonpython-3.xgenetic-algorithmgenetic-programming

Is this a genetic algorithm?


I am trying to make a genetic algorithm that finds the word given in the console input. But I don't know if I succeeded to do a full genetic algorithm. Here is the code:

main.py:

from population import Population

target = input()
maxPop = 10
mutation = 100

print("\n\n\n")

pop = Population(target, maxPop, mutation)

population.py:

import random
from ADN import genetic

class Population:
    def __init__(self, target, maxPop, mut):
        adn = genetic()
        self.popul = []
        i = 0
        while i < maxPop:
            self.popul.append(adn.genFirst(len(target)))
            print(self.popul[i])
            i+=1

        #oldPop = self.popul
        #adn.fitness(oldPop, target)
        #"""
        while target not in self.popul:
            oldPop = self.popul
            self.popul = adn.fitness(oldPop, target)
            if target in self.popul:
                return
        #"""

ADN.py:

import random

class genetic:
    def genFirst(self, length):
        bestGenes = ""
        self.letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890[],. "
        word = ""
        i = 0
        while i < length:
            word += random.choice(self.letters)
            i+=1
        return word

    def fitness(self, oldPop, target):
        newPop = []

        j = 0
        for word in oldPop:
            newW = ""
            for letter in word:
                if(letter not in target):
                    letter = random.choice(self.letters)
                else:
                    if(target.index(letter) != word.index(letter)):
                        letter = random.choice(self.letters)
                newW += letter
            newPop.append(newW)

        print(newPop)
        return newPop

If it is not a full genetic algorithm, what is missing?


Solution

  • No, it's not a genetic algorithm. It is not even an evolutionary algorithm. It misses the fitness function which should calculate how good is every member of the calculation. After that you should decide which code would you want to make: genetic or evolutionary. Being a beginner you should try the evolutionary algorithm, it's easier and it does not contain the crossover function (which is difficult for beginners). Try this:

    import random
    
    genes = "abcdefghijklmnopqrsttuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-[]()1234567890;<>?/ "
    target = input()
    
    def genPar(length):
        parent = []
        for i in range(length):
            parent.append(random.choice(genes))
    
        return "".join(parent)
    
    def fitness(parent):
        total = 0
        for i in range(len(parent)):
            if(parent[i] == target[i]):
                total += 1
        return total
    
    def mutate(parent):
        index  = random.choice(range(len(parent)))
        child = []
    
        for i in range(len(parent)):
            if(i == index):
                letter = random.choice(genes)
            else:
                letter = parent[i]
            child.append(letter)
    
        return "".join(child)
    
    parent = genPar(len(target))
    bestPar = parent
    bestFitness = fitness(parent)
    
    print(parent)
    
    generations = 1
    
    while True:
        child = mutate(bestPar)
        childFit = fitness(child)
    
        if(childFit > bestFitness):
            bestFitness = childFit
            bestPar = child
    
        print(child)
        generations += 1
    
        if(child == target):
            break
    
    print("\nGenerations: " + str(generations))