第10章 经典智能算法——10.2 遗传算法的MATLAB实现(1)

简介: 第10章 经典智能算法——10.2 遗传算法的MATLAB实现(1)

10.2  遗传算法的MATLAB实现(1)


遗传算法(Genetic Algorithm)是模拟自然界生物进化机制的一种算法,即遵循适者生存、优胜劣汰的法则,也就是在寻优过程中有用的保留,无用的则去除。遗传算法在科学和生产实践中表现为在所有可能的解决方法中找出最符合该问题所要求的条件的解决方法,即找出一个最优解。


10.2.1  基本原理


遗传操作是模拟生物基因遗传的做法。在遗传算法中,通过编码组成初始群体后,遗传操作的任务就是对群体的个体按照它们对环境适应度(适应度评估)施加一定的操作,从而实现优胜劣汰的进化过程。从优化搜索的角度而言,遗传操作可使问题的解一代又一代地优化,并逼近最优解。遗传算法过程如图10-7所示。

1c4453de38feecc66bf70d85df14db01_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

10-7  遗传算法过程

遗传操作包括以下3个基本遗传算子(Genetic Operator):选择(Selection)、交叉(Crossover)和变异(Mutation)。

个体遗传算子的操作都是在随机扰动情况下进行的。因此,群体中个体向最优解迁移的规则是随机的。需要强调的是,这种随机化操作和传统的随机搜索方法是有区别的。遗传操作进行高效有向的搜索,而不是如一般随机搜索方法一样进行无向搜索。

遗传操作的效果和上述3个基本遗传算子所取的操作概率、编码方法、群体大小、初始群体,以及适应度函数的设定密切相关。


1.选择


从群体中选择优胜的个体,淘汰劣质个体的操作叫选择。选择算子有时又称为再生算子(Reproduction Operator)。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。

轮盘赌选择法(Roulette Wheel Selection)是最简单也是最常用的选择方法。在该方法中,各个个体的选择概率和其适应度值成比例。设群体大小为n,其中个体i的适应度为fi,则i被选择的概率为f11695647440ad51620c7307a90c6650_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

显然,概率反映了个体i的适应度在整个群体的个体适应度总和中所占的比例。个体适应度越大,其被选择的概率就越大,反之亦然。

计算出群体中各个个体的选择概率后,为了选择交配个体,需要进行多轮选择。每一轮产生一个[0,1]之间的均匀随机数,将该随机数作为选择指针来确定被选个体。

个体被选后,可随机地组成交配对,以供后面的交叉操作。


2.交叉


在自然界生物进化过程中起核心作用的是生物遗传基因的重组(加上变异)。同样,在遗传算法中起核心作用的是遗传操作的交叉算子。所谓交叉,是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。通过交叉,遗传算法的搜索能力得以飞跃提高。

交叉算子根据交叉率将种群中的两个个体随机地交换某些基因,能够产生新的基因组合,期望将有益基因组合在一起。根据编码表示方法的不同,可以有以下算法:

1)实值重组(Real Valued Recombination)。

离散重组(Discrete Recombination)。

中间重组(Intermediate Recombination)。

线性重组(Linear Recombination)。

扩展线性重组(Extended Linear Recombination)。


2)二进制交叉(Binary Valued Crossover)。

单点交叉(Single-point Crossover)。

多点交叉(Multiple-point Crossover)。

均匀交叉(Uniform Crossover)。

洗牌交叉(Shuffle Crossover)。

缩小代理交叉(Crossover with Reduced Surrogate)。


最常用的交叉算子为单点交叉。具体操作是:在个体串中随机设定一个交叉点,在实行交叉时,该点前或后的两个个体的部分结构进行互换,并生成两个新个体。下面给出单点交叉的一个例子。

个体A1 0 0 1 ↑1 1 1 → 1 0 0 1 0 0 0 新个体

个体B0 0 1 1 ↑0 0 0 → 0 0 1 1 1 1 1 新个体


3.变异


变异算子的基本内容是对群体中的个体串的某些基因座上的基因值做变动。依据个体编码表示方法的不同,可以有以下算法:

实值变异。

二进制变异。


一般来说,变异算子操作的基本步骤如下:

对群体中所有个体以事先设定的变异概率判断是否进行变异。

对进行变异的个体随机选择变异位进行变异。


遗传算法引入变异的目的有两个:一是使遗传算法具有局部的随机搜索能力。当遗传算法通过交叉算子已接近最优解邻域时,利用变异算子的这种局部随机搜索能力可以加速向最优解收敛。显然,此种情况下的变异概率应取较小值,否则接近最优解的积木块会因变异而遭到破坏。二是使遗传算法可维持群体多样性,以防止出现未成熟收敛现象。此时收敛概率应取较大值。

