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

news2024/11/18 12:38:41

目录

前言

一、什么是遗传算法?

(一)基本结构

(二)遗传操作

二、仿真过程

(一)主程序部分

(二)选择函数

(三)交叉函数

(四)变异函数

(五)仿真结果

总结


前言

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


一、什么是遗传算法?

        遗传算法(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.coloradmin.cn/o/1900295.html

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

相关文章

2024年加密货币市场展望:L1、L2、LSD、Web3 和 GameFi 板块的全面分析与预测

随着区块链技术的快速发展&#xff0c;加密货币市场在2024年继续展现出蓬勃的生机和创新的潜力。本文将深入分析L1、L2、LSD、Web3和GameFi这五大板块的发展趋势和预测&#xff0c;帮助投资者和爱好者更好地理解和把握市场机遇。 一、L1&#xff1a;基础层协议的持续进化 L1&a…

最新全平台无人直播硬改XCMS系统,支持任何平台

软件功能: 改虚拟摄像头为真实摄像头&#xff0c;改真实麦克风&#xff0c;图层去重、镜头晃动、增加噪点去重、随机播放辅音&#xff0c;两条音轨帮助音频去重、随机音效、随机播放速度&#xff0c;直播源实时转播等等.防违规&#xff0c;防非实时 设备需求: 电脑&#xf…

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

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

IT入门知识第八部分《人工智能》(9/10)

1.引言 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;已成为推动技术革新的关键力量。它们不仅改变了我们与机器的互动方式&#xff0c;还极大地拓展了解决问题的可能性。本文将深入探讨人工智能和机器学习的基础&…

全新桌面编辑器

目录 前言 一、链接 ONLYOFFICE 8.1版本 官网下载链接&#xff1a; ONLYOFFICE 在线工具&#xff1a; 下载版本推荐&#xff1a; 二、使用体验 1. 界面设计&#xff1a; 2. 文档编辑功能&#xff1a; 3. 电子表格功能&#xff1a; 4. 演示文稿功能&#xff1a; 5.PDF编…

在centos7上部署mysql8.0

1.安装MySQL的话会和MariaDB的文件冲突&#xff0c;所以需要先卸载掉MariaDB。查看是否安装mariadb rpm -qa | grep mariadb 2. 卸载mariadb rpm -e --nodeps 查看到的文件名 3.下载MySQL安装包 MySQL官网下载地址: MySQL :: Download MySQL Community Serverhttps://dev.mys…

玩转Easysearch语法

Elasticsearch 是一个基于Apache Lucene的开源分布式搜索和分析引擎&#xff0c;广泛应用于全文搜索、结构化搜索、分析等多种场景。 Easysearch 作为Elasticsearch 的国产化替代方案&#xff0c;不仅保持了与原生Elasticsearch 的高度兼容性&#xff0c;还在功能、性能、稳定性…

乐清网站建设规划书

乐清是位于浙江省温州市的一个县级市&#xff0c;拥有悠久的历史和丰富的文化底蕴。随着互联网的快速发展&#xff0c;网站建设成为推动乐清经济和文化发展的重要手段。因此&#xff0c;我们认为有必要制定一个全面的乐清网站建设规划书&#xff0c;以促进乐清的经济繁荣和文化…

Banana Pi BPI-M4 Berry创建热点和设置静态IP

create_ap是一个帮助快速创建Linux上的WIFI热点的脚本&#xff0c;并且支持bridge和NAT模式&#xff0c;能够自动结合hostapd, dnsmasq和iptables完成WIFI热点的设置&#xff0c;避免了用户进行复杂的配置&#xff0c;github地址如下&#xff1a; https://github.com/oblique/…

add_metrology_object_generic 添加测量模型对象。找两条直线,并计算两条线的夹角和两个线的总长度,转换成毫米单位

*添加测量模型对象 *将测量对象添加到测量模型中 *算子参数&#xff1a; *    MeasureHandle&#xff1a;输入测量模型的句柄&#xff1b; *    Shape&#xff1a;输入要测量对象的类型&#xff1b;默认值&#xff1a;‘circle’&#xff0c;参考值&#xff1a;‘circl…

Python | Leetcode Python题解之第218题天际线问题

题目&#xff1a; 题解&#xff1a; class Solution:def getSkyline(self, buildings: List[List[int]]) -> List[List[int]]:buildings.sort(keylambda bu:(bu[0],-bu[2],bu[1]))buildings.append([inf,inf,inf])heap [[-inf,-inf,-inf]]ans []for l,r,h in buildings:i…

nginx的知识面试易考点

Nginx概念 Nginx 是一个高性能的 HTTP 和反向代理服务。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好。 Nginx 专为性能优化而开发&#xff0c;性能是其最重要的考量指标&#xff0c;实现上非常注重效率&#…

四、centos7安装nginx

来源网站&#xff1a;山海同行 来源地址&#xff1a;https://shanhaigo.cn 网站简介&#xff1a;一站式编程学习、资源、导航网站 本篇资源&#xff1a;以整理分类并关联本篇地址 本篇地址&#xff1a;https://shanhaigo.cn/courseDetail/1805875642621952000 安装系统centos7 …

Unity 简单载具路线 Waypoint 导航

前言 在游戏开发和导航系统中&#xff0c;"waypoint" 是指路径中的一个特定位置或点。它通常用于定义一个物体或角色在场景中移动的目标位置或路径的一部分。通过一系列的 waypoints&#xff0c;可以指定复杂的移动路径和行为。以下是一些 waypoint 的具体用途&…

【课程总结】Day13(下):人脸识别和MTCNN模型

前言 在上一章课程【课程总结】Day13(上):使用YOLO进行目标检测,我们了解到目标检测有两种策略,一种是以YOLO为代表的策略:特征提取→切片→分类回归;另外一种是以MTCNN为代表的策略:先图像切片→特征提取→分类和回归。因此,本章内容将深入了解MTCNN模型,包括:MTC…

WPF UI 3D 多轴 机械臂 stl 模型UI交互

1、三维插件环境调整 2、动态模型材质处理 3、动态模型鼠标交互 4、模型旋转基本思路 5、六轴机械臂节点旋转处理 6、更多HelixToolkit插件处理案例 7、快速对接Blender模型 鼠标交互&#xff08;没有强调场景的变换&#xff09; 鼠标命中测试&#xff08;HitTest 不推荐&…

uni-app x 跨平台开发框架

目录 uni-app x 是什么 和Flutter对比 uts语言 uvue渲染引擎 组合式API的写法 选项式API写法 页面生命周期 API pages.json全局配置文件 总结 uni-app x 是什么 uni-app x&#xff0c;是下一代 uni-app&#xff0c;是一个跨平台应用开发引擎。 uni-app x 是一个庞…

基于STM32与ESP8266的智能电表设计与实现:实时监测,远程管理(附代码实例)

一、项目背景 随着物联网技术的快速发展&#xff0c;传统电表已经无法满足智能电网对用电信息采集、分析和管理的需求。智能电表作为新一代电能计量设备&#xff0c;具有实时监测、远程抄表、用电分析等功能&#xff0c;是实现智能电网的重要基础设施。 本项目旨在设计并实现…

Exploting an API endpoiint using documentation

HTTP request methods https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods 第一步:burp抓包刷新页面 httphistory中只能看到两个记录,可以看下Response,是HTML页面,说明这里有HTML页面 ,但是没有发现特定的API接口。 第二步:用户登录 转到用户登录的功能点处…

kubernetes集群部署:环境准备及master节点部署(二)

主机名IPv4地址IPv6地址角色安装组件操作系统k8s130-node190192.168.XX.190240a:XX::190masterkubeadm、kubelet、containerdAnolis OS 8.94.19.91-28.1.an8.x86_64k8s130-node191192.168.XX.191240a:XX::191nodekubeadm、kubelet、cri-oAnolis OS 8.94.19.91-28.1.an8.x86_64k…