如何轻松的使用遗传算法

前提

基于GA-Common 代码仓库地址

架构模式

在这里插入图片描述

设计模型(Pro版)

在这里插入图片描述

基础知识补充

什么是遗传算法

首先,遗传算法属于一种模仿生物种群演进规律的优化算法,通过不停的迭代来达到对于复杂模型的优化方式,可以用于解决组合优化问题等。

遗传算法中的一些基础概念

  • 种群(群体的集合)
  • 个体
  • 表现型
  • 基因型

遗传算法的优化过程概览

不满足条件
满足条件
开始优化
生成种群
种群内部交叉
种群内个体变异
在种群内选择适应环境的个体
优化结束

Tips:

  • 条件一般由两种,包含了最大迭代次数或者达到了某种适应度可以结束
  • 交叉和变异过程,一般都会由交叉率和变异率来决定

可以解决的问题

  • 参数优化问题
  • 组合优化问题

编码说明

环境基础

本次采用的基于Python构建的基础的遗传算法仓库GA-Common

使用环境说明

python3.6+

安装说明

pip install GA-Common

使用示例

示例一: 简单应用

使用遗传算法,逼近某个置顶的数值

import math

from ga import GA, Individual, IndividualMeta, Selector
from ga_codec import CodecPlugin
from ga_cm import CmPlugin
from ga_iter import StopIterPlugin
from ga_generate import GeneratePlugin
from ga_selector import Selector


def get_fitness(individual: Individual):
    val = individual.phenotype.phenotype
    return -math.log(abs(val[0] - 19.1564))  # 逼近19.1564


def run_simple_ga():
    individual_meta = IndividualMeta()
    individual_meta.range_list = [(19, 30)] # 指定参数A的取值范围
    individual_meta.bit_count = [50]  # 指定二进制编码长度

    codec_plugin = CodecPlugin()
    cm_plugin = CmPlugin(0.05, 0.01)  # 指定交叉率和变异率
    stop_iter_plugin = StopIterPlugin(100)  # 指定最大迭代次数
    generate_plugin = GeneratePlugin(50, individual_meta)  # 指定最大种群数量

    selector = Selector(get_fitness)  # 初始化环境选择器

    ga = GA(
        codec_plugin,
        cm_plugin,
        stop_iter_plugin,
        "",
        generate_plugin
    )
    ga.setup_population()  # 初始化种群
    ga.use_selector(selector)  # 适配环境选择器

    vals = []
    for idx, _ in enumerate(ga):
        individuals = ga.population.individuals
        nums = [i.phenotype.phenotype[0] for i in individuals]
        vals.append((idx, sum(nums) / 100))
    

if __name__ == "__main__":
    run_simple_ga()

这种状态下,基本100次以内的迭代,参数就会收敛到最优值。
在这里插入图片描述

示例二: 二次函数参数优化

import numpy as np
from ga import GA, IndividualMeta, Individual
from ga_codec import CodecPlugin
from ga_cm import CmPlugin
from ga_generate import GeneratePlugin
from ga_selector import Selector
from ga_iter import StopIterPlugin


x = np.linspace(0, 1, 100)


def get_fitness(individual: Individual):
    phenotypes = individual.phenotype.phenotype

    a, b = phenotypes

    y = a * x ** 2 + b
    mae = np.mean(np.abs(y - x ** 3))

    return 1 / mae


def run_quad():
    individual_meta = IndividualMeta()
    individual_meta.range_list = [(0, 10), (0, 20)]
    individual_meta.bit_count = [100, 100]

    codec_plugin = CodecPlugin()
    cm_plugin = CmPlugin(0.1, 0.1)
    iter_plugin = StopIterPlugin(50)
    generate_plugin = GeneratePlugin(50, individual_meta)

    ga = GA(
        codec_plugin,
        cm_plugin,
        iter_plugin,
        "",
        generate_plugin
    )

    selector = Selector(get_fitness)
    ga.setup_population()
    ga.use_selector(selector)

    best = []
    wrost = []
    fitness = []
    for _ in ga:
        individuals = ga.population.individuals
        individual_pair = [(get_fitness(i), i.phenotype.phenotype) for i in individuals]

        best_a, best_b = max(individual_pair)[1]
        wrost_a, wrost_b = min(individual_pair)[1]

        best.append([best_a, best_b])
        wrost.append([wrost_a, wrost_b])
        fitness.append(sum([i[0] for i in individual_pair]) / len(individuals))


if __name__ == "__main__":
    run_quad()

在0~1范围内,优化二次函数的参数,并且使其在0~1范围内接近三次函数的形式。

在这里插入图片描述

扫描二维码关注公众号,回复: 12279250 查看本文章

基本可以确定大概在地10轮左右,mae的数值已经下降到了0.1左右,优化效果明显。

示例三: SVM 模型参数优化

示例四: 导航路径规划

(未完待续…)

猜你喜欢

转载自blog.csdn.net/m0_37964621/article/details/110945074