简介
遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传机制的优化算法,由 John Holland 于20世纪70年代提出。它是一种模拟生物进化过程的启发式搜索算法,被广泛应用于函数优化、机器学习、调度问题等领域。
代码说明
参数定义:
设置种群大小、基因长度、最大代数、交叉概率、变异概率等参数。
适应度函数:
目标函数为 f(x)=x^2 ,即计算个体的适应度值。
初始化种群:
随机生成一个种群,每个个体用 5 位二进制编码,表示范围[0,31]的整数。
选择操作(selection):
使用轮盘赌选择方法,根据适应度值的比例概率挑选个体。
交叉操作(crossover):
使用单点交叉,将两个父代基因部分交换生成子代。
变异操作(mutate):
以一定概率随机翻转个体的某个位,模拟基因突变。
主循环:
每一代执行以下操作:
计算每个个体的适应度值。
记录本代中适应度最高的个体。
执行选择、交叉和变异操作生成下一代种群。
重复直到达到指定代数。
结果输出与可视化:
打印每代的最佳适应度及个体。
绘制代数与最佳适应度的变化趋势图。
代码
import random
import matplotlib.pyplot as plt
# 遗传算法参数
POPULATION_SIZE = 10 # 种群大小
GENE_LENGTH = 5 # 基因长度
GENERATIONS = 20 # 最大代数
CROSSOVER_RATE = 0.8 # 交叉概率
MUTATION_RATE = 0.1 # 变异概率
# 适应度函数
def fitness_function(x):
return x ** 2
# 初始化种群(随机生成二进制字符串)
def initialize_population():
return [random.randint(0, 2**GENE_LENGTH - 1) for _ in range(POPULATION_SIZE)]
# 个体解码(二进制 -> 十进制)
def decode(individual):
return individual
# 选择操作(轮盘赌选择)
def selection(population, fitness_values):
total_fitness = sum(fitness_values)
probabilities = [f / total_fitness for f in fitness_values]
cumulative_probs = [sum(probabilities[:i+1]) for i in range(len(probabilities))]
selected = []
for _ in range(POPULATION_SIZE):
r = random.random()
for i, cumulative_prob in enumerate(cumulative_probs):
if r <= cumulative_prob:
selected.append(population[i])
break
return selected
# 交叉操作
def crossover(parent1, parent2):
if random.random() < CROSSOVER_RATE:
point = random.randint(1, GENE_LENGTH - 1)
mask = (1 << point) - 1
child1 = (parent1 & mask) | (parent2 & ~mask)
child2 = (parent2 & mask) | (parent1 & ~mask)
return child1, child2
return parent1, parent2
# 变异操作
def mutate(individual):
for i in range(GENE_LENGTH):
if random.random() < MUTATION_RATE:
individual ^= (1 << i) # 翻转某个位
return individual
# 遗传算法主程序
def genetic_algorithm():
# 初始化种群
population = initialize_population()
best_fitness_history = [] # 每一代的最佳适应度记录
for generation in range(GENERATIONS):
# 计算适应度
fitness_values = [fitness_function(decode(ind)) for ind in population]
best_fitness = max(fitness_values)
best_fitness_history.append(best_fitness) # 记录当前代的最佳适应度
# 打印每代的最佳结果
best_individual = population[fitness_values.index(best_fitness)]
print(f"Generation {generation + 1}: Best fitness = {best_fitness}, Best individual = {best_individual} (Decoded: {decode(best_individual)})")
# 选择操作
selected_population = selection(population, fitness_values)
# 交叉操作
next_generation = []
for i in range(0, POPULATION_SIZE, 2):
parent1 = selected_population[i]
parent2 = selected_population[(i + 1) % POPULATION_SIZE]
child1, child2 = crossover(parent1, parent2)
next_generation.extend([child1, child2])
# 变异操作
population = [mutate(ind) for ind in next_generation]
# 返回结果和适应度历史
final_fitness_values = [fitness_function(decode(ind)) for ind in population]
best_individual = population[final_fitness_values.index(max(final_fitness_values))]
return best_individual, max(final_fitness_values), best_fitness_history
# 运行遗传算法
best_individual, best_fitness, fitness_history = genetic_algorithm()
# 打印最优结果
print(f"Optimal solution: {best_individual} (Decoded: {decode(best_individual)}), Fitness: {best_fitness}")
# 绘制统计图
plt.figure(figsize=(10, 6))
plt.plot(range(1, GENERATIONS + 1), fitness_history, marker='o', linestyle='-', color='b', label='Best Fitness')
plt.title("Genetic Algorithm Convergence", fontsize=14)
plt.xlabel("Generation", fontsize=12)
plt.ylabel("Fitness Value", fontsize=12)
plt.grid(True)
plt.legend()
plt.show()