【Deep Learning 1】GA遗传算法

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 🍊本文以一个案例题目出发,详细描述了遗传算法过程,并做了两个实现复现了案例🍊实验一:纯手打原生代码复现案例🍊实验二:使用第三方库scikit-opt复现案例。

 image.gif编辑

🍊本文以一个案例题目出发,详细描述了遗传算法过程,并做了两个实验复现题目

🍊实验一:纯手打原生代码复现案例

🍊实验二:使用第三方库scikit-opt复现案例

一、Introduction

遗传算法源自自然界生物的遗传和进化过程:通过染色体之间的选择、交叉和变异来形成。同时符合自然界优胜劣汰的规则。因此遗传算法本质上是一种全局优化搜索算法,即已知评价方程和参数范围,求解目标函数最优解。

二、 Principle

2.1 算法总体流程

算法流程

1 设计编码器和解码器

2 初始化种群

3 个体适应度评价

4 交叉运算

5 变异运算

6 选择运算

7 判断遗传进化是否达到迭代阈值

接下来我们使用GA来解决以下问题

题目:求解以下函数的最小值

image.gif编辑

题目分析:我们目标是求解该函数的最小值。限制条件为x的取值范围在-20~20

2.2 编码器和解码器

GA最先要做的事情就是对自变量X编码成字符串,每个字符类似于生物学中的染色体,而一条字符串就是一个个体。该题目中变量x整数为20-(-20)=40个。很多时候我们变量是有精度,因此我们需要对其进行扩充,如40*10=400个。

接下来我们要考虑使用什么规则来对X进行编码,最常见的方法是使用0、1构成的二进制编码

image.gif编辑

因此我们采用9位二进制数表示x值。

代码上我们设计Encoder编码器函数和Decoder解码器函数进行编码和解码。

2.2 初始化种群

初始化种群主要是随机产生几个个体。假设我们随机产生了4个个体

个体编码 数值 染色体
1号 11.7 100111101
2号 -11.6 001010100
3号 -6.9 010000011
4号 6.2 100000110

2.3 个体适应度评价

衡量一条染色体质量的指标即适应度,通常来说就是将个体代入目标函数的函数值

个体编码 数值 染色体 f(x)
1号 11.7 100111101 273.78
2号 -11.6 001010100 269.12
3号 -6.9 010000011 95.22
4号 6.2 100000110 76.88

2.4 交叉

染色体在进化的过程中会不断进行两两交叉配对。染色体具体交叉配对的过程为从几号位置染色体交换染色体

个体编码 染色体 f(x) 交换个体编码对象 交换位置
1号 100111101 273.78 3号 5
2号 001010100 269.12 4号 4
3号 010000011 95.22 1号 8
4号 100000110 76.88 2号 8

交换后的结果为

个体编码 染色体 f(x)
1号 100110011 228.97
2号 001000110 338.0
3号 010000011 95.22
4号 100000110 76.88

2.5 变异

看过《异形》的小伙伴都知道生物可能会发生变异。而变异的具体过程就是染色体发生突变。本例子中我们需要设定一个变异概率的值,某条染色体0、1互换。若变异后的超出变量x的阈值,则变异失败

个体编码 染色体 是否发生变异 变异位置 是否成功变异 变异结果
1号 100110011 3 100010011
2号 001000110 - - -
3号 010000011 - - -
4号 100000110 - - -

2.6 选择

在自然界中有着优胜劣汰的规则,因此我们需要挑选出适应度高的个体。在自然界中,有着良好基因的个体往往有更大概率存活下来,根据该规律,传统的使用的是轮盘赌算法,即适应度与被选择的概率成正比,适应度越高,被选择的概论也就越高。

但是因为所求的是最小值,即函数值越高,概率越低,因此需要特别设计一个规则。

作者想出了两种方案

第一种方案,是从适应度函数下手如下,那么求解最小值等价于求解该适应度函数的最大值,这样可以继续使用传统的轮盘赌算法

image.gif 编辑

第二种方案,是从轮盘赌算法下手,f(x)概率越小,分子越小,f(x0值越小,种群适应度越高。且概率之和为1,下述的代码也是采用本方案。这里的n是初始化种群的个体数量

image.gif 编辑

注意这里被选中次数之和与选中前的个数总和一致

个体编码 数值 染色体 f(x) 被选择的概率 被选中的次数
1 7.5 100010011 112.5 0.2056 1
2 -13.0 001000110 338.0 0.2078 -
3 -6.9 010000011 95.22 0.2889 1
4 6.2 100000110 76.88 0.2974 2

选择之后进行繁衍,更新表格数据为

个体编码 染色体 f(x) 初始f(x)(这里做对比)
1 100010011 112.5 273.78
2 010000011 95.22 269.12
3 100000110 76.88 95.22
4 100000110 76.88 76.88

可以看到经过一轮的遗传进化之后,种群的f(x)普遍降低,种群的适应度总体提高不少

最后判断是否达到最大迭代次数,若没有,则重新回到2.3 步骤

三、Experiment

3.1 方案一:原生代码

Code

import numpy as np
from matplotlib import pyplot as plt
PRECISION = 10.0  # 自变量精度
INDIVIDUALS_NUM = 50  # 初始化个体数量
EVOLUTION_NUM = 10000  # 进化次数
LOWER_LIMIT = -20  # 染色体下限值
UPPER_LIMIT = 20  # 染色体上限值
CROSS_RATE = 0.6  # 交叉概率
MUTATION_RATE = 0.005  # 变异概率
def encoder(x):
    result = []
    for i in x:
        i = bin(int((i + 20) * PRECISION))[2:]
        for j in range(9 - len(i)):
            i = '0' + i
        result.append(i)
    return result
def decoder(x):
    result = []
    for i in x:
        i = int(i, 2) - 200
        i = i / PRECISION
        result.append(i)
    return result
def initialize():
    def transform(x):
        return (x - 200) / PRECISION
    p = np.random.randint(0, 400, size=INDIVIDUALS_NUM)
    p = encoder(list(map(transform, p)))
    return p
def choose(x, ada):
    x, ada = np.asarray(x), np.asarray(ada)
    #print('概率情况',(1-ada / ada.sum())/(INDIVIDUALS_NUM-1))
    index = np.random.choice(np.arange(INDIVIDUALS_NUM), size=INDIVIDUALS_NUM, replace=True, p=(1-ada / ada.sum())/(INDIVIDUALS_NUM-1))
    #print('\nChoose index:', index)
    return x[index]
def threshold_limit(x):
    l = []
    l.append(x)
    x = decoder(l)[0]
    if x >= -20 and x <= 20:
        return True
    else:
        return False
def cross(x):
    result = []
    for chromosome in x:
        chromosome_A = list(chromosome)
        if np.random.rand() < CROSS_RATE:
            chromosome_B = x[np.random.randint(INDIVIDUALS_NUM)]
            cross_points = np.random.randint(low=0, high=8)
            # 观察交叉后的数据会不会超过自变量x的阈值
            fake = chromosome_A
            fake[cross_points:] = list(chromosome_B)[cross_points:]
            if threshold_limit(''.join(fake)):
                chromosome_A = fake
        result.append(''.join(chromosome_A))
    return result
def mutations(x):
    result = []
    for chromosome in x:
        if np.random.rand() < MUTATION_RATE:
            mut_points = np.random.randint(0, 8)
            chromosome = list(chromosome)
            # 观察变异后的数据会不会超过自变量x的阈值
            fake = chromosome
            fake[mut_points] = '1' if chromosome[mut_points] == '0' else '0'
            if threshold_limit(''.join(fake)):
                chromosome = fake
        result.append(''.join(chromosome))
    return result
def adaptability(list):
    result = []
    for i in list:
        result.append(2 * pow(i, 2))
    return result
def best_chr(x):
    dec = decoder(x)
    ada = adaptability(dec)
    best_index = np.argmin(ada)
    return (ada[best_index])
if __name__ == '__main__':
    # 初始化种群
    pop = initialize()
    #print(decoder(pop))
    print('Initializing Populations', pop)
    best=[]
    for i in range(EVOLUTION_NUM):
        ada = adaptability(decoder(pop))
        #print('Adaptability', ada)
        pop = cross(pop)
        #print('Cross', pop)
        pop = mutations(pop)
        #print('Chromosome',pop)
        #print('hanshuzhi',decoder(pop))
        pop = choose(pop, ada)
        #print('Choose', pop)
        best.append(best_chr(pop))
    plt.plot(range(EVOLUTION_NUM), best)
    plt.ylabel('f(x)')
    plt.xlabel('Epoch')
    plt.show()

image.gif

Result

image.gif编辑

这个结果非常有意思

1 目标函数值最优解为0,所求的结果大部分接近0,且最终也趋向于0,说明该算法是有效的

2 中间有几个凸集,主要是因为有染色体变异的情况,但最终还是趋向于0了

3 这其实反映了生物进化的过程,有些时候发生了生物变异,它具有很强的适应性,在某个时期具有一定的地位。但是随着生物的不断遗传进化,物竞天择的自然规律,最终,最适应的染色体始终占据了主导地位

3.2 方案二:第三方库

安装第三方库

pip install scikit-opt

image.gif

Code

from sko.GA import GA
def adapt(x):
    return 2 * pow(x, 2)
# func 适应度函数
# n_dim 自变量的个数
# size_pop 种群初始化个体数量
# max_iter 进化迭代次数
# prob_mut 变异概率
# lb 自变量下限
# ub 自变量上限
# precision 精度
ga = GA(func=adapt, n_dim=1, size_pop=50, max_iter=800, prob_mut=0.001, lb=-20, ub=20, precision=1e-2)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)

