进化算法(遗传算法)
2023-12-21 07:54:38
遗传算法概述
- 遗传算法(GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则。
基本操作:
- (1)选择。选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁衍子孙。根据各个个体的适应度值,按照一定的规则或方法从上一代群体中选择出一些优良的个体遗传到下一代种群中。选择的依据是适应性强的个体为下一代贡献一个或多个后代的概率大。
- (2)交叉。通过交又操作可以得到新一代个体,新个体组合了父辈个体的特性。将群体中的各个个体随机搭配成对,对每一个个体,以交叉概率交换它们之间的部分染色体。
- (3)变异。对种群中的每一个个体,以变异概率改变某一个或多个基因座上的基因值为其他的等位基因。同生物界中一样变异发生的概率很低,变异为新个体的产生提供了机会。
基本步骤
1)编码:GA在进行搜索之前先将解空间的解数据表示成遗传空间的基因型串结构数据这些串结构数据的不同组合便构成了不同的点。
2)初始群体的生成:随机产生N个初始串结构数据,每个串结构数据称为一个个体,N个个体构成了一个群体。GA以这N个串结构数据作为初始点开始进化。
3)适应度评估:适应度表明个体或解的优劣性。不同的问题,适应性函数的定义方式也不同
4)选择:选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下-代繁殖子孙。遗传算法通过选择过程体现这一思想,进行选择的原则是适应性强的个体为下一代贡献一个或多个后代的概率大。选择体现了达尔文的适者生存原则。
5)交叉:交又操作是遗传算法中最主要的遗传操作。通过交叉操作可以得到新一代个体新个体组合了其父辈个体的特性。交又体现了信息交换的思想。
6)变异:变异首先在群体中随机选择一个个体,对于选中的个体以一定的概率随机地改变串结构数据中某个串的值。同生物界一样,GA中变异发生的概率很低,通常取值很小。
案例
用于找到满足 3x + 4y + 5z < 100 条件的最佳 x、y、z 值组合。
import random
# 定义适应度函数,计算给定 x, y, z 的适应度(目标函数值)
def fitness(x, y, z):
return 3 * x + 4 * y + 5 * z
# 定义遗传算法参数
population_size = 50
mutation_rate = 0.1
generations = 100
# 定义随机生成个体的函数
def generate_individual():
x = random.randint(0, 20) # 假设 x 取值范围为 0 到 20
y = random.randint(0, 20) # 假设 y 取值范围为 0 到 20
z = random.randint(0, 20) # 假设 z 取值范围为 0 到 20
return (x, y, z)
# 定义选择函数,根据适应度选择个体
def select(population):
total_fitness = sum(fitness(x, y, z) for x, y, z in population)
selection_probabilities = [fitness(x, y, z) / total_fitness for x, y, z in population]
return random.choices(population, selection_probabilities)[0]
# 定义交叉函数,对两个个体进行交叉生成新个体
def crossover(parent1, parent2):
crossover_point = random.randint(1, 2)
if crossover_point == 1:
return (parent1[0], parent2[1], parent2[2])
else:
return (parent2[0], parent1[1], parent1[2])
# 定义突变函数,对个体进行突变
def mutate(individual):
mutated_individual = list(individual)
gene_to_mutate = random.randint(0, 2)
mutated_individual[gene_to_mutate] = random.randint(0, 20) # 假设基因突变范围为 0 到 20
return tuple(mutated_individual)
# 主遗传算法循环
population = [generate_individual() for _ in range(population_size)]
for generation in range(generations):
new_population = []
for _ in range(population_size):
parent1 = select(population)
parent2 = select(population)
child = crossover(parent1, parent2)
if random.random() < mutation_rate:
child = mutate(child)
new_population.append(child)
population = new_population
# 找到最佳个体
best_individual = max(population, key=lambda ind: fitness(*ind))
best_fitness = fitness(*best_individual)
print(f"最佳个体: {best_individual}")
print(f"最佳适应度值: {best_fitness}")
文章来源:https://blog.csdn.net/weixin_48235555/article/details/135107254
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!