确定遗传
在元素个体,遗传得到的个体和变异个体中选取最好的30个个体(对应的函数值最大的30个个体)作为下一次迭代的父样本。
from random import randint
from numpy import sin
def decode(g):
return [((g&0xfff) - 2048) * 0.001, ((g>>12) - 2048) * 0.001]
def function_g(g):
x = decode(g)
return function(x[0], x[1])
def function(x, y):
return 100 * (sin(x) ** 2 - sin(y)) ** 2 + (1 - sin(x)) ** 2
def cmp(g1, g2):
key = function_g(g1) - function_g(g2)
if key > 0: return 1
elif key < 0: return -1
else: return 0
def GA(num = 30, round = 10):
gene = [randint(0, (1<<24) - 1) for i in range(num)]
rnd = 0
while rnd < round:
rnd += 1
gene_c = [g ^ (1<
gene_h = []
for g1 in gene:
for g2 in gene:
mask = (1<
gene_h.append(g2 & ~mask | g1 & mask)
gene_h.append(g1 & ~mask | g2 & mask)
gene_tot = gene + gene_h + gene_c
gene_tot.sort(cmp = cmp, reverse = True)
gene = gene_tot[:num]
print "round", rnd, ":", decode(gene[0]), function_g(gene[0])
return decode(gene[0]) + [function_g(gene[0])]
if __name__ == '__main__':
print GA(30, 10),
结果
经过10得到如下结果, 每一行的三个数字分别对应x, y, f(x, y)
round 1 : [1.571, -1.464] 397.724305554
round 2 : [1.571, -1.539] 399.797824716
round 3 : [-1.605, -1.548] 403.426161017
round 4 : [-1.605, -1.556] 403.486264841
round 5 : [-1.541, -1.591] 403.561685598
round 6 : [-1.541, -1.575] 403.639747518
round 7 : [-1.573, -1.579] 403.984587994
round 8 : [-1.573, -1.571] 403.998039526
round 9 : [-1.569, -1.571] 403.998694536
round 10 : [-1.569, -1.571] 403.998694536