image.gif


目录
相关文章
|
6天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
30天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
134 15
|
3月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
该算法结合了遗传算法(GA)与分组卷积神经网络(GroupCNN),利用GA优化GroupCNN的网络结构和超参数,提升时间序列预测精度与效率。遗传算法通过模拟自然选择过程中的选择、交叉和变异操作寻找最优解;分组卷积则有效减少了计算成本和参数数量。本项目使用MATLAB2022A实现,并提供完整代码及视频教程。注意:展示图含水印,完整程序运行无水印。
|
2月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA-PSO-SVM算法的混沌背景下微弱信号检测matlab仿真
本项目基于MATLAB 2022a,展示了SVM、PSO、GA-PSO-SVM在混沌背景下微弱信号检测中的性能对比。核心程序包含详细中文注释和操作步骤视频。GA-PSO-SVM算法通过遗传算法和粒子群优化算法优化SVM参数,提高信号检测的准确性和鲁棒性,尤其适用于低信噪比环境。
|
3月前
|
算法 决策智能
基于GA-PSO遗传粒子群混合优化算法的TSP问题求解matlab仿真
本文介绍了基于GA-PSO遗传粒子群混合优化算法解决旅行商问题(TSP)的方法。TSP旨在寻找访问一系列城市并返回起点的最短路径,属于NP难问题。文中详细阐述了遗传算法(GA)和粒子群优化算法(PSO)的基本原理及其在TSP中的应用,展示了如何通过编码、选择、交叉、变异及速度和位置更新等操作优化路径。算法在MATLAB2022a上实现,实验结果表明该方法能有效提高求解效率和解的质量。
|
5月前
|
算法
基于GA-PSO遗传粒子群混合优化算法的CVRP问题求解matlab仿真
本文介绍了一种基于GA-PSO混合优化算法求解带容量限制的车辆路径问题(CVRP)的方法。在MATLAB2022a环境下运行,通过遗传算法的全局搜索与粒子群算法的局部优化能力互补,高效寻找最优解。程序采用自然数编码策略,通过选择、交叉、变异操作及粒子速度和位置更新,不断迭代直至满足终止条件,旨在最小化总行驶距离的同时满足客户需求和车辆载重限制。
|
5月前
|
机器学习/深度学习 存储 人工智能
【博士每天一篇文献-算法】改进的PNN架构Progressive learning A deep learning framework for continual learning
本文提出了一种名为“Progressive learning”的深度学习框架,通过结合课程选择、渐进式模型容量增长和剪枝机制来解决持续学习问题,有效避免了灾难性遗忘并提高了学习效率。
95 4
|
6月前
|
传感器 机器学习/深度学习 算法
基于GA遗传算法的WSN网络节点覆盖优化matlab仿真
本研究应用遗传优化算法于无线传感器网络(WSN),优化节点布局与数量,以最小化节点使用而最大化网络覆盖率。MATLAB2022a环境下,算法通过选择、交叉与变异操作,逐步改进节点配置,最终输出收敛曲线展现覆盖率、节点数及适应度值变化。无线传感器网络覆盖优化问题通过数学建模,结合遗传算法,实现目标区域有效覆盖与网络寿命延长。算法设计中,采用二进制编码表示节点状态,适应度函数考量覆盖率与连通性,通过选择、交叉和变异策略迭代优化,直至满足终止条件。
|
6月前
|
算法 数据安全/隐私保护
基于GA遗传优化算法的Okumura-Hata信道参数估计算法matlab仿真
在MATLAB 2022a中应用遗传算法进行无线通信优化,无水印仿真展示了算法性能。遗传算法源于Holland的理论,用于全局优化,常见于参数估计,如Okumura-Hata模型的传播损耗参数。该模型适用于150 MHz至1500 MHz的频段。算法流程包括选择、交叉、变异等步骤。MATLAB代码执行迭代,计算目标值,更新种群,并计算均方根误差(RMSE)以评估拟合质量。最终结果比较了优化前后的RMSE并显示了SNR估计值。
83 7
|
6月前
|
机器学习/深度学习 数据采集 算法
Python实现GA(遗传算法)对SVM分类模型参数的优化
Python实现GA(遗传算法)对SVM分类模型参数的优化