📜  简单遗传算法 (SGA)(1)

📅  最后修改于: 2023-12-03 15:41:09.070000             🧑  作者: Mango

简单遗传算法 (SGA)

遗传算法是一种基于自然界生物进化遗传原理的优化算法。简单遗传算法 (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))

参考资料: