用遗传算法求f(x)=xcosx+2的最大值,给出具体代码
时间: 2024-11-03 16:23:50 浏览: 28
遗传算法是一种模拟自然选择过程的优化算法,用于解决复杂的全局优化问题。对于函数f(x) = x*cos(x) + 2 的最大值搜索,我们可以建立一个简单的遗传算法模型。首先,我们需要定义以下几个关键部分:
1. **编码**:假设我们使用实数编码,每个个体代表一个可能的解(x值),范围可以设置为 -10 到 10。
2. **适应度函数**:在这个例子中,适应度就是函数 f(x) 的值,目标是最小化负适应度(因为我们通常寻求最大化目标函数)。
3. **选择、交叉和变异**:选择优秀的个体进行繁殖,通过交叉操作生成新个体,并引入一些随机变异以保持多样性。
以下是一个基本的Python遗传算法示例(使用DEAP库):
```python
import numpy as np
from deap import base, creator, tools
# 定义问题参数
creator.create("FitnessMax", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
def eval_fitness(individual):
x = individual[0]
return (-individual[0] * np.cos(x) - 2,)
toolbox = base.Toolbox()
toolbox.register("attr_float", random.uniform, -10.0, 10.0)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=1)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox.register("evaluate", eval_fitness)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutGaussian, mu=0.0, sigma=1.0, indpb=0.5)
toolbox.register("select", tools.selTournament, tournsize=3)
def genetic_algorithm(pop_size, max_gen):
pop = toolbox.population(n=pop_size)
hof = tools.HallOfFame(1)
for gen in range(max_gen):
# 评估当前种群
fits = [toolbox.evaluate(ind) for ind in pop]
# 更新适应度并排序
for ind, fit in zip(pop, fits):
ind.fitness.values = fit
# 选择、交叉和变异
offspring = toolbox.select(pop, len(pop))
offspring = [toolbox.clone(ind) for ind in offspring]
for child1, child2 in zip(offspring[::2], offspring[1::2]):
if np.random.rand() < 0.7:
toolbox.mate(child1, child2)
del child1.fitness.values
del child2.fitness.values
for mutant in offspring:
if np.random.rand() < 0.2:
toolbox.mutate(mutant)
del mutant.fitness.values
# 拥挤淘汰
invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fits = toolbox.map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fits):
ind.fitness.values = fit
# 更新种群和 hall of fame
pop[:] = offspring
hof.update(pop)
best_individual = hof[0]
return best_individual, hof[0].fitness.values[0]
# 调用遗传算法
best_solution, max_value = genetic_algorithm(pop_size=100, max_gen=1000)
print(f"最优解 x={best_solution[0]}, 最大值 f(x)={max_value}")
```
请注意,这只是一个基础示例,实际应用中可能需要根据具体情况进行调整,如选择概率、交叉点数等参数。
阅读全文