📅  最后修改于: 2023-12-03 15:41:09.070000             🧑  作者: Mango
遗传算法是一种基于自然界生物进化遗传原理的优化算法。简单遗传算法 (SGA) 是遗传算法的一种最基本、最简单的形式,是其他进化算法的基础。
SGA 的算法流程可以分为编码、初始化、选择、交叉、变异和解码等几个步骤。
编码是将问题的解编码为染色体,以便进行遗传操作。其中包括二进制编码、格雷编码、浮点数编码和排列编码等多种方式。
初始化是生成初始种群的过程。通常采用随机生成方式,生成若干染色体作为初始种群。
选择是从当前种群中选出适应度高的染色体作为下一代种群的父代。种群中每个个体都有一定的选择概率,选择概率越高的个体被选中的概率就越大。
交叉是将两个父代染色体的信息进行交换的过程,可以生成新的个体。有单点交叉、多点交叉、均匀交叉等多种方式。
变异是在染色体的基础上进行随机的、小规模的变化。变异可以增加种群的多样性,使算法避免陷入局部最优解。变异的方式有单点变异、多点变异、均匀变异等多种方式。
解码是将染色体还原为问题的解的过程。将编码过程中的离散值、实数编码等转化为问题原本的表述方式。
以下是使用 Python 实现 SGA 的示例代码。
import random
def init_pop(pop_size):
pop = []
for i in range(pop_size):
chrom = [random.randint(0, 1) for j in range(10)]
pop.append(chrom)
return pop
def select(pop, fitness):
total_fitness = sum(fitness)
p = [f / total_fitness for f in fitness]
accumulate_p = [sum(p[:i+1]) for i in range(len(p))]
new_pop = []
for i in range(len(pop)):
r = random.random()
for j in range(len(accumulate_p)):
if r < accumulate_p[j]:
new_pop.append(pop[j])
break
return new_pop
def cross(pop):
new_pop = []
for i in range(0, len(pop), 2):
chrom1 = pop[i]
chrom2 = pop[i + 1]
p = random.randint(1, len(chrom1) - 1)
new_chrom1 = chrom1[:p] + chrom2[p:]
new_chrom2 = chrom2[:p] + chrom1[p:]
new_pop.append(new_chrom1)
new_pop.append(new_chrom2)
return new_pop
def mutate(pop, pm):
new_pop = []
for i in range(len(pop)):
chrom = pop[i]
for j in range(len(chrom)):
r = random.random()
if r < pm:
chrom[j] = 1 - chrom[j]
new_pop.append(chrom)
return new_pop
# 适应度函数
def fitness_func(chrom):
return sum(chrom)
# SGA 算法
def sga(pop_size, generation_max):
pop = init_pop(pop_size)
for g in range(generation_max):
fitness = [fitness_func(chrom) for chrom in pop]
new_pop = select(pop, fitness)
new_pop = cross(new_pop)
new_pop = mutate(new_pop, 0.1)
pop = new_pop
return max([fitness_func(chrom) for chrom in pop])
print(sga(100, 100))
参考资料: