John Smith - 1 year ago 53
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

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

#oldPop = self.popul
#"""
while target not in self.popul:
oldPop = self.popul
if target in self.popul:
return
#"""
``````

``````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?

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

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))
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download