智能优化算法(三):遗传算法

news2024/11/28 19:47:40

文章目录

  • 1.问题描述
  • 2.遗传算法
    • 2.1.算法概述
    • 2.2.编码操作
    • 2.3.选择操作
    • 2.4.交叉操作
    • 2.5.变异操作
    • 2.6.算法流程
  • 3.算法实现
    • 3.1.MATLAB代码实现
    • 3.2.Python代码实现
  • 4.参考文献

1.问题描述

\quad 在利用启发式算法求解问题时,我们常常需要应用遗传算法解决函数最值问题,也是遗传算法在数学中最常应用到的方面,遗传算法的思想是通过种群的迭代最后求解出某一函数的最值 (最大值/最小值) 或者极值 (极大值与极小值),具体的问题描述与见下文。
\quad 利用二进制编码的遗传算来求解函数优化问题:
max ⁡ f ( x ) = x + 10 sin ⁡ ( 5 x ) + 7 cos ⁡ ( 4 x ) s.t.x ∈ [ 0 , 10 ] \max f(x)=x+10\sin(5x)+7\cos(4x)\quad\text{s.t.x}\in[0,10] maxf(x)=x+10sin(5x)+7cos(4x)s.t.x[0,10]

2.遗传算法

2.1.算法概述

\quad 遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传学原理的优化算法。它模仿了生物进化过程,通过模拟自然选择、交叉、变异等遗传操作,逐步优化问题的解。遗传算法是进化算法的一种,广泛应用于优化问题、机器学习、人工智能等领域。
\quad 其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。
\quad 遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。
在这里插入图片描述

2.2.编码操作

\quad 遗传算法的解空间与编码空间的可能需要进行适当的转换,也就是说适值计算需要在解空间内进行,而遗传运算是对编码空间操作的,所以要进行两个空间的转换,单体的数值的转化如图1所示,常常利用二进制编码与十进制编码的转化方法,同时整体种群的变异,交叉等操作都需要在二进制编码上进行,如图2所示。
在这里插入图片描述
在这里插入图片描述

2.3.选择操作

\quad 在遗传算法每一代的遗传方面,就涉及到了选择操作,选择概率的计算方法,按比例的适应度函数、基于排序的适应度计算等,其中选择算法有轮盘赌选择、随机遍历抽样、截断选择、锦标赛选择等方法,我们最常利用轮盘赌方法来进行选择操作。
\quad 轮盘赌选择(Roulette Wheel Selection)是一种遗传算法中常用的选择方法。它的基本思想是根据个体的适应度值来决定其被选择的概率,类似于在轮盘上抽签。首先,我们计算种群中每个个体的适应度值,适应度值反映了个体在当前问题中的表现。然后,将这些适应度值归一化,转换为每个个体的选择概率,确保所有个体的选择概率加起来等于1。接着,计算累积概率(即累积适应度值),每个个体的累积概率表示从第一个个体到当前个体的总选择概率。然后在选择个体时,生成一个0到1之间的随机数r,然后通过比较这个随机数与累积概率,确定选择的个体。如果随机数r小于某个累积概率CDF_i,则选择对应的第i个个体。这样,每个个体被选择的概率与其适应度成正比,适应度越高的个体被选择的概率越大。
在这里插入图片描述
在这里插入图片描述

2.4.交叉操作

\quad 交叉(Crossover)是指在遗传算法中,一对父代个体发生染色体交叉交换的操作,交叉发生的概率叫做交叉率,通常用Pc表示,常设定为0.8至0.9。根据编码方式的不同,交叉操作有多种形式:对于二进制和整数编码,常见的交叉方法包括单切点交叉、双切点交叉和均匀交叉;对于顺序编码,则使用部分映射交叉、顺序交叉和循环交叉;对于实数编码,则包括离散交叉和线性重组等方法。

