📅  最后修改于: 2023-12-03 15:42:04.798000             🧑  作者: Mango
遗传算法是一种启发式优化算法,模拟达尔文进化论中的“自然选择”和“基因遗传”过程,通过不断生成和优化“个体”来寻找最优解。遗传算法主要由选择、交叉和变异三个核心操作组成。
遗传算法的基本原理如下:
初始化种群:生成初始的随机群体,每个个体包含多个基因,即一组固定的参数序列。
适应度函数:对每个个体进行适应度评估,在优化问题中适应度函数表示目标函数值,也就是要最大化或最小化的量。
选择操作:根据适应度函数对群体中的个体进行选择。优良的个体以较高的概率被保留下来,而劣质的个体被舍弃。
交叉操作:让保留下来的个体进行互相“杂交”,即生成新的个体。通过这一过程,能够将优秀的基因片段组合起来,从而形成更有利于求解问题的个体。
变异操作:对新生成的个体进行变异操作,随机改变某些基因的值。变异操作的目的是为了保证算法的多样性,即避免陷入局部最优解。
判断终止条件:如果达到了指定的终止条件,则停止算法。
重复选择、交叉、变异操作。直到满足终止条件。
以下是基于Python实现的示例代码,实现求解最小化目标函数$y = x^2$:
import random
# 目标函数
def obj_func(x):
return x ** 2
# 初始化种群
def init_population(population_size, gene_length):
population = []
for i in range(population_size):
gene = [random.randint(0, 1) for _ in range(gene_length)]
population.append(gene)
return population
# 变异操作
def mutation(population, mutation_probability):
for i in range(len(population)):
for j in range(len(population[i])):
if random.random() < mutation_probability:
population[i][j] = 1 - population[i][j]
# 交叉操作
def crossover(parent1, parent2):
crossover_point = random.randint(0, len(parent1) - 1)
child1 = parent1[:crossover_point] + parent2[crossover_point:]
child2 = parent2[:crossover_point] + parent1[crossover_point:]
return child1, child2
# 选择操作
def selection(population):
fitness_values = [obj_func(int(''.join(str(gene) for gene in gene_list), 2)) for gene_list in population]
total_fitness = sum(fitness_values)
relative_fitness = [fitness / total_fitness for fitness in fitness_values]
cumulative_prob = [sum(relative_fitness[:i + 1]) for i in range(len(relative_fitness))]
chosen_genes = []
for i in range(len(population)):
r = random.random()
for j in range(len(cumulative_prob)):
if r < cumulative_prob[j]:
chosen_genes.append(population[j])
break
return chosen_genes
# 主函数
def genetic_algorithm(population_size, gene_length, mutation_probability, num_generations):
population = init_population(population_size, gene_length)
for i in range(num_generations):
parent1 = selection(population)[0]
parent2 = selection(population)[1]
child1, child2 = crossover(parent1, parent2)
population.remove(parent1)
population.remove(parent2)
population.append(child1)
population.append(child2)
mutation(population, mutation_probability)
best_gene = max(population, key=lambda gene_list: obj_func(int(''.join(str(gene) for gene in gene_list), 2)))
return best_gene, obj_func(int(''.join(str(gene) for gene in best_gene), 2))
# 示例运行
if __name__ == '__main__':
best_gene, best_fitness = genetic_algorithm(population_size=10, gene_length=5, mutation_probability=0.1, num_generations=10)
print(f'最优解:{best_gene}', f'最优值:{best_fitness}', sep='\n')
遗传算法是一种通用的优化算法,适用于大多数问题。它具有较好的可扩展性,能够处理高维度问题,非线性及非凸优化问题,但也存在收敛慢、易陷入局部最优等问题。因此,在使用遗传算法求解问题时需要结合具体问题来进行调整。