import numpy as np
size=10
UPPER_BOUND=4
LOWER_BOUND=0
deviation=0.25
num_offspring=3
num_iter=30
def check_bound(x):
if x<LOWER_BOUND:
return LOWER_BOUND
if x>UPPER_BOUND:
return UPPER_BOUND
return x
def fitness(x):
return -x*(x-1)*(x-2)*(x-3)*(x-4)
def get_birth(x,y):
child = (x+y)*0.5
child = child + np.random.normal(0,deviation)
return check_bound(child)
#init
population = np.random.uniform(LOWER_BOUND,UPPER_BOUND,size)
for iter in range(num_iter):
population.sort(key=lambda x:fitness(x))
#offspring
offspring=[]
mother=population[-num_offspring*2::2]
father=population[-num_offspring*2+1::2]
offspring=[]
for x,y in zip(mother,father)
offspring.append(get_birth(x,y))
population=population.extend(offspring)
#die
population.sort(key=lambda x:fitness(x))
population=population[-size:]
print(population)