第1关:遗传算法求解函数最值
编程要求
在右侧编辑器补充代码,实现遗传算法。并求解函数f(x)在区间[0,5]上的最大值:
f(x)=xsin(10x)+xcos(2x)
函数图像如下:
测试说明
平台会调用你实现的方法,求解函数最优解,若你求得最优解与正确答案绝对值小于0.1则视为通关,否则输出你求得的最优解。
开始你的任务吧,祝你成功!
#encoding=utf8
import numpy as np
DNA_SIZE = 10 # 染色体大小
POP_SIZE = 100 # 种群大小
CROSS_RATE = 0.8 # 交叉概率
MUTATION_RATE = 0.003 # 变异概率
N_GENERATIONS = 1000 # 进化次数
X_BOUND = [0, 5] # 变量范围
# 获取染色体适应度
def get_fitness(pred):
return pred + 1e-3 - np.min(pred)
# 解码
def translateDNA(pop):
return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2**DNA_SIZE - 1) * X_BOUND[1]
# 选择适应度高的染色体
def select(pop, fitness):
idx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True,
p=fitness / fitness.sum())
return pop[idx]
# 交叉
def crossover(parent, pop):
if np.random.rand() < CROSS_RATE:
i_ = np.random.randint(0, POP_SIZE, size=1)
cross_points = np