当前位置: 首页 > news >正文

对遗传算法思想的理解与实例详解

目录

一、概述

二、实例详解

1)问题描述与分析

2)初始化种群

3)计算种群适应度

4)遗传操作

5)基因交叉操作

6)变异操作

三、计算结果

四、总结 


一、概述

       遗传算法在求解最优解的问题中最为常用,不论是在线性还是非线性问题中都得到广泛运用。本文主要介绍对遗传算法思想的个人理解,并结合一个简单实例进行说明,以便在后续实际问题中能够借助遗传算法思想解决问题。首先需要明白的是,遗传算法只是一种求解最优近似解的算法之一,它不是用于求解精确解的方法。当然,如果我们能得到精确解,自然也没必要去研究最优近似解。

       从遗传算法的名字我们也可知道,这个算法的思想借助了生物学上生物进化与基因遗传的思想。生物个体在进化过程中,基因代代相传,并在传递过程中出现基因混合、突变等现象,然后适应环境的基因被保存下来,不适应环境的基因被淘汰出局,如此生物基因逐步达到与环境的最佳适配。遗传算法的迭代过程正式基于生物进化过程来构建,并用相应的数学概念来对应生物进化过程的个体、基因、遗传、混合(杂交)、淘汰等,其过程完全按照生物进化过程进行迭代演进。

       我们知道,生物进化中基因传递、自然淘汰等都是不可预测的概率事件。因此,遗传算法迭代过程也充满了不可预测性。虽然总体趋势是向最优方向发展,但是我们并不能准确给出何时算法能得到我们认为的最优近似结果。也或许在某些问题中,我们根本不知道得到的结果是否就是最好的解。

二、实例详解

1)问题描述与分析

      使用遗传算法计算函数result = x + 10 * sin(4*x) + 7 * cos(3*x)在自变量[0,10]以内的最大值。这是一个非常简单的求极值问题,我们通过解析法也可以得到精确解,但是此处我们需要借助这个问题来详细说明遗传算法的实现。通过前面的概述,我们可以知道遗传算法的实现应该依次有以下步骤:创建一个初始种群—>计算种群的适应度—>种群遗传—>新种群杂交—>新种群变异—>计算新种群适应度,如此循环进行上述操作,直到我们得到合适的结果或迭代步数完成为止。下面借助MATLAB逐一说明每一步的实现过程。

2)初始化种群

       从生物学角度来讲,一个种群包含若干个体,一个个体包含若干基因。因此,初始化种群前我们需要确定这个种群的个体数量和每个个体包含多少基因。在实际操作中,种群的大小和基因数量都应根据实际问题来分析设置,因为它们直接影响算法的收敛速度和求解精度。在此问题中,我们可以选择种群数量为50个个体,这个值尽量大一点,在计算机性能允许的条件下。每个个体的基因数量设置为20。

       此处作进一步说明,个体其实就是我们预设的一组方程x的解,这里我们随机预设了50个解,当然我们并不知道其中是否包含了最优解,这50个解我们将使用程序自动随机生成。个体的基因其实就是对每个解使用二进制编码时需要使用的二进制位数,这个位数越长,解的精度越高,当然对计算机性能的要求也越高,如果实际问题对求解精度要求很高,需要编码长度越长。在遗传算法中,使用二进制对个体(解)进行编码是最常用,且最直观的方式,因此此处就直接采用二进制编码形式。初始化种群的具体实现如下段MATLAB代码所示。

        此段代码已逐行解释,核心是initial_group = randi([0,1],NP, L),randi函数实现了一个随机初始化种群,并将该种群放入矩阵initial_group中。randi函数的作用是生成一个NP行,L列的整数矩阵,该矩阵中的元素在0和1之间随机取值。由此我们可以知道,initial_group矩阵中,每一行表示一个个体,共有50个,每个个体包含20个基因,而基因是由0和1组成的。至于每个个体和解的对应关系,后面详述。

NP = 50;%种群个体数量
L = 20;%个体编码长度
PC = 0.8;%交叉概率
PB = 0.1;%变异概率
G = 100;%最大迭代次数
up = 10;%上限
down = 0;%下限
initial_group = randi([0,1],NP, L);%初始化种群

