📅  最后修改于: 2023-12-03 15:28:29.163000             🧑  作者: Mango
遗传算法(Genetic Algorithm)是一种基于自然界生物进化机制的搜索优化算法,由约翰·霍兰德(John Holland)于1975年提出。它是一种随机化的算法,通过对一组解(称为种群)进行演化,逐步进化出更好的解。
初始化种群
首先,需要初始化一个包含若干个个体(解)的初始种群。每个个体可以看做是一组解向量,其中每个解向量都是问题的一个变量。通常情况下,种群大小会设置成50到200个,种群中的个体是随机生成的。
适者生存(Fitness Evaluation)
对于每个个体,在问题给定的评价标准下,计算它们的适应度(Fitness)。适应度是一个综合评价指标,通常由多个评价指标组成,可通过加权平均等方法进行计算。
选择(Selection)
选择的目的是从种群中挑选适应度最好的个体作为“父代”,用于交叉和变异产生新的个体。种群中适应度高的个体被选中的概率更大,在遗传算法中有多种选择方式,如轮盘赌、锦标赛等。
交叉(Crossover)
将选出的两个“父代”个体进行“杂交”,产生两个新的“子代”个体,作为下一代种群的成员。交叉操作是通过对父代解向量的其中一部分进行组合来实现的。
变异(Mutation)
在产生新的“子代”个体时,有一定概率对其进行变异操作。变异操作一般是对解向量的某个分量增加或减去一个随机量,以增加种群的多样性。
重新评估适应度
在完成交叉和变异之后,对新种群中的所有个体重新计算适应度。
判断终止条件
如果满足终止条件,则停止演化,并返回最优解;否则重复步骤2-7,直到满足终止条件。
遗传算法的实现需要编写适应度函数、选择函数、交叉、变异等各个子函数,在Python中可以使用numpy和random库快速实现。下面是一个简单的遗传算法示例代码:
import numpy as np
import random
def fitness_func(x):
# 适应度函数
return np.sum(np.power(x, 2) - 10 * np.cos(2 * np.pi * x)) + 10 * len(x)
def select(population, fitness_values):
# 轮盘赌选择
fitness_sum = np.sum(fitness_values)
probs = fitness_values / fitness_sum
selected_indices = np.random.choice(np.arange(len(population)), size=len(population), replace=True, p=probs)
return [population[i] for i in selected_indices]
def crossover(parent1, parent2):
# 两点交叉操作
point1 = random.randint(0, len(parent1) - 1)
point2 = random.randint(point1, len(parent1) - 1)
child1 = np.concatenate([parent1[:point1], parent2[point1:point2], parent1[point2:]])
child2 = np.concatenate([parent2[:point1], parent1[point1:point2], parent2[point2:]])
return [child1, child2]
def mutate(individual, mutation_rate):
# 每个变量都以mutation_rate的概率发生变异
for i in range(len(individual)):
if random.random() < mutation_rate:
individual[i] += random.uniform(-0.5, 0.5)
return individual
def genetic_algorithm(population_size, chromosome_length, mutation_rate, num_generations):
# 初始化种群
population = np.random.uniform(-5.12, 5.12, size=(population_size, chromosome_length))
best_fitness = float('inf')
best_individual = None
# 开始迭代
for i in range(num_generations):
# 选择
fitness_values = [fitness_func(individual) for individual in population]
selected_population = select(population, fitness_values)
# 交叉
children = []
for j in range(0, len(selected_population) - 1, 2):
parent1 = selected_population[j]
parent2 = selected_population[j + 1]
child1, child2 = crossover(parent1, parent2)
children.extend([mutate(child1, mutation_rate), mutate(child2, mutation_rate)])
# 更新种群
population = children
fitness_values = [fitness_func(individual) for individual in population]
min_fitness = min(fitness_values)
if min_fitness < best_fitness:
best_fitness = min_fitness
best_individual = population[np.argmin(fitness_values)]
return best_individual, best_fitness
我们可以使用该遗传算法代码求解函数(z_ax^2-10cos(2pi*x)+10),其中x的取值范围为[-5.12, 5.12]:
individual, fitness = genetic_algorithm(50, 20, 0.05, 200)
print('Best individual:', individual)
print('Best fitness:', fitness)
遗传算法作为一种常用的优化算法,可用于求解各种类型的问题,特别是那些复杂难以求解的问题。在实际使用中,我们需要根据具体问题进行参数的调整和算法的改进,以取得更好的求解效果。