在遗传算法中,交叉算子因其全局搜索能力而作为主要算子,变异算子因其局部搜索能力而作为辅助算子。

遗传算法通过交叉和变异这对相互配合又相互竞争的操作而使其具备兼顾全局和局部的均衡搜索能力。

所谓相互配合,是指当群体在进化中陷于搜索空间中某个超平面而仅靠交叉不能摆脱时,通过变异操作可有助于这种摆脱。

所谓相互竞争,是指当通过交叉已形成所期望的积木块时,变异操作有可能破坏这些积木块。如何有效地配合使用交叉和变异操作,是目前遗传算法的一个重要研究内容。

基本变异算子是指对群体中的个体码串随机挑选一个或多个基因座并对这些基因座的基因值做变动。(0,1)二值码串中的基本变异操作如下:

bf0a42fcdb3804d5f8a0f549d1bd281b_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

注意:在基因位下方标有*号的基因发生变异。

变异率的选取一般受种群大小、染色体长度等因素的影响,通常选取很小的值,一般取0.0010.1


4.终止条件


当最优个体的适应度达到给定的阈值时,或者最优个体的适应度和群体适应度不再上升时,或者迭代次数达到预设的代数时,算法终止。预设的代数一般设置为100500代。


10.2.2  程序设计


为了更好地在MATLAB中使用遗传算法,本节主要对遗传算法的程序设计和MATLAB工具箱进行讲解。

随机初始化群体P(t) = {x1,x2,,xn},计算P(t)中个体的适应度值。其MATLAB程序的基本格式如下所示:

Begin
t = 0
初始化P(t)
计算P(t)的适应度值:
while (不满足停止准则)
    do
    begin
    t = t + 1
    从P(t + 1)中选择P(t)
    重组P(t)
计算P(t)的适应度值
end


10-3:求下列函数的最大值。

f(x) = 9 * sin(5x) + 8 * cos(4x),其中 x[0, 15]


1.初始化


遗传算法MATLAB子程序如下:


% 初始化
function pop = initpop(popsize, chromlength)
pop = round(rand(popsize, chromlength));
% rand随机产生每个单元为{0, 1},行数为popsize,列数为chromlength的矩阵
% roud对矩阵的每个单元进行圆整,这样产生了初识群体
end


● initpop函数的功能是实现群体的初始化。

● popsize表示群体的大小。

● chromlength表示染色体的长度(二值数的长度),长度大小取决于变量的二进制编码的长度。


2.目标函数值


1)将二进制数转化为十进制数。遗传算法MATLAB子程序如下:


% 将二进制数转换为十进制数
function pop2 = decodebinary(pop)
    [px, py] = size(pop);
    % 求pop行和列数
    for i = 1 : py
        pop1(:, i) = 2.^(py - i) .* pop(:, i);
    end
    pop2 = sum(pop1, 2);
    % 求pop1的每行之和
end


2)将二进制编码转化为十进制数。


decodechrom函数的功能是将染色体(或二进制编码)转换为十进制数,参数spoint表示待解码的二进制串的起始位置。

对于多个变量而言,如有两个变量,采用20位表示,每个变量10位,则第一个变量从1开始,第二个变量从11开始。参数length表示所截取的长度。

遗传算法MATLAB子程序如下:


% 将二进制编码转换成十进制数
function pop2 = decodechorm(pop, spoint, length)
    pop1 = pop(:, spoint : spoint + length - 1);
    pop2 = decodebinary(pop1);
end

3)计算目标函数值。


calobjvalue函数的功能是实现目标函数的计算。

遗传算法MATLAB子程序如下:


function [objvalue] = calobjvalue(pop)
    temp1 = decodechrom(pop, 1, 10);    % 将pop每行转化成十进制数
    x = temp1 * 10 / 1023;              % 将二值域中的数转化为变量域中的数
    objvalue = 10 * sin(5 * x) + 7 * cos(4 * x);    % 计算目标函数值
end


3.计算个体的适应度值


遗传算法MATLAB子程序如下:


% 计算个体的适应度值
function fitvalue = calfitvalue(objvalue)
global Cmin;
Cmin = 0;
[px, py] = size(objvalue);
for i = 1 : px
    if objvalue(i) + Cmin > 0
        temp = Cmin + objvalue(i);
    else
        temp = 0.0;
    end
    fitvalue(i) = temp;
end
fitvalue = fitvalue'


4.选择复制


选择复制操作是决定哪些个体可以进入下一代。程序中采用赌轮盘选择法选择,这种方法较易实现。根据方程c9a5ff60ef671a12f94f85767fa162bc_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg,选择步骤如下:

在第t代,计算fsumpi

产生{0,1}的随机数rand(.),求s = rand(.)*fsum

f107c2270c5b812c97f45c892c0979b2_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg中最小的k,则第k个个体被选中。

进行N操作,得到N个个体,成为第t = t+1代群体。


遗传算法MATLAB子程序如下:


%选择复制
function [newpop] = selection(pop, fitvalue)
totalfit = sum(fitvalue);       % 求适应度值之和
fitvalue = fitvalue / totalfit; % 单个个体被选择的概率
fitvalue = cumsum(fitvalue);    % 如fitvalue=[1 2 3 4],则cumsum(fitvalue)=[1 3 6 10]
[px,py] = size (pop);
ms = sort(rand(px, 1));         % 从小到大排列
fitin = 1;
newin = l;
while newin <= px
    if(ms(newin)) < fitvalue(fitin)
        newpop(newin) = pop(fitin) ;
        newin = newin + 1;
    else
        fitin = fitin + 1;
    end
end


5.交叉


群体中的每个个体之间都以一定的概率pc交叉,即两个个体从各自字符串的某一位置(一般是随机确定)开始互相交换,这类似于生物进化过程中的基因分裂与重组。

例如,假设2个父代个体x1x2为:

x1=0100110

x2=1010001

从每个个体的第3位开始交叉,交叉后得到2个新的子代个体y1y2

y1=0100001

y2=1010110

这样2个子代个体就分别具有了2个父代个体的某些特征。

利用交叉,我们有可能由父代个体在子代组合成具有更高适应度的个体。事实上,交叉是遗传算法区别于其他传统优化方法的主要特点之一。

遗传算法MATLAB子程序如下:


% 交叉
function [newpop] = crossover(pop, pc)
[px,py] = size(pop);
newpop = ones(size(pop));
for i = 1 : 2 : px - 1
    if(rand < pc)
        cpoint = round(rand * py);
        newpop(i, :) = [pop(i, 1 : cpoint), pop(i + 1, cpoint + 1 : py)];
        newpop(i + 1, :) = [pop(i + 1, 1 : cpoint), pop(i, cpoint + 1 : py)];
    else
        newpop(i, :) = pop(i);
        newpop(i + 1, :) = pop(i + 1);
    end
end


6.变异

基因的突变普遍存在于生物的进化过程中。变异是指父代中的每个个体的每一位都以概率pm翻转,即由“1”变为“0”,或由“0”变为“1”

遗传算法的变异特性可以使求解过程随机地搜索到解可能存在的整个空间,因此可以在一定程度上求得全局最优解。

遗传算法MATLAB子程序如下:


%变异
function [newpop] = mutation(pop, pm)
[px, py] = size(pop);
newpop = ones(size(pop));
for i = 1 : px
    if(rand < pm)
        mpoint = round(rand * py);
        if mpoint <= 0
            mpoint = 1;
        end
        newpop(i) = pop(i);
        if any(newpop(i, mpoint)) == 0
            newpop(i, mpoint) = 1;
        else
            newpop(i, mpoint) = 0;
        end
    else
        newpop(i) = pop(i);
    end
end


7.求出群体中最大的适应度值及其个体


遗传算法MATLAB子程序如下:


%求群体中最大的适应度值
function [bestindividual, bestfit] = best(pop, fitvalue)
[px, py] = size(pop);
bestindividual = pop(1, :);
bestfit = fitvalue(1);
for i = 2 : px
    if fitvalue(i) > bestfit
        bestindividual = pop(i, :);
        bestfit = fitvalue(i);
    end
end


8.主程序

遗传算法MATLAB主程序如下:


clear all
popsize = 20;                   % 群体大小
chromlength = 10;               % 字符串长度(个体长度)
pc = 0.7;                       % 交叉概率
pm = 0.005;                     % 变异概率
pop = initpop(popsize, chromlength);    % 随机产生初始群体
for i = 1 : 20                  % 20为迭代次数
[objvalue] = calobjvalue (pop); % 计算目标函数
fitvalue = calfitvalue(objvalue);   % 计算群体中每个个体的适应度
[newpop] = selection(pop,fitvalue); % 复制
[newpop] = crossover(pop, pc);      % 交叉
[newpop] = mutation(pop, pc);       % 变异
[bestindividual, bestfit] = best(pop, fitvalue);    %求出群体中适应度值最大的个体及其适应度值
y(i) = max(bestfit);
n(i) = i;
pop5 = bestindividual;
x(i) = decodechrom(pop5, 1, chromlength) * 10 / 1023;
pop = newpop;
end
fplot(@(x) 9 .* sin(5 .* x) + 8 .* cos(4 .* x))
hold on
plot(x, y,'r*')
hold off


运行主程序,得到的结果如图10-8所示。

819ac902a7402d95478191852810c6df_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

10-8  遗传算法仿真结果

注意:在遗传算法中有4个参数需要提前设定,一般在以下范围内进行设置。

群体大小:20100

遗传算法的终止进化代数:100500

交叉概率:0.40.99

变异概率:0.00010.1


相关文章
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
3天前
|
算法
基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真
本程序基于海鸥优化算法(SOA)进行三维曲面最高点搜索的MATLAB仿真,输出收敛曲线和搜索结果。使用MATLAB2022A版本运行,核心代码实现种群初始化、适应度计算、交叉变异等操作。SOA模拟海鸥觅食行为,通过搜索飞行、跟随飞行和掠食飞行三种策略高效探索解空间,找到全局最优解。
|
1天前
|
传感器 算法
基于GA遗传算法的多机无源定位系统GDOP优化matlab仿真
本项目基于遗传算法(GA)优化多机无源定位系统的GDOP,使用MATLAB2022A进行仿真。通过遗传算法的选择、交叉和变异操作,迭代优化传感器配置,最小化GDOP值,提高定位精度。仿真输出包括GDOP优化结果、遗传算法收敛曲线及三维空间坐标点分布图。核心程序实现了染色体编码、适应度评估、遗传操作等关键步骤,最终展示优化后的传感器布局及其性能。
|
3天前
|
算法 数据可视化 数据安全/隐私保护
一级倒立摆平衡控制系统MATLAB仿真,可显示倒立摆平衡动画,对比极点配置,线性二次型,PID,PI及PD五种算法
本课题基于MATLAB对一级倒立摆控制系统进行升级仿真,增加了PI、PD控制器,并对比了极点配置、线性二次型、PID、PI及PD五种算法的控制效果。通过GUI界面显示倒立摆动画和控制输出曲线,展示了不同控制器在偏转角和小车位移变化上的性能差异。理论部分介绍了倒立摆系统的力学模型,包括小车和杆的动力学方程。核心程序实现了不同控制算法的选择与仿真结果的可视化。
31 15
|
5天前
|
传感器 算法 物联网
基于粒子群算法的网络最优节点部署优化matlab仿真
本项目基于粒子群优化(PSO)算法,实现WSN网络节点的最优部署,以最大化节点覆盖范围。使用MATLAB2022A进行开发与测试,展示了优化后的节点分布及其覆盖范围。核心代码通过定义目标函数和约束条件,利用PSO算法迭代搜索最佳节点位置,并绘制优化结果图。PSO算法灵感源于鸟群觅食行为,适用于连续和离散空间的优化问题,在通信网络、物联网等领域有广泛应用。该算法通过模拟粒子群体智慧,高效逼近最优解,提升网络性能。
|
2天前
|
机器学习/深度学习 算法 安全
基于深度学习的路面裂缝检测算法matlab仿真
本项目基于YOLOv2算法实现高效的路面裂缝检测,使用Matlab 2022a开发。完整程序运行效果无水印,核心代码配有详细中文注释及操作视频。通过深度学习技术,将目标检测转化为回归问题,直接预测裂缝位置和类别,大幅提升检测效率与准确性。适用于实时检测任务,确保道路安全维护。 简介涵盖了算法理论、数据集准备、网络训练及检测过程,采用Darknet-19卷积神经网络结构,结合随机梯度下降算法进行训练。
|
5天前
|
机器学习/深度学习 数据采集 算法
基于GWO灰狼优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a,展示了时间序列预测算法的运行效果(无水印)。核心程序包含详细中文注释和操作视频。算法采用CNN-GRU-SAM网络,结合灰狼优化(GWO),通过卷积层提取局部特征、GRU处理长期依赖、自注意力机制捕捉全局特征,最终实现复杂非线性时间序列的高效预测。
|
1月前
|
存储 监控 算法
剖析基于Java算法驱动的智能局域网管控之道
本文探讨了基于Java语言的局域网控制方案,结合链表数据结构与令牌桶算法,解决设备管理和流量调度难题。通过链表灵活存储网络设备信息,实现高效设备管理;令牌桶算法则精准控制流量,确保网络平稳运行。二者相辅相成,为校园、企业等局域网提供稳固高效的控制体系,保障业务连续性和数据安全。
|
1月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
148 68

热门文章

最新文章