经典算法-遗传算法的python实现

经典算法-遗传算法的python实现

前言

本文分享经典的算法:遗传算法受到生物进化理论启发,模拟生物种群的进化过程。遗传算法是一类基于生物进化理论的优化算法,通过模拟生物进化的过程,通过选择、交叉和变异等操作,不断优化解决问题。遗传规划算法(Genetic Programming,简称GP)作为进化算法的一种,通过演化生成程序或模型来解决问题。使用Python语言实现一个遗传算法。


LLM大模型相关文章:

GPT实战系列-ChatGLM3本地部署CUDA11+1080Ti+显卡24G实战方案

GPT实战系列-Baichuan2本地化部署实战方案

GPT实战系列-如何用自己数据微调ChatGLM2模型训练

GPT实战系列-大话LLM大模型训练

GPT实战系列-ChatGLM2模型的微调训练参数解读

GPT实战系列-探究GPT等大模型的文本生成

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF


遗传规划算法(Genetic Programming)在某种程度上,和强化学习有类似之处。

概念

遗传算法(Genetic Algorithm,GA),最早是由美国的 John holland在20世纪70年代提出的,该算法是根据大自然中生物体进化规律而设计提出的,模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,也是一种通过模拟自然进化过程搜索最优解的方法。

遗传算法通过数学公式推理,计算机仿真,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,比一些常规的优化算法,能够较快较好的获得优化结果。

目前,遗传算法已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。

基本原理

遗传算法是通过对程序或模型的组合、变异和选择来进行优化的。它将程序或模型表示为一棵树结构,每个节点代表一个函数或操作符,每个叶子节点代表一个变量或常数。遗传规划算法通过遗传操作对这些树进行操作,不断生成新的解,并通过适应度评估来选择优秀的解。 遗传规划算法的基本步骤如下:

  1. 初始化种群:随机生成一组初始树结构,作为种群的初始解。
  2. 评估适应度:对每个个体(树结构)进行适应度评估,评估其解决问题的能力。
  3. 选择操作:根据适应度值选择一些个体作为父代,用于后续的交叉和变异操作。
  4. 交叉操作:选择的父代个体进行交叉操作,生成新的子代个体。
  5. 变异操作:对子代个体进行变异操作,引入新的变量或操作符,增加解空间的多样性。
  6. 更新种群:将父代和子代个体结合,形成新的种群。
  7. 终止条件判断:根据预设的终止条件(例如达到最大迭代次数或找到满意的解等),判断是否终止算法。
  8. 返回结果:返回最优解或满足条件的解。

算法实现

遗传算法的实现。涉及到Python和相关的科学计算库,例如numpy和matplotlib库将在实现中起到重要的作用。以下是遗传算法的实现步骤。

1、定义目标函数

以下是一个简单的遗传规划算法的示例代码,用于求解一个简单的数学函数的最大值问题。

先来定义一个函数来计算目标函数值,具体代码如下所示:

def target_function(x):
    return x ** 2 - 2 * x + 1

2、定义相关参数

定义遗传算法所需要用到的参数,包括种群大小、基因长度、交叉概率、变异概率等,具体使用以下参数:

# 定义遗传规划算法的参数
POPULATION_SIZE = 100
GENERATION_COUNT = 50
CROSSOVER_RATE = 0.8
MUTATION_RATE = 0.1

3、初始化种群

接下来初始化操作,这里使用随机生成的二进制字符串作为初始个体,具体如下所示:

# 定义个体的数据结构
class Individual:
    def __init__(self, chromosome):
        self.chromosome = chromosome
        self.fitness = self.calculate_fitness()
    
    
# 初始化种群
def initialize_population():
    population = []
    for _ in range(POPULATION_SIZE):
        chromosome = [random.randint(0, 1) for _ in range(10)]  # 假设染色体长度为10
        individual = Individual(chromosome)
        population.append(individual)
    return population

4、选择操作

# 选择操作
def selection(population):
    # 使用轮盘赌选择算法
    total_fitness = sum(individual.fitness for individual in population)
    probabilities = [individual.fitness / total_fitness for individual in population]
    selected_individuals = random.choices(population, probabilities, k=POPULATION_SIZE)
    return selected_individuals

5、交叉操作

# 交叉操作
def crossover(parent1, parent2):
    if random.random() < CROSSOVER_RATE:
        crossover_point = random.randint(1, len(parent1.chromosome) - 1)
        child1_chromosome = parent1.chromosome[:crossover_point] + parent2.chromosome[crossover_point:]
        child2_chromosome = parent2.chromosome[:crossover_point] + parent1.chromosome[crossover_point:]
        child1 = Individual(child1_chromosome)
        child2 = Individual(child2_chromosome)
        return child1, child2
    else:
        return parent1, parent2

6、变异操作

# 变异操作
def mutation(individual):
    mutated_chromosome = individual.chromosome.copy()
    for i in range(len(mutated_chromosome)):
        if random.random() < MUTATION_RATE:
            mutated_chromosome[i] = 1 - mutated_chromosome[i]
    return Individual(mutated_chromosome)

7、定义适应度函数

然后是定义适应度函数的操作,适应度函数即为目标函数的值,具体如下所示:

def calculate_fitness(self):
        x = self.decode_chromosome()
        return target_function(x)
def decode_chromosome(self):
        binary_x = "".join(str(bit) for bit in self.chromosome)
        x = int(binary_x, 2) * (X_MAX - X_MIN) / (2 ** len(self.chromosome) - 1) + X_MIN
        return x

8、实现遗传迭代循环

遗传算法的关键是实现遗传迭代的主循环,这里设定迭代次数为100次,并在每次迭代后更新图形界面,具体代码如下所示:

population = initialize_population()
    best_fitness = float('-inf')
    best_individual = None
    for generation in range(GENERATION_COUNT):
        selected_individuals = selection(population)
        new_population = []
        while len(new_population) < POPULATION_SIZE:
            parent1, parent2 = random.sample(selected_individuals, 2)
            child1, child2 = crossover(parent1, parent2)
            child1 = mutation(child1)
            child2 = mutation(child2)
            new_population.extend([child1, child2])
        population = new_population
        # 更新最佳个体
        for individual in population:
            if individual.fitness > best_fitness:
                best_fitness = individual.fitness
                best_individual = individual
        print("Generation:", generation + 1)
        print("Best Individual:", best_individual.chromosome)
        print("Best Fitness:", best_fitness)
        print()
    # 输出最终结果
    x = best_individual.decode_chromosome()

以上步骤,就实现一个j简单的遗传算法,可以运行,观察算法的演变过程和最优解的逐渐优化。


遗传规划算法具有以下优势:

  1. 高度自适应:遗传规划算法可以自动调整候选解的结构和参数,适应问题的复杂性和多样性。
  2. 可解释性强:生成的程序或模型具有良好的可解释性,可以帮助我们理解问题和解决方案之间的关系。
  3. 广泛适用性:遗传规划算法可以应用于多种问题领域,如机器学习、数据挖掘、控制系统设计等。 遗传规划算法在以下领域得到了广泛的应用:
  4. 符号回归问题:通过遗传规划算法可以生成数学模型,对给定的输入和输出进行回归分析。
  5. 优化问题:遗传规划算法可以用于求解复杂的优化问题,如函数优化、组合优化等。
  6. 控制系统设计:遗传规划算法可以用于设计控制系统的参数或结构,提高系统的性能和稳定性。
  7. 人工智能:遗传规划算法可以用于生成智能代理、决策树等,解决人工智能领域的问题。

GPT专栏文章:
GPT实战系列-简单聊聊LangChain

GPT实战系列-LangChain + ChatGLM3构建天气查询助手

GPT实战系列-大模型为我所用之借用ChatGLM3构建查询助手

GPT实战系列-Baichuan2等大模型的计算精度与量化-CSDN博客

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF-CSDN博客

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF

GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(二)

GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(一)

GPT实战系列-ChatGLM3本地部署CUDA11+1080Ti+显卡24G实战方案

GPT实战系列-ChatGLM2模型的微调训练参数解读

GPT实战系列-如何用自己数据微调ChatGLM2模型训练

GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案

GPT实战系列-Baichuan2本地化部署实战方案

GPT实战系列-探究GPT等大模型的文本生成-CSDN博客

大模型查询工具助手之股票免费查询接口

猜你喜欢

转载自blog.csdn.net/Alex_StarSky/article/details/135460134