\quad 其中,单切点交叉(Single-Point Crossover) 是最基础的一种交叉方法,适用于二进制和整数编码。在单切点交叉中,首先在父代个体的基因序列中随机选择一个切点,然后将两个父代个体在该切点处分开,交换彼此的基因部分,以生成新的子代个体。例如,假设有两个父代个体A和B,切点选择在第k位,那么子代个体C和D的基因序列将是父代个体A和B在切点k处分开的部分进行交换,从而生成新的个体。单切点交叉的优点是实现简单,能够有效地在基因之间进行信息重组,促进解空间的探索。
在这里插入图片描述

2.5.变异操作

\quad 变异率(Mutation Rate),用Pm表示,是遗传算法中控制染色体上基因发生变异的概率,通常设置得较小,一般在0.05以下,以维持种群的稳定性。变异操作首先需要根据变异率Pm,随机选择NPPm个个体进行变异,其中NP是种群大小。对于每个被选中的个体,再随机选择round(LPm)个基因进行变异,将这些基因的值进行取反,即0变成1,1变成0。最终,将变异后的个体更新到种群中,并保留最优个体fBest在新种群中,以确保最优解不会丢失。这种变异操作通过引入基因的多样性,帮助算法避免陷入局部最优解,同时保持种群的优秀特征。
在这里插入图片描述

2.6.算法流程

\quad 遗传算法的基本流程包括几个关键步骤。首先,生成初始种群,通过随机方式创建一组个体。接下来,计算每个个体的适应度值,评估其在目标函数中的表现。然后,根据适应度值选择个体进入下一代,常用的选择方法包括轮盘赌选择和锦标赛选择。选择后的个体进行交叉操作,模拟基因重组,生成新的子代个体。接着,对新生成的个体进行变异操作,引入基因变异,以增加种群的多样性。更新种群时,将新个体与旧种群结合,可能需要替换一些旧个体,并保留最优个体以确保优秀基因的传递。最后,检查是否满足终止条件,如达到最大代数或适应度收敛,若满足条件则结束算法,输出当前代中最优个体作为近似解。这些步骤帮助遗传算法逐步优化解的质量,并在复杂的解空间中寻找最优解。
在这里插入图片描述

3.算法实现

3.1.MATLAB代码实现

%%%%%%%%%%%%%%%%%%%%标准遗传算法求函数极值%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化参数%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
tic;
NP=100; %种群数量
L=20; %二进制数串长度
Pc=0.8; %交叉率
Pm=0.7; %变异率
G=100; %最大遗传代数
Xs=10; %上限
Xx=0; %下限
%编码方式采用二进制编码方法
f=randi([0,1],NP,L); %随机获得初始种群
%%%%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:G
%%%%%%%%%%%%将二进制解码为定义域范围内十进制%%%%%%%%%%%%%%
for i=1:NP
    U=f(i,:);
    m=0;
    for j=1:L
        %将二进制编码转化为十进制
        m=U(j)*2^(j-1)+m;
    end
        %将解码结果映射到[Xx,Xs]区间
        x(i)=Xx+m*(Xs-Xx)/(2^L-1);
        Fit(i)= func2(x(i));%带入值进行计算
end

maxFit=max(Fit); %最大值
minFit=min(Fit); %最小值
rr=find(Fit==maxFit);%获取最优结果对应的索引
fBest=f(rr(1,1),:); %历代最优个体
xBest=x(rr(1,1));%获取最好的结果
Fit=(Fit-minFit)/(maxFit-minFit); %归一化适应度值
%%%%%%%%%%%%%%%%%%基于轮盘赌的复制操作%%%%%%%%%%%%%%%%%%%
sum_Fit=sum(Fit);
fitvalue=Fit./sum_Fit;%将适应度转化为被选择的概率
fitvalue=cumsum(fitvalue);%变成当前被选择时的累计概率
ms=sort(rand(NP,1));%生成随机数
fiti=1;newi=1;
%轮盘赌选择个体
while newi<=NP
    if (ms(newi))<fitvalue(fiti)
        nf(newi,:)=f(fiti,:);
        newi=newi+1;
    else
        fiti=fiti+1;
    end
