以下是一个使用Python编写的最简单的遗传算法示例。这个示例将解决一个简单的整数优化问题:找到使函数 f(x) = x^2
最小的整数 x
(在这个简单的例子中,我们限制 x
的范围为0到7的整数)。虽然这个问题可以直接通过计算得出答案(即 x=0
),但这里我们用它来展示遗传算法的基本概念。
import numpy as np
# 评估函数,用于计算个体的适应度值
def evaluate(individual):
return individual ** 2 # 在这个例子中,我们实际上想要最小化这个函数
# 遗传算法的主要部分
def genetic_algorithm(population_size, num_generations, mutation_rate, low, high):
# 初始化种群
population = np.random.randint(low, high, population_size)
# 迭代每一代
for generation in range(num_generations):
# 计算适应度值(这里实际上我们想要最小化,但遗传算法通常寻找最大值)
fitness = -np.array([evaluate(ind) for ind in population]) # 使用负值来模拟最大化
# 选择操作:这里我们简单使用轮盘赌选择,但为了简化,我们直接选择适应度最好的一半个体
idx = np.argsort(fitness)[::-1][:population_size//2]
mating_pool = population[idx]
# 交叉操作:由于问题简单,我们直接复制最好的一半到下一代(不交叉)
offspring = np.empty(population_size)
offspring[:population_size//2] = mating_pool
# 生成另一半后代(可以是随机生成或复制)
# 为了简化,我们直接复制剩余的一半
offspring[population_size//2:] = mating_pool
# 变异操作:随机改变后代中的一些值
for point in range(population_size//2, population_size):
if np.random.rand() < mutation_rate:
offspring[point] = np.random.randint(low, high)
# 更新种群为下一代
population = offspring
# 输出当前代的最优解
print(f"Generation {generation+1}: Best individual is {population[np.argmax(fitness)]} with fitness {np.max(fitness)}")
# 返回最后一代的最佳个体
return population[np.argmax(fitness)]
# 设置参数
population_size = 10 # 种群大小
num_generations = 50 # 迭代代数
mutation_rate = 0.1 # 变异率
low = 0 # 变量下界
high = 8 # 变量上界
# 运行遗传算法
best_individual = genetic_algorithm(population_size, num_generations, mutation_rate, low, high)
print(f"The best solution found by GA is: {best_individual} with fitness {-evaluate(best_individual)}")
代码解释:
-
evaluate
函数:用于计算个体的适应度值。在这个例子中,我们简单地计算x^2
的值,但因为我们想要最小化它,所以在遗传算法中我们使用-x^2
(通过取负值)。 -
genetic_algorithm
函数:遗传算法的主要部分。- 首先,我们初始化一个随机种群。
- 然后,我们迭代每一代。
- 在每一代中,我们计算每个个体的适应度值(使用
evaluate
函数)。 - 接着,我们进行选择操作。在这个简单的例子中,我们只是选择了适应度最好的一半个体作为交配池。
- 然后,我们进行交叉操作。但由于这个问题简单,我们直接复制了最好的一半个体到下一代,并没有进行真正的交叉。
- 接下来,我们生成另一半后代。在这个例子中,我们只是简单地复制了交配池中的个体,但在实际应用中,你可以使用不同的策略来生成新的后代。
- 接着,我们进行变异操作。在这个例子中,我们以一定的概率随机改变后代中的一些值。
- 最后,我们用新的后代更新种群,并输出当前代的最优解。
-
我们设置了遗传算法的参数,并调用了
genetic_algorithm
函数来运行算法。最后,我们输出了算法找到的最佳解及其适应度值。