-
-
-
-
-
-
- from math import ceil, log
- from matrix import matrix
- import random
-
-
-
-
-
- class binaryvector:
- def __init__(s, n, l=False):
- s._n = n
-
- if l == False: s._l = int(log(n,2))+1
- else: s._l = l
-
- s._v = s.vector()
- s._m = sum(s._v)
-
- def vector(s):
- n = s._n
- v = []
- while n:
- v += [n%2]
- n /= 2
- if s._l == False: return v
- return v + ([0] * (s._l - len(v)))
-
- def __getitem__(s, i): return bv._v[i]
-
- def __repr__(s): return ''.join(map(str, s._v))
-
-
- def k_matrix(k, l):
- c = 0
- lis = []
- bv = binaryvector(k)
- m = matrix(ncols=bv._m, nrows=l)
- for i in range(len(bv._v)):
- if bv[i] == 1:
- m[i,c] = 1
- c += 1
-
- return m
-
-
- def permutation_matrix(n, k):
- m = matrix(ncols=n, nrows=n)
- for i in range(n):
- for j in range(n):
- if i^j == k: m[i,j] = 1
- return m
-
-
-
- class omega:
- def __init__(s, k, l):
- s._l = l
- s._K = k_matrix(k=k, l=l)
- s._bv = binaryvector(n=k, l=l)
- s._m = s._bv._m
- s._perm = permutation_matrix(n=s._m+1, k=s._m)
- s._set = set()
- s._hash = {}
-
- def points(s):
- print s._K
- for k in range(2**s._m):
- bv = binaryvector(k, l=s._m)
- yield ''.join(map(str,matrix.col(s._K * bv._v)))
-
-
-
-
-
- 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 mutation_vector(mu, l):
- v = []
- for i in range(2**l):
- s = binaryvector(i, l=l)._m
- v += [mu**(s) * (1-mu)**(l-s)]
- return v
-
-
-
-
-
- def child_probability(x,y,z,mu,xi,l):
-
- t = 0
-
-
- x,y = x^z,y^z
-
-
- vmu = mutation_vector(mu,l)
- X = crossover(xi=xi, l=l, f=one_point_crossover)
-
- for j in range(2**l):
- for k in range(2**l):
- notk = (2**l-1)^k
- t += vmu[j] * (X[k] + X[notk])/2. * int(x & k ^ notk & y ^ j == 0)
-
- return t
-
- def mix_matrix(xi, mu):
- l = xi._l
- m = matrix([], ncols=2**l, nrows=2**l)
- for x in range(2**l):
- for y in range(2**l):
- m[x,y] = child_probability(x,y,0,mu=mu,xi=xi,l=l)
- return m
-
-
-
-
-
-
- X = crossover(xi=.7, l=3, f=one_point_crossover)
- mu = mutation_vector(mu=.3, l=3)