John Smith John Smith - 2 months ago 14
Python Question

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?

Answer Source

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))