Python遗传算法求函数极值的实现代码
遗传算法是一种常用的优化算法,它可以用于求解函数极值。在本文中,我们将介绍如何使用Python实现遗传算法求函数极值。我们将分为以下几个步骤:
- 导入必要的库
- 定义适应度函数
- 定义遗传算法类
- 示例说明
步骤1:导入必要的库
实现遗传算法之前,我们需要导入必要的库。在这个例子中,我们将使用numpy库进行数值计算,random库进行随机数生成,matplotlib库进行可视化。我们可以使用以下代码导入这些库:
import numpy as np
import random
import matplotlib.pyplot as plt
步骤2:定义适应度函数
在实现遗传算法之前,我们需要定义适应度函数。在这个例子中,我们将使用一个简单的函数f(x) = x^2作为适应度函数。我们可以使用以下代码定义适应度函数:
def fitness_function(x):
return x ** 2
在这个示例中,我们定义了一个名为fitness_function的函数,它接受一个参数x,并返回x的平方。
步骤3:定义遗传算法类
在定义适应度函数之后,我们可以开始实现遗传算法。在这个例子中,我们实现一个名为GeneticAlgorithm的类,该类包含以下方法:
- init:初始化遗传算法参数
- initialize_population:初始化种群
- evaluate_population:评估种群适应度
- select_parents:选择父代
- crossover_parents:交叉父代
- mutate_offspring:变异后代
- evolve_population:进化种群
- run:运行遗传算法
我们可以使用以下代码实现GeneticAlgorithm类:
class GeneticAlgorithm:
def __init__(self, fitness_function, population_size, chromosome_length, mutation_rate, crossover_rate):
self.fitness_function = fitness_function
self.population_size = population_size
self.chromosome_length = chromosome_length
self.mutation_rate = mutation_rate
self.crossover_rate = crossover_rate
self.population = None
self.fitness_values = None
self.best_individual = None
self.best_fitness = None
def initialize_population(self):
self.population = np.random.randint(2, size=(self.population_size, self.chromosome_length))
def evaluate_population(self):
self.fitness_values = np.apply_along_axis(self.fitness_function, 1, self.population)
def select_parents(self):
fitness_sum = np.sum(self.fitness_values)
probabilities = self.fitness_values / fitness_sum
parent_indices = np.random.choice(self.population_size, size=self.population_size, p=probabilities)
return self.population[parent_indices]
def crossover_parents(self, parents):
offspring = np.zeros_like(parents)
for i in range(self.population_size):
if np.random.rand() < self.crossover_rate:
parent1_index = i
parent2_index = np.random.randint(self.population_size)
crossover_point = np.random.randint(self.chromosome_length)
offspring[i, :crossover_point] = parents[parent1_index, :crossover_point]
offspring[i, crossover_point:] = parents[parent2_index, crossover_point:]
else:
offspring[i] = parents[i]
return offspring
def mutate_offspring(self, offspring):
for i in range(self.population_size):
for j in range(self.chromosome_length):
if np.random.rand() < self.mutation_rate:
offspring[i, j] = 1 - offspring[i, j]
return offspring
def evolve_population(self):
parents = self.select_parents()
offspring = self.crossover_parents(parents)
offspring = self.mutate_offspring(offspring)
self.population = offspring
def run(self, num_generations):
self.initialize_population()
for i in range(num_generations):
self.evaluate_population()
best_index = np.argmax(self.fitness_values)
if self.best_individual is None or self.fitness_values[best_index] > self.best_fitness:
self.best_individual = self.population[best_index]
self.best_fitness = self.fitness_values[best_index]
self.evolve_population()
return self.best_individual, self.best_fitness
在这个示例中,我们首先定义了一个名为GeneticAlgorithm的类,它包含了遗传算法的各个步骤。我们在__init__方法中初始化遗传算法参数。initialize_population方法中,我们使用numpy库的random.randint函数初始化种群。在evaluate_population方法中,我们使用numpy库的apply_along_axis函数评估种群适应度。在select_parents方法中,我们使用轮盘赌选择法选择父代。在crossover_parents方法中,我们使用单点交叉法交叉父代。在mutate_offspring方法中,我们使用单点变异法变异后代。在evolve_population方法中,我们进化种群。在run方法中,我们运行遗传算法,并返回最佳个体和最佳适应度。
步骤4:示例说明
示例1:求解函数f(x) = x^2的最小值
在这个示例中,我们将使用遗传算求解函数f(x) = x^2的最小值。我们可以使用以下代码运行遗传算法:
ga = GeneticAlgorithm(fitness_function, population_size=100, chromosome_length=10, mutation_rate=0.01, crossover_rate=0.8)
best_individual, best_fitness = ga.run(num_generations=100)
print("Best individual:", best_individual)
print("Best fitness:", best_fitness)
在这个示例中,我们首先创建一个名为ga的GeneticAlgorithm对象,它表示遗传算法。我们使用fitness_function作为适应度函数设置种群大小为100,染色体长度为10,变异率为0.01,交叉率为0.8。然后,我们调用run方法运行遗传算法,并返回最佳个体和最佳适应度。最后,我们打印最佳个体和最佳适应度。
示例2:可视化遗传算法进化过程
在这个示例中,我们将使用matplotlib库可视化遗传算法进化过程。我们可以使用以下代码可视化遗传算法进化过程:
ga = GeneticAlgorithm(fitness_function, population_size=100, chromosome_length=10, mutation_rate=0.01, crossover_rate=0.8)
best_fitnesses = []
for i in range(100):
_, best_fitness = ga.run(num_generations=1)
best_fitnesses.append(best_fitness)
plt.plot(best_fitnesses)
plt.xlabel("Generation")
plt.ylabel("Best Fitness")
plt.show()
在这个示例中,我们首先创建一个名为ga的GeneticAlgorithm对象,它表示遗传算法。我们使用fitness_function作为适应度函数,设置种群大小为100,染色体长度为10,变异率为0.01,交叉率为0.8。然后,我们使用for循环运行遗传算法100次,并记录每次运行的最佳适应度。最后,我们使用matplotlib库的plot函数可视化遗传算法进化过程。