%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/waritko/suave/EVO/
Upload File :
Create Path :
Current File : //home/waritko/suave/EVO/evo.py

#from Tkinter import *
from graphics import *
from collections import namedtuple
import random
import math
from PIL import Image as NewImage

CONST_COUNT = 50 #count of object on screen
CONST_SHAPE = "circle" #preferet shape circle, triangle, square, rectangle
CONST_ROUNDS = 5 #number of user evaluation
CONST_SAMPLES = 9 #count of samples to evaluate in one round
CONST_CANVAS = 500 #canvas size
CONST_MUTATE = 10 # 1/COUNT_MUTATA percent to mutate

#TODO spocitat bity aby se menily kdyz se zmeni velikost canvas a nesmi byt mene nez 255
CONST_BITS = 10 # MUST BE 8 or larger

SampleStruct = namedtuple("Sample", "Items fitness")
ItemStruct = namedtuple("ItemStruct", "x y z r g b")

population = []

def create_circle(self, x, y, r, **kwargs):
    return self.create_oval(x-r, y-r, x+r, y+r, **kwargs)

def printSampleToEvaluate(Sample):
    win = GraphWin("User input", CONST_CANVAS, CONST_CANVAS)
    #root = Tk("Userinput")
    #cv = Canvas(root, width=CONST_CANVAS, height=CONST_CANVAS, bg='black')
    win.setBackground("black")
    Items = Sample.Items
    i = 0
    while i < CONST_COUNT:
        color = color_rgb(Items[i].r, Items[i].g, Items[i].b) #'#%02x%02x%02x' % (Items[i].r, Items[i].g, Items[i].b) #
        c = Circle(Point(Items[i].x, Items[i].y), Items[i].z)
        #root.Canvas.create_circle = create_circle(Items[i].x, Items[i].y, Items[i].z, fill=color, outline="black", width=2)
        c.setFill(color)
        c.draw(win)
        #root.mainloop()

        i = i + 1
    #the_input = raw_input("Enter input: ")
    #imageToSave = Image(c)
    #imageToSave.save('/savedImg.jpg')
    editedSample = SampleStruct(Sample.Items, int(input("1 - worst, 5 - best: ")))
    filemane = "img" + str(random.randint(0,255)) #str(Items[i].r) + str(Items[i].g) + str(Items[i].b) + str(Items[i].x) + str(Items[i].y) + str(Items[i].z)
    win.postscript(file=filemane, colormode='color')
    win.close()
    img = NewImage.open("img" + str(random.randint(0,255)) + ".eps")
    img.save("img" + str(random.randint(0,255)), "gif")
    return editedSample

def generateSample():
    Items = []
    i = 0
    while i < CONST_COUNT:

        x = random.randint(0, CONST_CANVAS)             # Create a random x value
        y = random.randint(0, CONST_CANVAS)             # Create a random y value
        z = random.randint(0, math.floor(CONST_CANVAS/2))  # radius
        r = random.randint(0, 255)
        g = random.randint(0, 255)
        b = random.randint(0, 255)

        Items.append(ItemStruct(x, y, z, r, g, b))

        i = i + 1
    CreatedSample = SampleStruct(Items, 0)
    return CreatedSample

def weighted_choice(choices):
   total = sum(w for c, w in choices)
   r = random.uniform(0, total)
   upto = 0
   for c, w in choices:
      if upto + w >= r:
         return SampleStruct(c,w)
      upto += w

def mutate(wade): #Wade Wilson
    roll = random.randint(0, CONST_MUTATE)
    if(roll == CONST_MUTATE):
        where = random.randint(0, len(wade)-1)
        deadpool = list(wade)
        if(wade[where] == '0'):

            deadpool[where] = '1'
        else:
            deadpool[where] = '0'

        return ''.join(deadpool)

    return wade

