(一)优化算法-遗传算法

目录

前言

一、什么是遗传算法?

(一)基本结构

(二)遗传操作

二、仿真过程

(一)主程序部分

(二)选择函数

(三)交叉函数

(四)变异函数

(五)仿真结果

总结


前言

        遗传算法是经典的智能化优化算法,可以针对非线性约束以及非凸函数进行相应的优化,得到近似的最优解,是科学研究中常用到的算法。该文针对遗传算法的基本思想、结构以及遗传的三个基本操作进行了分析讲解,并结合一个实例进行了仿真实验,读者可以根据仿真代码进行相应的修改,但是需要注意的一点是具体问题中的适应度函数以及参数设计需要自行调整,不同问题具体分析才能获得较好的结果。


一、什么是遗传算法?

        遗传算法(genetic algorithm,GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法,该算法属于智能算法,在函数优化等方面具有重要的应用价值。

        遗传算法中的一个种群由经过基因编码的一定数目的个体组成,每个个体实际上是染色体带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体形状的外部表现,如黑头发的特征需要实现从表现型到基因型的映射,即编码工作。由于仿照基因编码的工作很复杂,往往需要进行简化,如二进制演化出越来越好的近似解。在每一代,根据问题域中个体的适应度大小选择行组合交叉和变异。产生出代表新的解集的群中的最优个体经过解码,可以作为问题的近似最优解。

(一)基本结构

        人们对遗传算法进行了大量的改进,出现了自适应遗传算法、混合遗传算法等变形算法,但是其基础思想离不开Holland提出的基本算法,我们通常把Holland提出的算法称为基本遗传算法。其基本思想如图所示:

(二)遗传操作

        遗传操作包括以下三个:选择、交叉、变异。此外算法中涉及以下设计准则:

(1)种群的规模:种群规模太小时,很明显会出现近亲交配,产生病态基因,而且同时遗传算子存在随机误差(模式采样误差),妨碍小群体中有效模式的正确传播,且浪费资源,稳健性下降。种群规模的一个建议值为0~100。

(2)变异概率:当变异概率太小时,种群的多样性下降太快,容易导致有效基因的迅速丢失且不容易修补;当交异概率太大时,尽管种群的多样性可以得到保证,但是高阶模式迅速被破坏,因此通常选择0.001~0.2。

(3)交配概率:交配是生成新种群最重要的手段。与变异概率类似,交配概率太大容易破坏已有的有利模式,随机性增大,容易错失最优个体;交配概率太小不能有效更新种群。交配概率一般取0.4~0.99。

(4)进化代数:进化代数太小,算法不容易收敛,种群还没有成熟;代数太大,算法已经熟练或者种群过于早熟不可能再收敛,继续进化没有意义,只会增加时间开支和资源浪费。进化代数一般取100~500。

(5)种群初始化:初始种群的生成是随机的;在初始种群赋予之前,尽量进行一个大概的区间估计,以免初始种群分布在远离全局最优解的编码空间,导致遗传算法的搜索范围受到限制,同时也为算法减轻负担。

(6)适应度函数设计:遗传算法中适应度函数会影响选择概率的计算,所以适应度函数的值要取正值。由此可见,将目标函数映射成求最大值形式且函数值非负的适应度函数是必要的。适应度函数的设计主要满足单值、连续、非负、最大化;合理、一致性;计算量小;通用性强的特点。具体应用中适应度函数的设计按照问题本身的要求而定,其直接影响到遗传算法的性能。

二、仿真过程

        针对目标函数的优化做以下仿真,对应的函数及变量取值范围如下所示:

y=x^{2}+x;-2\leqslant x\leq 2

        代码如下(示例):

(一)主程序部分

clear all;
clc;
global BitLength    %全局变量,计算如果满足求解精度至少需要编码的长度
global boundsbegin  %全局变量,自变量的起始点
global boundsend    %全局变量,自变量的终止点
bounds = [-2, 2];   %一维变量的取值点
precision = 0.01; %运算精度
boundsbegin = bounds(:,1);
boundsend = bounds(:,2); %计算如果蛮子求解精度至少需要多长的染色体
BitLength = ceil(log2(boundsend-boundsbegin)'./precision);
popsize = 100; %初始种群的大小
Generationmax = 100; %最大代数
procssover = 0.8; %交配概率
pmutation = 0.8;  %变异概率
population = round(rand(popsize,BitLength)); %初始种群

%计算适应度
[Fitvalue,cumsump] = fitnessfun(population); % 输入群体population;返回适应度Fitvalue和积累概率cumsump

Generation = 1;
while Generation<Generationmax+1
    for j = 1:2:popsize %一对一对的群体进行如下操作(变异、交叉)
        %选择
        seln = selection(population,cumsump);
        %交叉
        scro = crossover(population,seln,procssover);
        scnew(j,:) = scro(1,:);
        scnew(j+1,:) = scro(2,:);

        %变异
        smnew(j,:) = mutation(scnew(j,:),pmutation);
        smnew(j+1,:) = mutation(scnew(j+1,:),pmutation);
    end

    %产生了新的种群
    population = smnew;

    %计算新种群的适应度
    [Fitvalue,cumsump] = fitnessfun(population); % 记录当前代最好的适应度和平均适应度
    [fmax,nmax] = max(Fitvalue); %最好的适应的度为fmax(即函数最大值),其对应的个体为nmax
    fmean = mean(Fitvalue);    %平均适应度为fmean
    ymax(Generation) = fmax;   %每代中的平均适应度
    ymean(Generation) = fmean; %每代中的平均适应度

    %记录当前代的最佳染色体个体
    x = transform2to10(population(nmax,:)); %population(nma,:)为最佳的染色体个体
    xx = boundsbegin + x*(boundsend - boundsbegin)/(power(2,BitLength)-1); %将二进制的值转换为定义域之内的值
    xmax(Generation) = xx;
    Generation = Generation + 1;

end
Generation = Generation - 1;
targetfunvalue = targetfun(xmax);
[Besttargetfunvalue,nmax] = max(targetfunvalue);
Bestpopulation = xmax(nmax);
%绘制经过遗传运算后的适应度曲线
figure(1);
hand1 = plot(1:Generation,ymax);
set(hand1,'Linestyle','-','Linewidth',1,'marker','*','markersize',8);
hold on;
hand2 = plot(1:Generation,ymean);
set(hand2,'color','k','Linestyle','-','Linewidth',1,'marker','h','markersize',8);
xlabel('进化代数');
ylabel('最大和平均适应度');
xlim([1 Generationmax]);
legend('最大适应度','平均适应度');
box off;
hold off;




(二)选择函数

function seln = selection(population,cumsump)
% 选择两个个体,可能两个个体的序号相同

for i = 1:2
    r = rand;
    prand = cumsump-r;
    j = 1;
    while prand(j)<0
        j = j +1;
    end
    seln(i) = j;
end
end

(三)交叉函数

function scro = crossover(population,seln,pc)
%新种群交叉操作
BitLength = size(population,2); %二进制数的个数
pcc = IfCroIfMut(pc); % 根据交叉概率决定是否进行交叉操作,1则是,0则否
%进行交叉操作
if pcc == 1
    cnb  = round(rand*(BitLength-2)) + 1; %随机产生一个交叉位
    scro(1,:) = [population(seln(1),1:cnb) population(seln(2),cnb+1:BitLength)];
    %序号为sen(1)的个体,在交叉位cnb前面的信息与序号为seln(2)的个体在交叉位cnb+1后面的信息重新组合

    scro(2,:) = [population(seln(2),1:cnb) population(seln(1),cnb+1:BitLength)];
    %序号为sen(2)的个体,在交叉位cnb前面的信息与序号为seln(1)的个体在交叉位cnb+1后面的信息重新组合
else
    %不进行交叉操作
    scro(1,:) = population(seln(1),:);
    scro(2,:) = population(seln(2),:);
end
end

(四)变异函数

function snnew = mutation(snew,pmutation)
% 新种群变异操作
% snew为一个个体

BitLength = size(snew,2);
snnew = snew;
pmm = IfCroIfMut(pmutation);

if pmm==1
    cnb = round(rand*(BitLength-1))+1; %在[1 BitLength]范围内随机产生一个变异位
    snnew(cnb) = abs(snew(cnb)-1); %将0变为1,将1变为0
end

end


(五)仿真结果

        仿真过程中用目标函数作为遗传算法的的适应度函数。从结果中可以看出,随着迭代次数的增加,对应的适应度函数值不断增大,进而目标函数值不断增大,得到函数的最大值。


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了遗传算法的思想以及使用,仿真结果表明遗传算法针对优化问题可以获得较好的结果,但是具体问题需要读者进行具体的分析和调参。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【优化论】约束优化算法

约束优化算法是一类专门处理目标函数在存在约束条件下求解最优解的方法。为了更好地理解约束优化算法&#xff0c;我们需要了解一些核心概念和基本方法。 约束优化的核心概念 可行域&#xff08;Feasible Region&#xff09;&#xff1a; 比喻&#xff1a;想象你在一个园艺场…

软连接迁移 Docker 的默认安装(存储)目录

前言 经常我们会拿到一些别人装好的服务器&#xff0c;需要在这些系统上启动我们的docker服务。 但是这些“专业人员”呢&#xff0c;有时候就会有非常不专业的操作&#xff0c;比如他把根目录/只划分50GB&#xff0c;/home却有51TB。这个时候就会导致我们的服务器还有很多空间…

万界星空科技机械加工行业MES解决方案

机械加工行业作为制造业的重要组成部分&#xff0c;面临着生产效率、成本控制和产品质量提升等多重挑战。为了应对这些挑战&#xff0c;引入并实施制造执行系统&#xff08;MES&#xff09;成为了行业的必然选择。本文将详细介绍一种针对机械加工行业的MES解决方案&#xff0c;…

STM32-HAL-FATFS(文件系统)(没做完,stm32f103zet6(有大佬的可以在评论区说一下次板子为什么挂载失败了))

1STM32Cube配置 1-1配置时钟 1-2配置调试端口 1-3配置uart 1-4配置SDIO&#xff08;注意参数&#xff09;&#xff08;其中他的初始化的异常函数给注释&#xff0c;SD卡文件写了&#xff09; 配置了还要打开中断和DMA可在我的其他文章中看一样的 1-5配置FatFs (只改了图选中…

【Kubernetes】Pod 资源调度之亲和性调度

Pod 资源调度之亲和性调度 1.Node 亲和性调度1.1 Node 硬亲和性1.2 Node 软亲和性 2.Pod 亲和性调度2.1 Pod 硬亲和2.2 Pod 软亲和2.3 Pod 反亲和 Kubernetes 的 默认调度器 以 预选、优选、选定机制 完成将每个新的 Pod 资源绑定至为其选出的目标节点上&#xff0c;不过&#…

Javase-异常

文章目录 1. 异常概述2. 异常的继承结构3. 自定义异常4. 异常的处理5. 异常的使用6. finally语句块7. 方法覆盖与异常 1. 异常概述 什么是异常 ①什么是异常?有什么用? 1.Java中的异常是指程序运行时出现了错误或异常情况&#xff0c;导致程序无法继续正常执行的现象。例如&…

【CG】计算机图形学(Computer Graphics)基础(其壹)

0 学习视频 B站GAMES101-现代计算机图形学入门-闫令琪 1 什么是计算机图形学 1.1 什么是好的画面&#xff1f; 画面足够亮。如果全局光照做的好&#xff0c;整个画面就会亮&#xff0c;看起来很舒服。 1.2 计算机图形学涉及到的领域 数学&#xff08;透视&#xff09;投影…

java基础:面向对象(一)

一、概念 物以类聚&#xff0c;分类的思维模式&#xff0c;思考问题首先会解决问题需要哪些分类&#xff0c;然后对这些分类进行单独思考。最后&#xff0c;才对某个分类下的细节进行面向过程的思索。面向对象适合处理复杂的问题&#xff0c;适合处理需要多人协作的问题!对于描…

vulhub靶场之DEVGURU:1

1 信息收集 1.1 主机发现 arp-scan -l 发现主机IP地址为“192.168.1.11 1.2 端口发现 nmap -sS -sV -A -T5 -p- 192.168.1.11 发现端口为&#xff1a;22&#xff0c;80&#xff0c;8585 1.3 目录扫描 dirsearch -u 192.168.1.11 发现存在git泄露 2 文件和端口访问 2…

idea中没有显示‘‘Spring‘‘一栏 (已解决)

第一步: 随便找一个Bean(即直接或者间接使用Component的类) 第二步: 找到左边的图标, 右键这个图标, 然后选择如下选项: 第三步: 成功 然后就成功了, 可以看到具体的bean了以及其bean的关系图等.

MySQL的Geometry数据处理之WKB方案

MySQL的Geometry数据处理之WKT方案&#xff1a;https://blog.csdn.net/qq_42402854/article/details/140134357 MySQL的Geometry数据处理之WKT方案中&#xff0c;介绍WTK方案的优点&#xff0c;也感受到它的繁琐和缺陷。比如&#xff1a; 需要借助 ST_GeomFromText和 ST_AsTex…

主从复制原理及操作

主从复制的概念 主从复制是一种在数据库系统中常用的数据备份和读取扩展技术&#xff0c;通过将一个数据库服务器&#xff08;主服务器&#xff09;上的数据变更自动同步到一个或多个数据库服务器&#xff08;从服务器&#xff09;上&#xff0c;以此来实现数据的冗余备份、读…

数据库之SQL(二)

目录 一、简述SQL中如何将“行”转换为“列” 二、简述SQL注入 三、如何将一张表的部分数据更新到另一张表 四、WHERE和HAVING的区别 一、简述SQL中如何将“行”转换为“列” 我们以MySQL数据库为例&#xff0c;来说明行转列的实现方式。 首先&#xff0c;假设我们有一张分…

WAIC 2024:科技界的摇滚狂欢,你错过了什么?

大数据产业创新服务媒体 ——聚焦数据 改变商业 2024年7月5日&#xff0c;WAIC 2024举办的第二天。数据猿作为受邀媒体&#xff0c;在今天继续亲历这一场关于未来的盛会。在这片汇聚了全球顶尖科技力量的舞台上&#xff0c;见证了人工智能领域的最新成果&#xff0c;感受到了科…

Midjourney对图片细微调整和下载保存

点击v2是对第二图片细微调整。 点击u3对第3张图片进行放大。 保存图片: 对点击u3放大的图片&#xff0c;双击 , 右键保存图片

hdu物联网硬件实验3 按键和中断

学院 班级 学号 姓名 日期 成绩 实验题目 按键和中断 实验目的 实现闪灯功能转换 硬件原理 无 关键代码及注释 /* Button Turns on and off a light emitting diode(LED) connected to digital pin 13, when pressing a pushbutton attached…

招聘一个1-3年经验的Java工程师:企业视角的技能与素质要求

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Spring的核心基础:感受一下对象工厂

“欢迎来到Spring&#xff01;”的小项目 &#xff08;1&#xff09;写一个HelloSpring的类&#xff0c;采用setter方法注入userName&#xff0c;写一个简单的show方法。 package com.itzhoutao; public class HelloSpring{private String userName;public void setUserName…

Spring源码十一:事件驱动

上一篇Spring源码十&#xff1a;BeanPostProcess中&#xff0c;我们介绍了BeanPostProcessor是Spring框架提供的一个强大工具&#xff0c;它允许我们开发者在Bean的生命周期中的特定点进行自定义操作。通过实现BeanPostProcessor接口&#xff0c;开发者可以插入自己的逻辑&…

核心实验:基于Web前端的性能测试分析!

实验简介 本实验主要利用IE和Chrome的F12开发人员工具结合Web前端测试分析相关知识&#xff0c;对常见网站进行基于前端的性能测试分析&#xff0c;本实验将不会使用到测试开发相关技术&#xff0c;而是纯粹意义上的手工测试&#xff0c;但却是很容易找到系统前端性能及设计问…