Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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
Exemplo n.º 11
0
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])
Exemplo n.º 12
0
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
Exemplo n.º 13
0
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
Exemplo n.º 14
0
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
Exemplo n.º 15
0
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