3)计算种群适应度

        计算种群适应度,就是要得到在当代的种群中,每个个体对环境的适应度,环境适应度高的个体我们保留并遗传至下一代,适应度低的个体我们就淘汰。在此问题中我们要做的就是得到每个个体接近最大值的程度,因此我们要分析如何来设计这个适应度函数。从某种程度上说,适应度函数的设计是影响遗传算法解决实际问题效果的核心环节。某些地方也将适应度函数称为评价函数,即用于评价群体中个体的优劣。适应度函数也是实际问题与遗传算法相关联的关键数学模型,在此问题中,我们直接给出了一个数学模型,分析时比较简单,但在许多实际问题中需要我们自己去建立一个合理的数学模型,这也是用遗传算法解决实际问题的难点所在。

       在本问题中,我们的目的是求函数的最大值(x,y),并给出了函数公式,因此我们可以直接采用原函数作为适应度函数,将个体带入函数中,得到的值越大,说明个体适应度越高,简单且直观。

function result = fitnessFun(x)
result = x + 10 * sin(4*x) + 7 * cos(3*x);
end

       而我们在具体实现时还需要做一些处理。 首先是将群体中的个体转换为适应度函数的输入值,我们初始化得到的群体是一群使用二进制编码的个体,并不是直观的函数输入值,所以我们首先需要将二进制编码的个体转换为十进制数,并将这群个体限制在给定的求值范围内,这样就得到了适应度函数可用的输入值,具体代码如下:

U = initial_group(i,:);
value = 0;
for j = 1:Lvalue = U(j)*2^(j-1) + value;
end
x(i) = down + value * (up - down)/(2^L - 1);%将编码转换为函数输入值

       然后,我们将转换后的个体带入适应度函数中,就可以得到每个个体的适应度值。此处对适应度值进行了归一化处理,将适应度控制在0到1之间,便于后续处理。

 Fit = fitnessFun(x);maxFit = max(Fit);%最大适应度值minFit = min(Fit);%最小适应度值inde_maxFit = find(Fit == maxFit);%适应度最大的个体所在位置,可能有多个值best_unit = initial_group(inde_maxFit(1,1),:);%当代中最优个体best_unitV = x(inde_maxFit(1,1));%该最优个体对应的值Fit = (Fit - minFit)/(maxFit - minFit);%归一化适应度值,限制在0到1之间

4)遗传操作

       以下开始进行进化操作,首先是进行遗传,即根据当代种群的适应度值选择哪些个体可以被遗传到下一代。常用的遗传操作方法是轮盘赌方式,具体实现代码如下所示。轮盘赌方式就是将个体的概率按大小成比例按顺序分布在圆盘上,圆盘扇形区域的大小反映了个体概率大小。当转动轮盘时,指针最后指向的区域对应个体就是选中的个体。由此可知,个体概率越大,被选中的概率就越大。

       下述代码中,前两行是将适应度值转化为概率值。cumsum函数将概率值进行逐项连续累加,作为轮盘赌的概率值。while循环中执行了轮盘赌操作,总共执行了NP(50)次。采用轮盘赌操作后,适应度高的个体被遗传到下一代的概率大,且同一个个体存在被多次遗传到下一代的可能。通过遗传操作后,新的种群数量与上一代个体数量保持一致。

sum_fit = sum(Fit);
fitvalue = Fit./sum_fit;
fitvalue = cumsum(fitvalue);%对向量fitvalue进行逐项累加,返回一个向量如:1 2 3,返回1 3 6
ms = sort(rand(NP,1));%生成一组随机向量,并按从小到大排序
inde_fit = 1;
inde_newUnit = 1;
while inde_newUnit <= NP%执行轮盘赌操作,上一代中同一个个体存在被多次遗传至下一代的可能if(ms(inde_newUnit)) < fitvalue(inde_fit)new_group(inde_newUnit,:) = initial_group(inde_fit,:);%复制个体,直接遗传至下一代inde_newUnit = inde_newUnit + 1;elseinde_fit = inde_fit +1;end
end

5)基因交叉操作

       交叉操作是指在上述新产生的子代群体中,选择两个个体,对这两个个体对应位置的基因进行交换。具体实现代码如下,我们直接依次选取相邻两个个体进行交叉操作。p是随机生成的一个随机数,通过与PC比较用于判断是否要执行交叉操作。q是随机生成的一个长度为L的0和1的向量。这个向量的作用是用于实现随机选择需要交叉的位置。此处我们将元素1对应的位置进行交叉。向量q保证了我们执行交叉时,交叉的位置和基因数量的随机性。

    for i = 1:2:NP%在相邻两个个体之间执行交叉操作p = rand;%产生一个随机数if p < PCq = randi([0,1],1,L);for j = 1:Lif q(j) == 1temp = new_group(i+1, j);new_group(i+1, j) = new_group(i, j);new_group(i, j) = temp;endendendend