end
%%%%%%%%%%%%%%%%%%%%%%基于概率的交叉操作%%%%%%%%%%%%%%%%%%
for i=1:2:NP
    %简单地随机交叉操作
    p=rand;
    %随机生成一个p如果p小于pc,执行交叉操作,反正不执行。
    if p<Pc
        %随机选择交叉的位置
        q=randi([0,1],1,L);
        for j=1:L
            if q(j)==1;
                temp=nf(i+1,j);
                nf(i+1,j)=nf(i,j);
                nf(i,j)=temp;
            end
        end
    end
end
%%%%%%%%%%%%%%%%%%%基于概率的变异操作%%%%%%%%%%%%%%%%%%%%%%%
i=1;
    while i<=round(NP*Pm)%随机选择NP*Pm个个体进行变异
        h=randi([1,NP],1,1); %随机选取一个需要变异的染色体
        for j=1:round(L*Pm)
            g=randi([1,L],1,1); %随机需要变异的基因数
            nf(h,g)=~nf(h,g);%0,1的位置取反
        end
        i=i+1;
    end
    f=nf;
    f(1,:)=fBest; %保留最优个体在新种群中
    trace(k)=maxFit; %历代最优适应度
end
xBest; %最优个体
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
print(gcf,'C:\Users\Zeng Zhong Yan\Desktop\GA','-dpng','-r600')

在这里插入图片描述

3.2.Python代码实现

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Times New Roman'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 定义优化的目标函数
def func1(x):
    return x + 10 * np.sin(5 * x) + 7 * np.cos(4 * x)

# 初始化参数
NP = 100  # 种群大小
L = 20  # 二进制字符串的长度
Pc = 0.8  # 交叉率
Pm = 0.9  # 变异率
G = 50  # 最大代数
Xs = 10  # 上界
Xx = 0  # 下界

# 生成初始种群
f = np.random.randint(0, 2, (NP, L))

# 遗传算法循环
trace = np.zeros(G)
for k in range(G):
    # 将二进制字符串解码为十进制数
    x = np.zeros(NP)
    for i in range(NP):
        U = f[i, :]
        m = sum(U[j] * 2**j for j in range(L))
        x[i] = Xx + m * (Xs - Xx) / (2**L - 1)
    
    # 计算每个个体的适应度
    Fit = np.array([func1(xi) for xi in x])
    maxFit = np.max(Fit)
    minFit = np.min(Fit)
    rr = np.where(Fit == maxFit)[0]
    fBest = f[rr[0], :]  # 记录当前代的最优个体
    xBest = x[rr[0]]
    
    # 归一化适应度值
    Fit = (Fit - minFit) / (maxFit - minFit)
    
    # 轮盘赌选择
    sum_Fit = np.sum(Fit)
    fitvalue = Fit / sum_Fit
    fitvalue = np.cumsum(fitvalue)  # 计算累积适应度值
    ms = np.sort(np.random.rand(NP))  # 生成并排序随机数
    new_population = np.zeros_like(f)
    fiti = 0
    newi = 0
    while newi < NP:
        if ms[newi] < fitvalue[fiti]:
            new_population[newi, :] = f[fiti, :]
            newi += 1
        else:
            fiti += 1
    
    # 交叉操作
    for i in range(0, NP, 2):
        if np.random.rand() < Pc:
            q = np.random.randint(0, 2, L)
            for j in range(L):
                if q[j] == 1:
                    new_population[i, j], new_population[i+1, j] = new_population[i+1, j], new_population[i, j]
    
    # 变异操作
    for i in range(round(NP * Pm)):
        h = np.random.randint(0, NP)
        for j in range(round(L * Pm)):
            g = np.random.randint(0, L)
            new_population[h, g] = 1 - new_population[h, g]
    
    f = new_population
    f[0, :] = fBest  # 保留最优个体在新种群中
    trace[k] = maxFit  # 记录每代的最优适应度值

print("最优个体:", xBest)

# 绘制适应度进化曲线
plt.plot(trace)
plt.xlabel('The number of iterations',fontsize=14)
plt.ylabel('The value of the objective function',fontsize=14)
plt.title('Fitness Evolution Curve ',fontsize=18)
plt.savefig('GA.svg', dpi=600,bbox_inches='tight')
plt.show()

在这里插入图片描述

4.参考文献

[1]https://blog.csdn.net/LOVEmy134611/article/details/111639624
[2]https://blog.csdn.net/zyx_bx/article/details/115188782
[3]https://baike.baidu.com/item/
[4]https://chatgpt.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Golang 面试 - 进阶题】每日 3 题(八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

重塑七人拼团模式:社交电商的裂变新策略

在当今的电商领域&#xff0c;七人拼团模式作为一种创新的商业模式&#xff0c;正以其独特的魅力引领着中小型企业迈向新的增长阶段。这一模式巧妙融合了社交电商的互动性与拼购的趣味性&#xff0c;旨在通过用户间的自然传播&#xff0c;实现市场的快速渗透与品牌影响力的显著…

【赛事推荐】2024中国高校计算机大赛人工智能创意赛

“中国高校计算机大赛”&#xff08;China Collegiate Computing Contest&#xff0c;简称C4&#xff09;是面向全国高校各专业在校学生的科技类竞赛活动&#xff0c;于2016年由教育部高等学校计算机类专业教学指导委员会、教育部高等学校大学软件工程专业教学指导委员会、教育…

NSS [SWPUCTF 2022 新生赛]funny_php

NSS [SWPUCTF 2022 新生赛]funny_php 开题&#xff0c;直接给了源码 <?phpsession_start();highlight_file(__FILE__);if(isset($_GET[num])){if(strlen($_GET[num])<3&&$_GET[num]>999999999){echo ":D";$_SESSION[L1] 1;}else{echo ":C&…

Express基于Node.js基础知识【1】全面总结 推荐收藏

最近在用基于node.js平台的web应用开发做项目&#xff0c;梳理了下关于Express框架的相关知识&#xff0c;方便自己以后查看&#xff0c;希望也能帮助证字啊学习express相关知识的同学&#xff0c;欢迎大家参考&#xff0c;有问题评论区留言&#xff0c;谢谢。 目录 1.安装 …

【人工智能】基础三:深度学习概述、人工神经网络基础

文章目录 一. 深度学习1. 深度学习概念2. 深度学习原理3. 深度学习学习方式4. 深度学习训练方法 二. 人工神经网络基础1. 神经元感知器模型2. 神经网络模型2. 学习方式3. 学习规则3.1. 正向传播求误差3.2. 反向传播求偏导&#xff08;ing&#xff09; 4. 激活函数 一. 深度学习…

【环境搭建问题】linux服务器安装conda并创建虚拟环境

1.检查有没有conda 首先看root文件夹下有没有anaconda或者conda 没有的话就要先下载安装conda&#xff1a; https://repo.anaconda.com/archive/index.html 在这个链接下找自己需要的。服务器一般为linux&#xff0c;所以我这里选择的是&#xff1a; 2.安装conda 下载安装…

阳光混合试验的三个指标

户外干燥气候循环系统&#xff08;仿真模拟空气干燥气侯&#xff09;户外湿冷气侯循环系统&#xff08;仿真模拟寒湿和冰冷晚间气侯&#xff09;室内干燥气候耐久度 阳光模拟温湿度试验箱 主要用于汽车及零部件的曝晒试验、如塑料样板、仪表盘、中控屏、方向盘、保险杠等&…

基于 GADF+Swin-CNN-GAM 的高创新电能扰动信号识别模型!

