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)


---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-30-ed576b4d7de7> in <module>()
----> 1 x.loadGen(9)

<ipython-input-28-06c3940bc7ea> in loadGen(self, x)
     78         gens = open( 'data/gens','r')
     79         self.generation = int(gens.read())
---> 80         historygens = list(open('data/history','r'))
     81         historygens = historygens(historygens.read())
     82         self.history = historygens

FileNotFoundError: [Errno 2] No such file or directory: 'data/history'

In [26]:
cd ..


/Users/chrisreuter/Snake.io-player

In [33]:
for i in x.pop:
    i.Fitness


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-33-4e72f3680f7a> in <module>()
      1 for i in x.pop:
----> 2     i.Fitness

AttributeError: 'network' object has no attribute 'Fitness'

In [2]:
x

In [3]:



---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-3-d22e260617fa> in <module>()
----> 1 x.runGen()

/Users/chrisreuter/Snake.io-player/population.py in runGen(self)
     42         self.fitness = []
     43         for idx, i in enumerate(self.pop):
---> 44             i.run()
     45             x = pg.locateOnScreen('again.png')
     46             pg.moveTo(x[0], x[1])

/Users/chrisreuter/Snake.io-player/network.py in run(self)
     29         #I found that by using a smaller .png I could optimization of about 0.05 second
     30         #Grayscale also makes it run 0.1 seconds faster
---> 31         while(pg.locateOnScreen('again.png', grayscale = True) == None):
     32             self.screen.capture()
     33             x = []

/Users/chrisreuter/anaconda/lib/python3.5/site-packages/pyscreeze/__init__.py in locateOnScreen(image, minSearchTime, **kwargs)
    258         try:
    259             screenshotIm = screenshot(region=None) # the locateAll() function must handle cropping to return accurate coordinates, so don't pass a region here.
--> 260             retVal = locate(image, screenshotIm, **kwargs)
    261             try:
    262                 screenshotIm.fp.close()

/Users/chrisreuter/anaconda/lib/python3.5/site-packages/pyscreeze/__init__.py in locate(needleImage, haystackImage, **kwargs)
    242     # Note: The gymnastics in this function is because we want to make sure to exhaust the iterator so that the needle and haystack files are closed in locateAll.
    243     kwargs['limit'] = 1
--> 244     points = tuple(locateAll(needleImage, haystackImage, **kwargs))
    245     if len(points) > 0:
    246         return points[0]

/Users/chrisreuter/anaconda/lib/python3.5/site-packages/pyscreeze/__init__.py in _locateAll_python(needleImage, haystackImage, grayscale, limit, region, step)
    209 
    210     for y in range(haystackHeight): # start at the leftmost column
--> 211         for matchx in firstFindFunc(needleImageFirstRow, haystackImageData[y * haystackWidth:(y+1) * haystackWidth], step):
    212             foundMatch = True
    213             for searchy in range(1, needleHeight, step):

/Users/chrisreuter/anaconda/lib/python3.5/site-packages/pyscreeze/__init__.py in _kmp(needle, haystack, _dummy)
    375     matchLen = 0
    376     for c in haystack:
--> 377         while matchLen == len(needle) or \
    378               matchLen >= 0 and needle[matchLen] != c:
    379             startPos += shifts[matchLen]

KeyboardInterrupt: 

In [15]:
x.fitness.index(max(x.fitness))


Out[15]:
1

In [16]:
max(x.fitness)


Out[16]:
51

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)


[<network.network object at 0x1072a29e8>, <network.network object at 0x10d3885c0>, <network.network object at 0x10d388908>, <network.network object at 0x10d388940>]
<network.network object at 0x1072a29e8>
[]
<network.network object at 0x10d3885c0>
[<network.network object at 0x1072a29e8>]
<network.network object at 0x10d388908>
[<network.network object at 0x1072a29e8>, <network.network object at 0x10d3885c0>]
<network.network object at 0x10d388940>
[<network.network object at 0x1072a29e8>, <network.network object at 0x10d3885c0>, <network.network object at 0x10d388908>]
[1, 1, 1, 1]
adsfjlkl
[<network.network object at 0x1072a29e8>, <network.network object at 0x10d3885c0>, <network.network object at 0x10d388908>, <network.network object at 0x10d388940>]

In [36]:
z = [[2],[2,3,[3,3]]]

In [37]:
z


Out[37]:
[[2], [2, 3, [3, 3]]]

In [38]:
z = list(z)

In [39]:
z


Out[39]:
[[2], [2, 3, [3, 3]]]

In [40]:
reduce(lambda x, y: x+y, z)


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-40-b588dea853c2> in <module>()
----> 1 reduce(lambda x, y: x+y, z)

NameError: name 'reduce' is not defined

In [41]:
from collections import Iterable
from itertools import chain

In [42]:
z


Out[42]:
[[2], [2, 3, [3, 3]]]

In [43]:
list(chain.from_iterable(item if isinstance(item,Iterable) and
                    not isinstance(item, basestring) else [item] for item in z))


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-43-61f7afb30941> in <module>()
      1 list(chain.from_iterable(item if isinstance(item,Iterable) and
----> 2                     not isinstance(item, basestring) else [item] for item in z))

<ipython-input-43-61f7afb30941> in <genexpr>(.0)
      1 list(chain.from_iterable(item if isinstance(item,Iterable) and
----> 2                     not isinstance(item, basestring) else [item] for item in z))

NameError: name 'basestring' is not defined

In [ ]: