Python实现的遗传算法模型示例代码
下面是一个使用Python实现的简单遗传算法示例。这个示例演示了如何使用遗传算法来找到一个数学函数的最大值。我们将使用二进制编码的方法来表示个体,并通过交叉、变异等操作来进行进化。
问题描述
假设我们有以下目标函数:
[ f(x) = x^2 ]
我们的目标是在一定范围内找到这个函数的最大值。假设x的范围是从0到31。
实现步骤
- 初始化种群:随机生成一组个体,每个个体是一个用二进制表示的数字。
- 适应度计算:计算每个个体在目标函数中的适应度。
- 选择:选择适应度较高的个体进行繁殖。
- 交叉:通过交换两亲本个体的一部分基因来创建新个体。
- 变异:随机改变个体的一些位,以增加多样性。
- 迭代:重复选择、交叉、变异步骤,直到达到最大迭代次数或满足其他终止条件。
代码示例
import random
# 遗传算法参数
POP_SIZE = 20 # 种群大小
GENE_LENGTH = 5 # 基因长度(表示x的二进制位数,适合数字0-31)
MAX_GEN = 50 # 最大迭代次数
MUTATION_RATE = 0.01 # 变异概率
def fitness_function(x):
return x ** 2
def generate_individual():
return [random.randint(0, 1) for _ in range(GENE_LENGTH)]
def decode_gene(gene):
return int(''.join(map(str, gene)), 2)
def calculate_fitness(individual):
x = decode_gene(individual)
return fitness_function(x)
def select(population):
sorted_population = sorted(population, key=calculate_fitness, reverse=True)
return sorted_population[:2]
def crossover(parent1, parent2):
point = random.randint(1, GENE_LENGTH - 1)
child1 = parent1[:point] + parent2[point:]
child2 = parent2[:point] + parent1[point:]
return child1, child2
def mutate(individual):
return [bit if random.random() > MUTATION_RATE else 1 - bit for bit in individual]
def genetic_algorithm():
population = [generate_individual() for _ in range(POP_SIZE)]
for _ in range(MAX_GEN):
new_population = []
for _ in range(POP_SIZE // 2):
parent1, parent2 = select(population)
child1, child2 = crossover(parent1, parent2)
new_population.extend([mutate(child1), mutate(child2)])
population = new_population
# 找到最佳个体
best_individual = max(population, key=calculate_fitness)
best_x = decode_gene(best_individual)
best_fitness = calculate_fitness(best_individual)
print("Best individual:", best_individual)
print("Best x:", best_x)
print("Best fitness:", best_fitness)
# 运行遗传算法
genetic_algorithm()
说明
- 初始化种群:生成一个由随机0和1组成的列表,每个个体由
GENE_LENGTH
个二进制位构成。 - 适应度计算:通过将二进制列表解码为整数来计算适应度。
- 选择:按适应度对种群排序,并选择适应度较高的个体。
- 交叉:从两个父代中选择一个随机交叉点,并交换它们的基因片段。
- 变异:以
MUTATION_RATE
的概率翻转基因中的位。
此示例演示了遗传算法的基本工作流程,可以根据需要进行复杂性扩展。