遗传算法的浅析与实践示例
遗传算法(Genetic Algorithm, GA)是一种启发式搜索和优化技术,借鉴了自然选择和遗传学原理。它通常用于复杂的优化问题,特别是在传统算法难以应用的空间中。以下是关于遗传算法的浅析与一个简单的实践示例。
遗传算法的基本概念
个体与种群:
- 个体:问题的一个潜在解决方案,通常用一个字符串或数组表示,这些字符串叫做染色体。
- 种群:多个个体的集合。
适应度函数:
- 评估个体“优秀”程度的函数,或者说个体解决问题的质量。
选择:
- 通过适应度值选择个体参与繁殖,常用的方法有轮盘赌选择、锦标赛选择等。
交叉(重组):
- 将两个或多个个体的染色体排列组合,生成新个体。
变异:
- 随机改变染色体值来增加多样性和探索种群空间。
迭代:
- 向终止条件(如达到适应度门限或最大迭代次数)趋近。
遗传算法的实践示例
假设我们要解决一个简单的优化问题:最大化以下函数( f(x) = x^2 ),其中 ( x ) 为整数且范围是 [0, 31]。
步骤
编码:
- 用5位二进制字符串表示每个整数,因为 ( 2^5 = 32 ),能表示0到31。
初始种群:
import random
def random_chromosome(length=5):
return ''.join(random.choice('01') for _ in range(length))
population = [random_chromosome() for _ in range(6)] # 初始种群6个个体
适应度函数:
def fitness(chromosome):
x = int(chromosome, 2)
return x * x # 即 f(x) = x^2
选择(以轮盘赌为例):
def select_pair(population):
total_fitness = sum(fitness(chromo) for chromo in population)
selection_probs = [fitness(chromo) / total_fitness for chromo in population]
return random.choices(population, weights=selection_probs, k=2)
交叉:
def crossover(chromo1, chromo2, crossover_rate=0.7):
if random.random() < crossover_rate:
point = random.randint(1, len(chromo1) - 1)
new_chromo1 = chromo1[:point] + chromo2[point:]
new_chromo2 = chromo2[:point] + chromo1[point:]
return new_chromo1, new_chromo2
return chromo1, chromo2
变异:
def mutate(chromosome, mutation_rate=0.01):
new_chromo = ''.join(
bit if random.random() > mutation_rate else '1' if bit == '0' else '0'
for bit in chromosome)
return new_chromo
进化:
for generation in range(100): # 迭代100次
new_population = []
for _ in range(len(population) // 2):
parent1, parent2 = select_pair(population)
child1, child2 = crossover(parent1, parent2)
new_population.append(mutate(child1))
new_population.append(mutate(child2))
population = new_population
结果:
best_chromosome = max(population, key=fitness)
best_x = int(best_chromosome, 2)
print(f"最佳个体: {best_chromosome}, x: {best_x}, f(x): {best_x ** 2}")
结论
遗传算法通过模拟自然进化过程不断优化问题的解决方案。在复杂或不确定空间中,它提供了一种强大的搜索机制。虽然例子比较简单,但对于更复杂的问题(如机器学习中的参数优化、组合优化问题等),遗传算法是非常有用的工具。