def crossing(pOne, pTwo): #one sample on input, is called CONST_SAMPLES times
    #TODO crossin!!!
    children = []
    OneItems = []
    TwoItems = []

    #while sch < CONST_SAMPLES: # Pro kazdy z 9 obrazku
    pItemsOne = pOne.Items
    pItemsTwo = pTwo.Items

    binaryOne = ""
    binaryTwo = ""

    circle = 0
    while circle < CONST_COUNT: #Pro kazdou kruznici
        binaryOne += ("{0:b}".format(pItemsOne[circle].x).zfill(CONST_BITS)) + \
                     ("{0:b}".format(pItemsOne[circle].y).zfill(CONST_BITS)) + \
                     ("{0:b}".format(pItemsOne[circle].z).zfill(CONST_BITS)) + \
                     ("{0:b}".format(pItemsOne[circle].r).zfill(CONST_BITS)) + \
                     ("{0:b}".format(pItemsOne[circle].g).zfill(CONST_BITS)) + \
                     ("{0:b}".format(pItemsOne[circle].b).zfill(CONST_BITS))
        binaryTwo += ("{0:b}".format(pItemsTwo[circle].x).zfill(CONST_BITS)) + \
                     ("{0:b}".format(pItemsTwo[circle].y).zfill(CONST_BITS)) + \
                     ("{0:b}".format(pItemsTwo[circle].z).zfill(CONST_BITS)) + \
                     ("{0:b}".format(pItemsTwo[circle].r).zfill(CONST_BITS)) + \
                     ("{0:b}".format(pItemsTwo[circle].g).zfill(CONST_BITS)) + \
                     ("{0:b}".format(pItemsTwo[circle].b).zfill(CONST_BITS))
        circle += 1

    binaryOne = mutate(binaryOne)
    binaryTwo = mutate(binaryTwo)

    crossingPoint = random.randint(1,CONST_BITS*6*CONST_COUNT-2)
    newBinaryOne = binaryOne[0:crossingPoint] + binaryTwo[crossingPoint:CONST_BITS*6*CONST_COUNT]
    newBinaryTwo = binaryTwo[0:crossingPoint] + binaryOne[crossingPoint:CONST_BITS*6*CONST_COUNT]

    circle2 = 0
    offset = 0
    while circle2 < CONST_COUNT:

        OneItems.append(ItemStruct(int(newBinaryOne[offset:offset + CONST_BITS], 2),
                                 int(newBinaryOne[offset + CONST_BITS:offset + 2 * CONST_BITS], 2),
                                 int(newBinaryOne[offset + 2 * CONST_BITS:offset + 3 * CONST_BITS], 2),
                                 int(newBinaryOne[offset + 3 * CONST_BITS + CONST_BITS-8 : offset + 4 * CONST_BITS], 2),  #r
                                 int(newBinaryOne[offset + 4 * CONST_BITS + CONST_BITS-8 : offset + 5 * CONST_BITS], 2),  #g
                                 int(newBinaryOne[offset + 5 * CONST_BITS + CONST_BITS-8 : offset + 6 * CONST_BITS], 2))) #b

        TwoItems.append(ItemStruct(int(newBinaryTwo[offset:offset + CONST_BITS], 2),
                                   int(newBinaryTwo[offset + CONST_BITS:offset + 2 * CONST_BITS], 2),
                                   int(newBinaryTwo[offset + 2 * CONST_BITS :offset + 3 * CONST_BITS], 2),
                                   int(newBinaryTwo[offset + 3 * CONST_BITS + CONST_BITS-8 :offset + 4 * CONST_BITS], 2),
                                   int(newBinaryTwo[offset + 4 * CONST_BITS + CONST_BITS-8 :offset + 5 * CONST_BITS], 2),
                                   int(newBinaryTwo[offset + 5 * CONST_BITS + CONST_BITS-8:offset + 6 * CONST_BITS], 2)))
        offset += CONST_BITS*6
        circle2 +=1

        #sch = sch+1
    newPOne = SampleStruct(OneItems, 0)
    newPTwo = SampleStruct(TwoItems, 0)

    children.append(newPOne)
    children.append(newPTwo)
    return children


def selection(parentPopulation):
    childPopulation = []

    ss = 0
    while ss < CONST_SAMPLES:
        parentOne = weighted_choice(parentPopulation)
        parentTwo = weighted_choice(parentPopulation)
        crossedChildrens = crossing(parentOne, parentTwo)
        childPopulation.append(crossedChildrens[0])
        if(ss != CONST_SAMPLES-1):
            childPopulation.append(crossedChildrens[1])
        ss = ss+2

    return childPopulation

r = 0
while r < CONST_ROUNDS:

    if(r == 0):
        sf = 0
        while sf < CONST_SAMPLES:
            newSample = generateSample()
            newSample = printSampleToEvaluate(newSample)
            population.append(newSample)
            sf = sf+1
    else:
        print("\n Next genration!")
        s = 0
        while s < CONST_SAMPLES:
            newSample = printSampleToEvaluate(population[s])
            population[s] = newSample
            s = s+1

    population = selection(population)

    r = r+1

Zerion Mini Shell 1.0