Python遗传算法求三角函数最小值
时间: 2024-12-15 07:29:05 浏览: 23
Python遗传算法是一种模拟自然选择过程的优化方法,它通常用于解决复杂优化问题,包括求解数学函数的最小值。对于三角函数如正弦、余弦等的最小值,可以设计成一个问题实例:
首先,你需要定义适应度函数,这里我们可以用三角函数的绝对值作为目标,因为你想找到其取最小值的地方。例如,假设我们想找`f(x) = |sin(x)|`的最小值,那么适应度函数可以设置为`fitness(x) = abs(sin(x))`。
```python
import numpy as np
from scipy.optimize import minimize
from deap import base, creator, tools
# 创建遗传算法基础结构
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)
def eval_fitness(individual):
x = individual[0]
return abs(np.sin(x)),
toolbox = base.Toolbox()
toolbox.register("attr_float", np.random.uniform, -np.pi, np.pi)
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, sigma=0.1, indpb=0.05)
toolbox.register("select", tools.selTournament, tournsize=3)
# 遗传算法核心部分
def main():
pop = toolbox.population(n=50)
hof = tools.HallOfFame(1)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", np.mean)
stats.register("min", np.min)
for gen in range(100): # 迭代次数
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]
fitnesses = map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
pop[:] = offspring
hof.update(pop)
best_solution = hof[0][0] # 返回当前最优解x值
min_value = abs(np.sin(best_solution)) # 最小值
print(f"Best solution after {gen} generations: {best_solution}, with minimum value: {min_value}")
if __name__ == "__main__":
main()
```
运行这段代码后,你会得到`|sin(x)|`的一个近似最小值。注意这只是一个简化示例,实际应用可能需要调整参数、种群大小和其他细节。
阅读全文
相关推荐


