往期精彩内容&#xff1a; 电能质量扰动信号数据介绍与分类-Python实现-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer…

【计算机毕设论文】基于SpringBoot的诗词管理系统

&#x1f497;博主介绍&#xff1a;✌全平台粉丝5W,高级大厂开发程序员&#x1f603;&#xff0c;博客之星、掘金/知乎/华为云/阿里云等平台优质作者。 【源码获取】小伙伴可以关注我 感兴趣的可以先收藏起来&#xff0c;同学门有不懂的毕设选题&#xff0c;项目以及论文编写等…

轻松入门Linux—CentOS,直接拿捏 —/— <1>

一、什么是Linux Linux是一个开源的操作系统&#xff0c;目前是市面上占有率极高的服务器操作系统&#xff0c;目前其分支有很多。是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统 Linux能运行主要的UNIX工具软件、应用程序和网络协议 Linux支持 32…

小程序开发_05协同工作和发布

一、开发流程 二、权限管理 三、不同成员的权限 四、小程序发布上线的步骤 上传代码--->提交审核-->发布1. 上传代码 提交审核 三、发布上线

文件IO相关作业

1> 使用文件IO完成&#xff0c;将源文件中的所有内容进行加密&#xff08;大写转小写、小写转大写&#xff09;后写入目标文件中 源文件内容不变 #include<myhead.h>int main(int argc, const char *argv[]) {//判断传入的是否是两个文件if(argc!3){write(2,"inp…

期末复习资料——计算机系统基础

第一章 1、下列关于机器字长、指令字长和存储字长的说法中&#xff0c;正确的时_②、③_ ①三者在数值上总是相等的。②三者在数值上可能不相等。③存储字长是存放在一个存储单元中的二进制代码位数。④数据字长就是MDR的位数。 机器字长、指令字长和存储字长&#xff0c;三…

【区块链+绿色低碳】碳低链 | FISCO BCOS应用案例

在碳中和、碳达峰国家战略的号召下&#xff0c;碳中和数字化、协同低碳的发展如火如荼。但是在金融业的实际场景应用中&#xff0c; 存在数据收集效率低、数据核查困难、服务单一等问题&#xff0c;痛点集中为两个&#xff1a;一是数据冗杂&#xff0c;可能会存在数据篡改&…

【python报错已解决】`AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 在数据分析或者数据处理的过程中&#xff0c;我们经常会遇到各种各样的报错信息&#xff0c;这些报错信息往…

【漏洞复现】APP分发签名系统index-uplog.php存在任意文件上传漏洞

漏洞描述 APP分发签名系统index-uplog.php存在任意文件上传漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵…

游戏类App出海广告变现,新手开发者如何选对聚合广告平台?

无论是轻量化小游戏还是中重度游戏&#xff0c;厂商的终极目标都是盈利。从商业化角度来说&#xff0c;单一的变现模式存在一些问题。纯内购驱动的游戏除了少数大竞技品类&#xff0c;大多是为垂直玩家设计&#xff0c;难以扩量。而纯广告变现驱动的游戏&#xff0c;在抗风险方…

所谓有趣的灵魂,实际上就是这个人的信息密度和知识层面,都远高于你!

1. 信息界的“百科全书” 信息密度&#xff1a;大脑里的“硬盘” 我们先来八一八什么是信息密度。想象一下&#xff0c;如果大脑是个硬盘&#xff0c;那么信息密度高的人&#xff0c;硬盘里存的可都是高清大片和无损音乐&#xff0c;随时准备给你来一场视听盛宴。 知识层面&am…

vue3数据结构的渲染01

处理数据&#xff1a; //现有原始数据showCertificateUrl “url01;url02” 使用以下代码将两条通过分号";"分割的url进行处理 const parseUrls () > {urls.value [];// 每次重新赋值前一定要清空之前的旧数据&#xff01;if (!showCertificateUrl.value) {retu…