-
-
-
- from random import randrange
- from math import log
-
- def uniform_crossover(i,l): return 2**-l
-
- def one_point_crossover(i,l):
- try:
- k = log(i+1,2)
- if 0 < k < l and k == int(k): return 1./(l-1)
- except: return 0
- return 0
-
- class crossover:
- def __init__(s, xi, l, f):
- s._l = l
- s._xi = max(min(xi, 1),0)
- s._crossover = [f(i=i, l=s._l) for i in range(2**s._l)]
-
- def __getitem__(s, i):
- if i > 0: return s._xi * s._crossover[i]
- elif i == 0: return 1 - s._xi + s._xi * s._crossover[0]
- return False
-
- def __repr__(s):
- st = '(Xi = ' + str(s._xi) + ', c = ' + str(s._crossover) + ', length = ' + str(s._l)
- return st + ')'
-
-
-
-
-
-
- def crossover_one_point(x, y, length=False, i=False):
- if length == False: length = int(log(max(x, y), 2))
- l = randrange(1, length, step=1)
- if i == False: i = 2**l-1
- noti = (2**length-1) ^ i
- return x & i ^ noti & y, y & i ^ noti & x
-
- def crossover_uniform(x, y, length=False):
- i = randrange(0, 2**length)
- noti = (2**length-1) ^ i
- return x & i ^ noti & y, y & i ^ noti & x
-
-
-
- print crossover_uniform(6, 5, length=4)