遗传算法的实例之一是寻找函数最大值的问题。我们可以使用遗传算法来求解函数 f(x) = 9*sin(5x) + cos(4x),在区间 [0,15] 内的最大值。
首先,我们随机初始化一个种群 P(t),每个个体表示为 x1, x2, …, xn。在这个例子中,我们可以将每个个体表示为一个由 0 和 1 组成的染色体,长度为 chromlength。
然后,我们计算种群 P(t) 中每个个体的适应度值,即函数 f(x) 的值。接下来,通过选择、交叉、变异等操作,从 P(t) 中选择出更优秀的个体,重组形成新的种群 P(t+1)。
这个过程会不断迭代,直到满足停止准则。在每一次迭代中,我们都会计算种群 P(t) 的适应度值,并通过遗传操作产生新的种群 P(t+1)。最终,适应度值最大的个体即为所求的解。
以下是使用Python实现遗传算法求解函数最大值的示例代码:
import numpy as np
# 定义目标函数
def f(x):
return 9 * np.sin(5 * x) + np.cos(4 * x)
# 遗传算法参数设置
chromlength = 10 # 染色体的长度
popsize = 50 # 种群大小
maxgen = 100 # 最大迭代次数
pc = 0.8 # 交叉概率
pm = 0.01 # 变异概率
# 初始化种群,生成一个随机二维数组
pop = np.random.randint(2, size=(popsize, chromlength))
# 主循环
for gen in range(maxgen):
# 计算适应度值
fitness = np.array([f(x) for x in pop])
# 选择操作
idx = np.random.choice(popsize, size=popsize, replace=True, p=fitness/fitness.sum())#用于从给定的一维数组或可迭代对象中随机抽样。它可以从给定的一维数组中随机抽取指定数量或指定概率的元素。
pop = pop[idx]
# 交叉操作
for i in range(1, popsize, 2):
if np.random.rand() < pc:
cross_point = np.random.randint(chromlength)#随机整数
temp = pop[i-1, :]
temp[cross_point:] = pop[i, cross_point:]
pop[i-1, :] = temp
temp = pop[i, :]
temp[cross_point:] = pop[i-1, cross_point:]#二维数组pop的第i-1个数组
pop[i, :] = temp
# 变异操作
for i in range(popsize):
if np.random.rand() < pm:
mutate_point = np.random.randint(chromlength)
pop[i, mutate_point] = 1 - pop[i, mutate_point]
# 输出最优解和最优值
max_fitness = fitness.max()
max_idx = np.argmax(fitness)
print("Generation %d: Max fitness=%f, Max value=%f" % (gen+1, max_fitness, f(pop[max_idx])))
以上代码中,我们首先定义了目标函数 f(x),然后设置了遗传算法的参数,包括染色体的长度、种群大小、最大迭代次数、交叉概率和变异概率。接着,我们随机初始化一个种群 pop,每个个体是一个由 0 和 1 组成的染色体。在主循环中,我们计算每个个体的适应度值,并使用选择操作、交叉操作和变异操作不断进化种群。最后,我们输出每一代的最优解和最优值。注意,以上代码仅为示例,实际应用中需要根据具体问题调整参数和策略。