In [28]:
"""population class."""
import pyautogui as pg
# for crossover
import os
import sys
import pickle
from pync import Notifier
import network
import matplotlib.pyplot as plt
import numpy as np
import random
from itertools import chain
class population:
# initializing population of networks
def __init__(self,size):
self.generation = 0
self.pop = []
self.history = []
self.average = []
self.matingPool = []
for i in range(0,size):
self.pop.append(network.network())
def run(self):
while True:
self.evolveGen()
for idx, i in enumerate(self.pop):
i.save(self.generation,idx)
self.writeMetaDeta()
self.generation+=1
self.graphGen()
def evolveGen(self):
self.runGen()
self.genNextgen()
def runGen(self):
self.fitness = []
for idx, i in enumerate(self.pop):
i.run()
x = pg.locateOnScreen('again.png')
pg.moveTo(x[0], x[1])
Notifier.notify("Ran {} networks in gen {}".format(idx+1,self.generation), title="network")
pg.click()
self.fitness.append(i.Fitness)
def genNextgen(self):
self.matingPool = []
nextGen = []
average = 0
best = self.fitness.index(max(self.fitness))
for i in self.fitness:
average += i
average /= len(self.pop)
self.average.append(average)
self.history.append(max(self.fitness))
for i in self.pop:
l = []
for q in range(int((best/i.Fitness)*10)):
l.append(i)
self.matingPool.append(l)
self.matingPool = list(chain.from_iterable(self.matingPool))
print(self.matingPool)
for i in self.pop:
x = random.randrange(len(self.matingPool))
y = random.randrange(len(self.matingPool))
i = self.matingPool[x].crossover(self.matingPool[y])
i.mutation(0.01)
print(self.pop)
def loadGen(self,x):
self.generation = x
self.pop = []
gens = open( 'data/gens','r')
self.generation = int(gens.read())
historygens = list(open('data/history','r'))
historygens = historygens(historygens.read())
self.history = historygens
populationSize = open('data/populationSize','r')
populationSize = int(populationSize.read())
for i in range(0,populationSize):
self.pop.append(network.network())
for idx, i in enumerate(self.pop):
i.dna[0] = np.load('data/gen{}/net{}/dna0'.format(self.generation,idx))
i.dna[1] = np.load('data/gen{}/net{}/dna0'.format(self.generation,idx))
i.dna[2] = np.load('data/gen{}/net{}/dna0'.format(self.generation,idx))
def writeMetaDeta(self):
numGens = open('data/gens', 'w')
numGens.write(str(self.generation))
history = open('data/history{}'.format(self.generation),'w')
history.write(str(self.history))
average = open('data/average','w')
average.write(str(self.average))
population = open('data/populationSize','w')
population.write(str(len(self.pop)))
def graphGen(self):
import matplotlib.lines as mlines
plt.figure(figsize=(15,10))
plt.title('fitness vs generations')
plt.ylabel('fitness')
plt.xlabel('no. of generations')
plt.plot(self.history,'r--',self.average,'bs')
blue_line = mlines.Line2D([], [], color='blue', marker='s',
markersize=5, label='average per generation',ls = 'None')
red_line = mlines.Line2D([], [], color='red', marker='_',
markersize=2, label='max per generation')
plt.legend(handles=[blue_line,red_line])
plt.savefig('data/fitness{}.png'.format(self.generation))
plt.show()
In [29]:
x = population(3)
In [30]:
x.loadGen(9)
In [26]:
cd ..
In [33]:
for i in x.pop:
i.Fitness
In [2]:
x
In [3]:
In [15]:
x.fitness.index(max(x.fitness))
Out[15]:
In [16]:
max(x.fitness)
Out[16]:
In [43]:
matingPool = []
z= []
print(x.pop)
for i in x.pop:
z.append(1)
print(i)
print(matingPool)
matingPool.append(i)
for q in range(int((x.fitness.index(max(x.fitness))/i.Fitness)*10)):
matingPool.append(i)
z.append(7)
print(z)
print("adsfjlkl")
print(matingPool)
In [36]:
z = [[2],[2,3,[3,3]]]
In [37]:
z
Out[37]:
In [38]:
z = list(z)
In [39]:
z
Out[39]:
In [40]:
reduce(lambda x, y: x+y, z)
In [41]:
from collections import Iterable
from itertools import chain
In [42]:
z
Out[42]:
In [43]:
list(chain.from_iterable(item if isinstance(item,Iterable) and
not isinstance(item, basestring) else [item] for item in z))
In [ ]: