In [1]:
"""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):
self.runGen()
self.genNextgen()
self.writeMetaDeta()
self.generation+=1
self.graphGen()
def runGen(self):
self.fitness = []
for idx, i in enumerate(self.pop):
i.run()
x = pg.locateOnScreen('again.png')
print(x)
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)
def loadGen(self,x):
self.generation = x
self.pop = []
if os.access("data/gens", os.R_OK):
gens = open(os.path.join(sys.path[0], 'data/gens'),'r')
self.generation = int(gens.read())
if os.access("data/history", os.R_OK):
historygens = list(open(os.path.join(sys.path[0], 'data/history'),'r'))
self.history = historygens
if os.access("data/populationSize", os.R_OK):
populationSize = open(os.path.join(sys.path[0], '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):
for idx, i in enumerate(self.pop):
i.save(self.generation,idx)
numPop = open('data/gens')
numGens = open('data/gens', 'w')
numGens.write(str(self.generation))
history = open('data/gen{}/history'.format(self.generation),'w')
history.write(str(self.history))
average = open('data/gen{}/average'.format(self.generation),'w')
average.write(str(self.average))
population = open('data/gen{}/populationSize'.format(self.generation),'w')
population.write(str(len(self.pop)))
history = open('data/history{}'.format(self.generation),'w')
history.write(str(self.history))
average = open('data/average{}'.format(self.generation),'w')
average.write(str(self.average))
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 [2]:
x = population(3)
In [4]:
x.run()
In [29]:
import pyautogui as pg
import time
import pyperclip
import re
time.sleep(2)
pg.moveTo(626,352)
pg.dragTo(824,395,button='left')
pg.hotkey('command', 'c')
Fitness = pyperclip.paste()
Fitness = int(re.sub("[^0-9]","",str(Fitness)))
print(Fitness)
In [26]:
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]:
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 [ ]: