def oneChildCrossover(p1, p2, crossfuncs, crossparams): """ Crossover all the chromosomes in the two individuals. The crossover function for each pair of corresponding chromosomes is the the corresponding element in crossfuncs, called with the corresponding tuple in crossparams. Note that it is assumed that each crossover function in crossfuncs returns one child chromosome pre: isinstance(p1, Individual) isinstance(p2, Individual) len(p1) == len(p2) len(p1) == len(crossfuncs) len(crossfuncs) == len(crossparams) post: __old__.p1 is p1 __old__.p2 is p2 __old__.p1 == p1 __old__.p2 == p2 len(__return__) == 1 isinstance(__return__, Individual) len(__return__)==len(p1) all(len(c)==len(p1[i]) for i,c in enumerate(__return__.chromosomes)) all(len(c)==len(p1[i]) for i,c in enumerate(__return__.chromosomes)) """ answer = Individual([]) for i, (crossfunc, crossparams) in enumerate(list(zip(crossfuncs, crossparams))): answer.append(crossfunc(p1[i], p2[i], *crossparams)) return answer
def oneChildCrossover(p1, p2, crossfuncs, crossparams): """ Crossover all the chromosomes in the two individuals. The crossover function for each pair of corresponding chromosomes is the the corresponding element in crossfuncs, called with the corresponding tuple in crossparams. Note that it is assumed that each crossover function in crossfuncs returns one child chromosome pre: isinstance(p1, Individual) isinstance(p2, Individual) len(p1) == len(p2) len(p1) == len(crossfuncs) len(crossfuncs) == len(crossparams) post: __old__.p1 is p1 __old__.p2 is p2 __old__.p1 == p1 __old__.p2 == p2 len(__return__) == 1 isinstance(__return__, Individual) len(__return__)==len(p1) all(len(c)==len(p1[i]) for i,c in enumerate(__return__.chromosomes)) all(len(c)==len(p1[i]) for i,c in enumerate(__return__.chromosomes)) """ answer = Individual([]) for i, (crossfunc, crossparams) in enumerate(zip(crossfuncs, crossparams)): answer.append(crossfunc(p1[i], p2[i], *crossparams)) return answer
def crossOnes(p1, p2, chrom): """ Length preserving one-point crossover of chromosome at index chrom Tuple containing two new children is returned pre: isinstance(p1, Individual) isinstance(p2, Individual) isinstance(chrom, int) post[p1, p2, chrom]: isinstance(__return__, tuple) # returns a tuple len(__return__) == 2 forall(__return__, lambda e: isinstance(e, Individual)) # return-tuple is made of Individuals forall(__return__[0].chromosomes, lambda c: isinstance(c, list)) forall(__return__[1].chromosomes, lambda c: isinstance(c, list)) forall(__return__[0][chrom], lambda L: forall(L, lambda elem: elem in p1[chrom] or elem in p2[chrom])) forall(__return__[1][chrom], lambda L: forall(L, lambda elem: elem in p1[chrom] or elem in p2[chrom])) forall(__return__, lambda L: id(L) not in [id(p1), id(p2)]) # elements in the return-tuple do not have the same memory addresses as the inputs p1 == __old__.p1 p2 == __old__.p2 """ c1, c2 = p1[chrom], p2[chrom] crosspoint = randint(0, len(c1)-1) child1 = c2[:crosspoint]+c1[crosspoint:] child2 = c1[:crosspoint]+c2[crosspoint:] answer1 = Individual(p1.chromosomes[:]) answer1[chrom] = child1 answer2 = Individual(p2.chromosomes[:]) answer2[chrom] = child2 return answer1, answer2
def genPop(N, chromGenfuncs, chromGenParams): """ Return a population (list) of N unique individuals. Each individual has len(chromgGenFuncs) chromosomes. For each individual, chromosome_i is generated by calling chromGenFuncs_i(chromeGenParams_i) pre: N >= 0 isinstance(chromGenfuncs, list) isinstance(chromGenParams, list) len(chromGenfuncs) == len(chromGenParams) post: isinstance(__return__, list) len(__return__) == N forall(__return__, lambda indiv: __return__.count(indiv) == 1) post[chromGenfuncs, chromGenParams]: __old__.chromGenfuncs == chromGenfuncs __old__.chromGenParams == chromGenParams """ answer = set() chromGens = zip(chromGenfuncs, chromGenParams) while len(answer) < N: indiv = Individual([]) for genfunc, genparams in chromGens: indiv.append(genfunc(*genparams)) answer.add(indiv) return list(answer)
def genPop(N, chromGenfuncs, chromGenParams): """ Return a population (list) of N unique individuals. Each individual has len(chromgGenFuncs) chromosomes. For each individual, chromosome_i is generated by calling chromGenFuncs_i(chromeGenParams_i) pre: N >= 0 isinstance(chromGenfuncs, list) isinstance(chromGenParams, list) len(chromGenfuncs) == len(chromGenParams) post: isinstance(__return__, list) len(__return__) == N forall(__return__, lambda indiv: __return__.count(indiv) == 1) post[chromGenfuncs, chromGenParams]: __old__.chromGenfuncs == chromGenfuncs __old__.chromGenParams == chromGenParams """ answer = set() chromGens = zip(chromGenfuncs, chromGenParams) while len(answer) < N: indiv = Individual([]) for genfunc, genparams in chromGens: indiv.append(genfunc(*genparams)) answer.add(indiv) return list(answer)
def revmut(p, chrom): """ Choose a random pair of points on the chromosome. Reverse the order of the genes between those two points on the chromosome pre: isinstance(p, Individual) isinstance(chrom, int) (0 <= chrom <= len(p.chromosomes)-1) ^ (len(p.chromosomes)*-1 <= chrom <= -1) post[p, chrom]: __old__.p == p __old__.chrom == chrom isinstance(__return__, Individual) forall(p.chromosomes[chrom], lambda e: e in __return__.chromosomes[chrom]) forall(__return__.chromosomes[chrom], lambda e: e in p.chromosomes[chrom]) """ pp = p p = p[chrom] answer = [] a, b = sample(range(len(p)), 2) if a > b: a, b = b, a answer.extend(p[:a]) answer.extend(p[a:b + 1][::-1]) answer.extend(p[b + 1:]) indiv = Individual(pp.chromosomes[:]) indiv[chrom] = answer return indiv
def mutateSingleAllele(p, chrom, chars): """ get the `chrom`th chromosome of the Individual p. Replace a random gene in this chromosome with a different allele from chars Precondition: p[chrom] should be castable into a list Return a new individual. Do not destroy the input pre: isinstance(p, Individual) isinstance(chrom, int) forall(p.chromosomes[chrom], lambda e: e in chars) (0 <= chrom <= len(p.chromosomes)-1) ^ (len(p.chromosomes)*-1 <= chrom <= -1) post[p, chrom]: __old__.p == p __old__.chrom == chrom __return__ is not p __return__ != p __return__.chromosomes != __old__.p.chromosomes forall(__return__.chromosomes[chrom], lambda e: e in chars) forall([i for i in range(len(p.chromosomes)) if i!=chrom], lambda c: __old__.p.chromosomes[i]==__return__.chromosomes[i]) """ chromosome = p[chrom][:] gene = randint(0, len(chromosome) - 1) allele = choose([i for i in chars if i != chromosome[gene]]) chromosome = chromosome[:gene] + [allele] + chromosome[gene + 1:] answer = Individual(p.chromosomes[:]) answer[chrom] = chromosome return answer
def mutate1(p, s, Y): """ get the `chrom`th chromosome of the Individual p. Replace a random gene in this chromosome with a different allele from chars Precondition: p[chrom] should be castable into a list Return a new individual. Do not destroy the input pre: isinstance(p, Individual) isinstance(chrom, int) forall(p.chromosomes[chrom], lambda e: e in chars) (0 <= chrom <= len(p.chromosomes)-1) ^ (len(p.chromosomes)*-1 <= chrom <= -1) post[p, chrom]: __old__.p == p __old__.chrom == chrom __return__ is not p __return__ != p __return__.chromosomes != __old__.p.chromosomes forall(__return__.chromosomes[chrom], lambda e: e in chars) forall([i for i in range(len(p.chromosomes)) if i!=chrom], lambda c: __old__.p.chromosomes[i]==__return__.chromosomes[i]) """ ''' chromosome = p[chrom][:] gene = randint(0, len(chromosome)-1) allele = choose([i for i in chars if i!= chromosome[gene]]) chromosome = chromosome[:gene] + [allele] + chromosome[gene+1:] answer = Individual(p.chromosomes[:]) answer[chrom] = chromosome return answer ''' clf = p.chromosomes[0] mat = clf.theta_ for i in range(0, len(mat)): for j in range(0, len(mat[0])): if random.random() < 0.5: mat[i][j] = 0.5 * mat[i][j] else: mat[i][j] = 2 * mat[i][j] clf.theta_ = mat p.chromosomes[0] = clf answer = Individual(p.chromosomes[:]) return answer
def twoChildCrossover(p1, p2, crossfuncs, crossparams): """ Crossover all the chromosomes in the two individuals. The crossover function for each pair of corresponding chromosomes is the the corresponding element in crossfuncs, called with the corresponding tuple in crossparams. Note that it is assumed that each crossover function in crossfuncs returns two child chromosomes pre: isinstance(p1, Individual) isinstance(p2, Individual) len(p1) == len(p2) len(p1) == len(crossfuncs) len(crossfuncs) == len(crossparams) forall(crossparams, lambda params: isinstance(params, tuple)) post: __old__.p1 is p1 __old__.p2 is p2 __old__.p1 == p1 __old__.p2 == p2 len(__return__) == 2 forall(_return__, lambda p: isinstance(p, Individual)) forall(__return__, lambda p: len(p)==len(p1)) forall(__return__, lambda p: all(len(c)==len(p1[i]) for i,c in enumerate(p.chromosomes))) forall(__return__, lambda p: all(len(c)==len(p2[i]) for i,c in enumerate(p.chromosomes))) """ c1, c2 = Individual([]), Individual([]) for i, (crossfunc, crossparams) in enumerate(list(zip(crossfuncs, crossparams))): chrom1, chrom2 = crossfunc(p1[i], p2[i], *crossparams) c1.append(chrom1) c2.append(chrom2) return c1, c2
def twoChildCrossover(p1,p2, crossfuncs, crossparams): """ Crossover all the chromosomes in the two individuals. The crossover function for each pair of corresponding chromosomes is the the corresponding element in crossfuncs, called with the corresponding tuple in crossparams. Note that it is assumed that each crossover function in crossfuncs returns two child chromosomes pre: isinstance(p1, Individual) isinstance(p2, Individual) len(p1) == len(p2) len(p1) == len(crossfuncs) len(crossfuncs) == len(crossparams) forall(crossparams, lambda params: isinstance(params, tuple)) post: __old__.p1 is p1 __old__.p2 is p2 __old__.p1 == p1 __old__.p2 == p2 len(__return__) == 2 forall(_return__, lambda p: isinstance(p, Individual)) forall(__return__, lambda p: len(p)==len(p1)) forall(__return__, lambda p: all(len(c)==len(p1[i]) for i,c in enumerate(p.chromosomes))) forall(__return__, lambda p: all(len(c)==len(p2[i]) for i,c in enumerate(p.chromosomes))) """ c1, c2 = Individual([]), Individual([]) for i, (crossfunc, crossparams) in enumerate(zip(crossfuncs, crossparams)): chrom1, chrom2 = crossfunc(p1[i], p2[i], *crossparams) c1.append(chrom1) c2.append(chrom2) return c1, c2
def genCharsChrom(genNum): """ Return chromosome (list) of length l, each of which is made up of the characters from chars. pre: isinstance(l, int) hasattr(chars, '__getitem__') hasattr(chars, '__len__') len(chars) > 0 post[l, chars]: __old__.l == l __old__.chars == chars len(__return__) == l forall(__return__, lambda a: a in chars) """ l = np.random.random_integers(0,49,20) for i in range(0,50): if Y[i] == 1: #print("!!!!!!") l = np.append(l,[i]) break for i in range(0,50): if Y[i] == -1: #print("######") l = np.append(l,[i]) break x = X[l] y = Y[l] clf = GaussianNB() clf = clf.partial_fit(x,y,[1,-1]) return Individual([clf,genNum])
def swapmut(p, chrom): """ Pick any two random cities and swap their positions in the tour pre: isinstance(p, Individual) isinstance(chrom, int) (0 <= chrom <= len(p.chromosomes)-1) ^ (len(p.chromosomes)*-1 <= chrom <= -1) post[p, chrom]: __old__.p == p __old__.chrom == chrom isinstance(__return__, Individual) forall(p.chromosomes[chrom], lambda e: e in __return__.chromosomes[chrom]) forall(__return__.chromosomes[chrom], lambda e: e in p.chromosomes[chrom]) sum(i!=j for i,j in zip(__return__[chrom], p[chrom])) == 2 """ answer = Individual(p.chromosomes[:]) p = answer[chrom][:] i, j = sample(range(len(p)), 2) p[i], p[j] = p[j], p[i] answer[chrom] = p return answer
def mutate2(p, s, Y): clf = p.chromosomes[0] pri1 = clf.class_prior_ pri2 = [sum(Y == 1), sum(Y == -1)] su = sum(pri2) pri2 = np.array(pri2) pri2 = pri2 / (1.0 * su) pr = s * pri1 + (1 - s) * pri2 clf.class_prior_ = pr p.chromosomes[0] = clf answer = Individual(p.chromosomes[:]) return answer
def shufflemut(p, chrom): """ pre: isinstance(p, Individual) isinstance(chrom, int) (0 <= chrom <= len(p.chromosomes)-1) ^ (len(p.chromosomes)*-1 <= chrom <= -1) post[p, chrom]: __old__.p == p __old__.chrom == chrom isinstance(__return__, Individual) __return__.chromosomes[chrom] != p.chromosomes[chrom] forall(p.chromosomes[chrom], lambda e: e in __return__.chromosomes[chrom]) forall(__return__.chromosomes[chrom], lambda e: e in p.chromosomes[chrom]) len(__return__.chromsomes[chrom]) == len(p.chromosomes[chrom]) """ pp = p p = p[chrom][:] shuffle(p) answer = Individual(pp.chromosomes[:]) answer[chrom] = p return answer
def injectionco(p1, p2, chrom): """ pre: isinstance(p1, Individual) isinstance(p2, Individual) isinstance(chrom, int) forall(p1, lambda elem: any(isinstance(elem, i.__class__) for i in p2)) forall(p2, lambda elem: any(isinstance(elem, i.__class__) for i in p1)) len(p1) == len(p2) post[p1, p2]: p1 == __old__.p1 p2 == __old__.p2 post: isinstance(__return__, p1.__class__) # returns an individual len(__return__) == len(p1) id(__return__) not in [id(p1), id(p2)] forall(__return__.chromosomes[0], lambda elem: __return__.count(elem, 0) == 1) """ pp1, _pp2 = p1, p2 p1, p2 = p1[chrom], p2[chrom] answer = [None for _ in xrange(len(p1))] a,b = sample(range(len(p1)), 2) if a > b: a,b = b,a ab = p1[a:b] answer[a:b] = ab remainder = [city for city in p2 if city not in ab] for i in xrange(a): answer[i] = remainder.pop(0) for i in xrange(b, len(answer)): answer[i] = remainder.pop(0) indiv = Individual(pp1.chromosomes[:]) indiv[chrom] = answer return indiv