6)变异操作

        变异就是将一个个体中某些位置的基因进行修改,对于二进制编码的个体而言,就是将部分位置的编码元素取反。具体实现如下,while循环表征了执行变异次数的随机性,inde_varUnit表征了执行变异个体的随机性,for循环表征了执行变异基因的位置和数量的随机性。

    i = 1;while i <= round(NP*PB)inde_varUnit = randi([1,NP]);%随机指定需要变异的个体for j = 1:round(L*PB)inde_varD = randi([1,L]);%随机指定需要变异的基因位置new_group(inde_varUnit, inde_varD) = ~new_group(inde_varUnit, inde_varD);%取反即可endi= i + 1;end

三、计算结果

在本实例中,函数的实际图像如下,函数的最大值约为(8.28,24.8935)。

采用遗传算法求解过程如下,得到的最优解为(8.28822,24.9005),相差很小。 参考源代码实现。

四、总结 

        本文详细讲述了经典遗传算法的思想和典型案例实现思路。遗传算法从一群初始解中去寻找最优解,并在迭代过程中不断优化这个解群,其优化方法是大概率继承前一代中最优的解,并对新的解群进行交叉、变异操作,以产生出新的解。在此过程中有两个关键环节,一是解的适应度函数模型,这个是连接遗传算法和实际问题的纽带,是我们分析实际问题是否适用遗传算法的关键;二是解的优化,从上述过程中我们可知,解的优化在交叉和变异,只有这两步才会在原有解的基础上产生出新的解,而这两步操作充满了随机性。其中交叉的概率我们设置得比较大,因为交叉后产生的新解大概率不会与原解存在较大的差异,避免新的解呈现大幅度杂乱无序的变化。而变异操作我们设置的概率很小,且在执行次数、变异位置和数量上都引入了变异概率。这是因为变异操作针对单个个体,一个编码位置的突变可能会导致出现一个异常偏离群体的个体,我们自然不能允许这样的个体在群体中大量出现,但是我们又不能杜绝这样的个体出现,因为没有异常偏离群体的个体,我们可能会丢失可能存在的其他最优解,而陷入局部最优中,变异操作在一定程度上可以避免这样的情况。

        从本文实例中我们还可知,遗传算法的初始解群体对算法收敛影响很大。本例中,我们限定了所有解的范围,算法收敛速度很快,如果我们不限定范围,或者我们将初始解群体限制在[0,5],可想而知我们可能得不到最优解,或陷入局部最优中。遗传算法提供的是一种求解最优解的思想,而不是一种固定的模式方法,套用模式只会限制它的应用。因此具体问题要具体分析,我们要尽可能在初始化群体时确保最优解在群体囊括的包络内,轮盘赌的遗传方式是否合适,是否需要继承一些适应度小的个体,变异的概率是否需要大一些,以确保群体的多样性等,这些都是在分析实际问题时需要考虑的。通常情况下,如果我们无法限定解的范围,也无法确定适应度函数的趋势,那么使用遗传算法求解也是不合适的。比如在此例中,不限定解的范围,在整个实数域我们是无法求解的。

相关文章:

  • odoo-049 Pycharm 中 git stash 后有pyc 文件,如何删除pyc文件
  • python打卡day20
  • LeetCode 热题 100_编辑距离(94_72_中等_C++)(动态规划)
  • 并发设计模式实战系列(19):监视器(Monitor)
  • C#参数数组全解析
  • 人工智能之数学基础:二次型
  • H5 移动端适配最佳实践落地指南。
  • Java如何获取电脑分辨率?
  • 前端学习(1)—— 使用HTML编写一个简单的个人简历展示页面
  • spring ai alibaba 使用 SystemPromptTemplate 很方便的集成 系统提示词
  • 2025.05.08-得物春招算法岗-第二题
  • com.fasterxml.jackson.dataformat.xml.XmlMapper把对象转换xml格式,属性放到标签<>里边
  • 2.MySQL数据库操作
  • PMIC电源管理模块的PCB设计
  • PostgreSQL冻结过程
  • 使用零样本LLM在现实世界环境中推广端到端自动驾驶——论文阅读
  • Windows远程访问Ubuntu的方法
  • IBM BAW(原BPM升级版)使用教程第六讲
  • YOLOv8 优化:基于 Damo-YOLO 与 DyHead 检测头融合的创新研究
  • Android系统架构模式分析
  • 匈牙利外长称匈方已驱逐两名乌克兰外交官
  • 四川资阳市原市长王善平被双开,“笃信风水,大搞迷信活动”
  • 数说母亲节|妈妈的妈妈带娃比例提升,托举效果如何?
  • 一周文化讲座|城市移民与数字时代的新工作
  • 七方面118项任务,2025年知识产权强国建设推进计划印发
  • 青岛双星名人集团管理权之争:公司迁址,管理层更迭