SHARE
TWEET

algoritmo genetico pixel por pixel

a guest Aug 5th, 2013 200 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import numpy
  2. from PIL import Image
  3. from sys import argv
  4. from random import random
  5. from math import exp
  6.  
  7. def liminf(g):
  8.         return 0.5-0.05/exp(g/300.)
  9. def limsup(g):
  10.         return 0.5+0.05/exp(g/300.)
  11. def genpoblacion(n):
  12.         poblacion=[]
  13.         for i in range(n):
  14.                 poblacion.append([int(round(random()*255)),\
  15.                         int(round(random()*255)),\
  16.                         int(round(random()*255))])
  17.         return poblacion
  18. n=200
  19. fname=open(argv[1].split('\\')[-1],'r')
  20. bloques=[]
  21. generacion=[]
  22. colores=[]
  23. areas=[]
  24. for linea in fname:
  25.         b=[]
  26.         l=linea.split(',')
  27.         print (len(l)-2)/7,'bloques'
  28.         for i in range(len(l)):
  29.                 if i==0:
  30.                         width=int(l[i])
  31.                 elif i==1:
  32.                         height=int(l[i])
  33. #                       print (width,height)
  34.                         img=Image.new("RGB",(width,height))
  35.                         imgarr=numpy.array(img)
  36.                 else:
  37.                         try:b.append(int(l[i]))
  38.                         except:print 'invlit:',l[i]
  39.                 if (i-1)%7==0 and i>5:
  40. #                       bloques.append(b)
  41. #                       print i,len(l)
  42.  
  43.                         imgarr[b[1]:b[1]+b[3],\
  44.                                 b[0]:b[0]+b[2]]=b[4:]
  45.                         bloques.append(b)
  46.                         areas.append([b[2]*b[3]]*3)
  47.                         colores.append(b[4:])
  48.  
  49.                         b=[]
  50.  
  51. generaciones=10
  52. def evalua(sujeto):
  53.         grissujeto=sujeto[0]*.547+sujeto[1]*.339+sujeto[2]*.114
  54.         grismeta=meta[0]*.547+meta[1]*.339+meta[2]*.114
  55.         return 1.-abs(grissujeto-grismeta)/255.
  56. def evoluciona(padre,madre,g):
  57. #       print evalua(padre)
  58.         while 1:
  59.                 hijo=[]
  60.                 for i in range(len(padre)):
  61.                         r=random()
  62.                         if r<.495:
  63.                                 hijo.append(padre[i])
  64.                         elif r>.505:
  65.                                 hijo.append(madre[i])
  66.                         else:
  67.                                 hijo.append(int(round(random()*255)))
  68.                 if evalua(hijo)>evalua(padre) or evalua(hijo)>.95:
  69. #                       print "Generacion:",generaciones-g
  70.                         if g==0:
  71.                                 print "EVALUACION:",evalua(hijo)
  72.                                 return hijo
  73.                         else:
  74.                                 return evoluciona(hijo,padre,g-1)
  75. for i in range(len(colores)):
  76.         print 100.*i/len(colores),'%%'
  77.         poblacion=genpoblacion(n)
  78.         max=0
  79.         madre=None
  80.         padre=None
  81.         meta=colores[i]
  82.         for p in poblacion:
  83.                 if evalua(p)>max:
  84.                         madre=padre
  85.                         padre=p
  86.         hijo=evoluciona(padre,madre,generaciones)
  87.         imgarr[bloques[i][1]:bloques[i][1]+bloques[i][3],\
  88.                 bloques[i][0]:bloques[i][0]+bloques[i][2]]=hijo
  89. Image.fromarray(imgarr).show()
RAW Paste Data
Top