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的类,它包含了遗传算法的各个步骤。我们在____方法中初始化遗传算法参数。initialize_population方法中,我们使用numpy库的random.randint函数初始化种群。在evaluate_population方法中,我们使用numpy库的apply_along_axis函数评估种群适应度。在select_parents方法中,我们使用轮盘赌选择法选择父代。在c_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函数可视化遗传算法进化过程。
示例说明
示例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函数可视化遗传算法进化过程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 遗传算法求函数极值的实现代码 - Python技术站