Matt Owen

source code for "files/robot birds and robot bees/crossover.py"

return to portfolio
  1.  # matt
  2.  # crossover.py
  3.  
  4.  from random import randrange
  5.  from math import log
  6.  
  7.  def uniform_crossover(i,l): return 2**-l
  8.  
  9.  def one_point_crossover(i,l):
  10.   try:
  11.   k = log(i+1,2)
  12.   if 0 < k < l and k == int(k): return 1./(l-1)
  13.   except: return 0
  14.   return 0
  15.  
  16.  class crossover:
  17.   def __init__(s, xi, l, f):
  18.   s._l = l
  19.   s._xi = max(min(xi, 1),0)
  20.   s._crossover = [f(i=i, l=s._l) for i in range(2**s._l)]
  21.  
  22.   def __getitem__(s, i):
  23.   if i > 0: return s._xi * s._crossover[i]
  24.   elif i == 0: return 1 - s._xi + s._xi * s._crossover[0]
  25.   return False
  26.  
  27.   def __repr__(s):
  28.   st = '(Xi = ' + str(s._xi) + ', c = ' + str(s._crossover) + ', length = ' + str(s._l)
  29.   return st + ')'
  30.  
  31.  
  32.  
  33.  # actual crossing-over functions
  34.  # # # #
  35.  
  36.  def crossover_one_point(x, y, length=False, i=False):
  37.   if length == False: length = int(log(max(x, y), 2))
  38.   l = randrange(1, length, step=1)
  39.   if i == False: i = 2**l-1
  40.   noti = (2**length-1) ^ i
  41.   return x & i ^ noti & y, y & i ^ noti & x
  42.  
  43.  def crossover_uniform(x, y, length=False):
  44.   i = randrange(0, 2**length)
  45.   noti = (2**length-1) ^ i
  46.   return x & i ^ noti & y, y & i ^ noti & x
  47.  
  48.  
  49.  
  50.  print crossover_uniform(6, 5, length=4)