利用遗传算法求解函数极值

2023-11-04

1.利用遗传算法求解函数极值

例1 利用遗传算法求函数
f(x) = 11sin(6x) + 7cos(5x),x∈[- π,π]的最大值点。

解:在MATLAB中编制绘制函数曲线的代码,运行得到题中函数的曲线图如下图所示。从下图中可以看出,该函数有多个极值点,如果使用其他的搜寻方法,很容易陷人局部最小点,而不能搜寻到真正的全局最小点,但遗传算法可以较好地弥补这个缺陷。
在这里插入图片描述
遗传算法的具体实现如下。

  1. 问题分析

在本题中,设定自变量x为个体的基因组,即用二进制编码表示x;设定函数值
f(x)为个体的适应度,函数值越小,适应度越高。关于二进制编码方式,在精度允许的范围内,可以将区间内的无穷多点用间隔足够小的有限点来代替,以降低计算量同时保证精度损失不大。

  1. 编写代码方法

用长度为十的二进制编码串来分别表示两个决策变量Umax (2π)、Umin(0)。10位二进制编码串可以表示为0~1023之间的1024个不同的数,故将Umax、Umim的定义域离散为1023个均等的区域,包括两个端点在内共有1024个不同的离散点。

从离散点Umin到Umax ,依次让它们分别对应从0000000000(0)到1111111111(1023)之间的二进制编码。再将分别表示Umax、Umin的二进制编码串联在一起,组成一个20位长的二进制编码串,它构成了这个函数优化问题的染色体编码方法。使用这种编码方法,解空间和遗传算法的搜索空间具有一一对应的关系。

  1. 确定个体评价方法

在遗传算法中,以个体适应度的大小来确定该个体被遗传到下一代群体中的概率。

基本遗传算法使用比例选择算子来确定群体中各个个体遗传到下一代群体中的数量。为正确计算不同情况下各个个体的遗传概率,要求所有个体的适应度必须为整数或者是零,不能是负数。

为满足适应度取非负值的要求,将目标函数f(x)变换为个体适应度F(x),一般采用以下两种方法。

  • 对于求目标函数最大值的优化问题,变换公式为

F(x) =f(x) +Cmin, (f(x)+ Cmin) > 0
F(x)=0 其他
其中,Cmin为一个适当地相对比较小的数,它可用预先指定一个较小的数,或者进化到当前代为止的最小目标函数值、当前代或最近几代群体中的最小目标函数。

  • 对于求目标函数最小值的优化问题,变换公式为

F(x) = Cmax-f(x), f(x) < Cmax
F(x) = 0 其他
其中,Cmax为一个适当地相对比较大的数,它可用预先指定一个较大的数,或者进化到当前代为止的最大目标函数值、当前代或最近几代群体中的最大目标函数值。

根据适者生存原则选择下一代的个体。在选择时,以适应度为选择原则。适应度准则体现了适者生存,不适应者淘汰的自然法则。

  1. 设计遗传算子

(1)使用赌轮选择算法,决定哪些个体可以进入下一代,其过程如下。
①在第t代,由pi= fi/Σfi= fi/fsum , 计算fsum和pi
②产生{0,1}的随机数rand(),求s=rand()* fsum.
③求Σfi≥s中最小的k ,则第k个个体被选中。
④进行N次②,③操作,得到N个个体,成为第t=t+1代种群。
(2)分别求出20个初始种群中每个种群个体的适应度函数,并计算所有种群的和S.
(3)在区间(0,S)上随机的产生一个数r从某个基因开始,逐一取出基因来,把它的适应度加到s上去(s开始为0),如果s大于r,则停止循环并返回当前基因.

  1. 交叉运算

使用单点交叉算子,对于选中用于繁殖下一代的个体,随机地选择两个个体的相同位置,按交叉概率P在选中的位置实行交换。这个过程反映了随机信息交换,目的在于产生新的基因组合也即产生新的个体。
假设2个父代个体x1、x2为.
x1 = 0100110
x2 = 1010001
从每个个体的第3位开始交叉,交叉后得到两个新的子代个体y1,y2分别为
y1 =0100001
y2 = 1010110
这样两个子代个体就分别具有了两个父代个体的某些特征。

  1. 变异运算

在所有的个体一样时,交叉是无法产生新个体的,这时只能靠变异产生新的个体。

在算法中,可以变异概率分别对每个或者几个基因位做变异操作就可以生成新的种
群个体。

父代中的每个个体的每一位都可以以设定的概率进行翻转,即由1变为0,或由0变
为1。变异增加了全局优化的特质。

根据以上分析,编写MATLAB代码如下:

主程序

clc;
clear all;
popsize = 20;       %设置初始参数,群体大小
chromlength = 8;    %字符出长度(个体长度),染色体长度
pc = 0.7;           %设置交叉概率
pm = 0.02;          %设置变异概率
pop = initpop(popsize,chromlength);     %运行初始化函数,随机产生初始群体
for i = 1: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)11.*sin(6.*x)+7.*cos(5.*x));
grid on;
hold on;
plot(x,y,'r* ');
xlabel('自变量');
ylabel('目标函数值');
title('种群中的个体数目为20,二进制编码长度为8,交叉概率为0.7,变异概率为0.02');
fmax = max(y)
hold off

子函数

%初始化
function pop = initpop( popsize, chromlength)
pop = round(rand(popsize, chromlength));
%rand随机产生每个单元为{0,1}行数为popsize,列数为chromlength的随机数矩阵,
%roud对矩阵的每个单元进行圆整,这样产生的初始种群,
end
%round函数用于舍入到最接近的整数。语法形式只有1种:Y = round(X),这里的X可以是数,向量,矩阵,输出对应。
%将二进制编码转换成十进制
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);
%求popl的每行之和,1为列的和
end
%将二进制编码转换成十进制
function pop2 = decodechrom( pop, spoint, length)
    pop1 = pop(:, spoint:spoint + length- 1);
    pop2 = decodebinary(pop1);
end

%实现目标函数的计算
function  [abjvalue] = calobjvalue(pop)
    templ = decodechrom(pop,1,8); %将pop每行转化成十进制数
    x= templ * 10/1023;           %将二值域中的数转化为变量域的数
    abjvalue = 11* sin(6*x)+7* cos(5*x);%计算目标函数值
end
%计算个体的适应值
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';
%%使用golbal的优点:

% 1 传递大数据的参数
%如果通过函数传参数的方式的话,系统会浪费过多的时间在复制数据的时间上,如果采用global的方式共享数据的话代码的效率会大大提高
% 
% 2 过多的常量需要传递
%如果每个量都作为函数函数的参数传递的话,代码参数列表就很长,如果采用global的话代码的可读性提高,函数调用也方便

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 = 1;
while newin <= px
    if (ms(newin)) < fitvalue(fitin)
        
        newpop(newin) = pop(fitin);
        newin= newin + 1;
    else
        fitin = fitin+1;
    end
end
end
%交叉
function [newpop] = crossover(pop, pc)
[px, py] = size(pop);
newpop = ones(size(pop));
for i= 1:2:px- 1  %2为间隔
    if(rand <pc)
        cpoint = round(rand* py);
        newpop(i,:) = [pop(i,1:cpoint),pop(i+ 1,cpoint+1:py)];
        nevpop(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
%变异
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(1);
            if any( newpop( i, mpoint))==0
                newpop( i, mpoint) = 1;
            else
                newpop(i, mpoint) = 0;
            end
    else
        newpop(i) = pop(i);
    end
end

%计算群体中最大的适应值及其个体
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

  • 本题中选择二进制编码,种群中的个体数目为20,二进制编码长度为8,交叉概率为0.7,变异概率为0.02。 运行以上程序得到结果如下:

结果如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这是用常规求解函数最大值,可以看出最优解相差不大,

  • 选择二进制编码,降低交叉概率,即种群中的个体数目为20,二进制编码长度为8,交叉概率为0.2,变异概率为0.02。运行主程序,得到结果:

在这里插入图片描述
在这里插入图片描述
由图可见,交叉概率较小时,全局最优解也减少。

  • 选择二进制编码,增加变异概率,即种群中的个体数目为20,二进制编码长度为8, 交叉概率为0.7,变异概率为0.01。运行主程序,得到结果
    在这里插入图片描述
    在这里插入图片描述
    由图可见,增加变量概率并不一定使全局最优解增加。图中函数最大输出值为17.7533,这与变异概率为0.02时的值相同。

  • 选择二进制编码,增加种群个体数目,即种群中的个体数目为30,二进制编码长度为 8,交叉概率为0.7,变异概率为0.02。运行主程序,得到结果如下:
    在这里插入图片描述
    在这里插入图片描述
    由图可见,增加种群个体数目后,函数最大值变小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用遗传算法求解函数极值 的相关文章

  • 像matlab一样在python中连接数组而不知道输出数组的大小

    我正在尝试在 python 中连接数组 类似于 matlab array1 zeros 3 500 array2 ones 3 700 array array1 array2 我在 python 中做了以下操作 array1 np zero
  • 在矩阵中找到叉的最快方法

    定义 A i j 1 是十字的中点 如果元素A i 1 j 1A i 1 j 1A i j 1 1A i j 1 1 这些元素和中点一起形成矩阵 A 中的十字 其中 A 至少是一个 3 3 矩阵 并且i j 0 假设上图是 8 8 矩阵 A
  • MATLAB 中的逻辑数组与数值数组

    我正在比较两个二进制数组 我有一个数组 其中值可以是一或零 如果值相同则为 1 如果不同则为零 请注意 我正在做检查之外的其他事情 因此我们不需要进入矢量化或代码的性质 在 MATLAB 中使用数值数组和逻辑数组哪个更有效 Logical
  • 霍夫变换检测和删除线

    我想使用霍夫变换检测图像中的线条 但是我不想绘制线条 而是想删除原始图像中检测到的每条线条 image imread image jpg image im2bw image BW edge image canny imshow BW fig
  • 在 Python 上显示 Matlab mat 文件中的图像

    我目前正在尝试显示从此下载的 Mat 文件中的图像site http www rctn org bruno sparsenet 这是一个 mat 文件 所以我尝试使用 scipy io loadmat 函数加载它 但我似乎无法绘制图像 我究
  • 在 MATLAB 图中用值标记点

    以下命令确实用正方形标记了点 但没有在其中放入值 例如 21 0 X 21 8 2 1 0 Y 0 1 2 3 4 plot X Y k s 我应该添加哪个参数以便全部5点值出现在图上吗 这些值不能一一键入 因为它们是随机数 因此它们可能会
  • matlab中优先级队列的实现方法

    matlab中有没有提供minpriorityqueue功能的库 import java util PriorityQueue import java util public class MyQueue Comparator
  • 如何从 Matlab 运行 R 脚本 [重复]

    这个问题在这里已经有答案了 我有 m 文件 我想用它来运行 R 脚本 我怎样才能做到这一点 Matlab文件 caller m some matlab code need to call a R script some matlab cod
  • 在Matlab图例中使用Latex?

    我的 matlab 不接受我的 Latex 例如 如果我使用legend b 6 rightarrow b 7 它没有向我显示箭头 我该如何解决这个问题 尝试使用 Latex 解释器 例如 legend b 6 rightarrow b 7
  • 使用正常数据直方图与直接公式进行熵估计(matlab)

    假设我们已经绘制了n 10000标准正态分布的样本 现在我想使用直方图计算其熵来计算概率 1 计算概率 例如使用matlab p x hist samples binnumbers area x 2 x 1 sum p p p area b
  • matlab中简单正弦波的傅里叶变换

    我尝试显示简单正弦波的频谱 因为我们知道具有固定频率的单个正弦波必须在其频谱中出现峰值我编写了这段代码 但我无法得到这个峰值我的代码中有什么问题 clc nsteps 200 number of signal elements in tim
  • MATLAB 符号替换

    我知道在 MATLAB 中如果声明了 syms x y f x 2 y 2 grad gradient f 然后grad会存储值 2 x 2 y 如果我想评估梯度 2 2 I use subs f x y 2 2 这返回 4 4 我正在编写
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac
  • 如何从一个清晰的例子计算二维图像中的吉布斯能量

    我有一个关于矩阵的有趣问题 在吉布斯分布中 吉布斯能量U x 可以计算为 这是所有可能的派系 C 上的派系势 Vc x 的总和 右图 团 c 被定义为 S 中站点的子集 x 蓝色像素的邻域是左图中黄色像素的邻居 其中每对不同的站点都是邻居
  • 如何使用神经网络保存 Sift 特征向量进行分类

    SIFT 特征的 Matlab 实现发现于http www cs ubc ca lowe keypoints http www cs ubc ca lowe keypoints 在 stackoverflow 的帮助下 我想将功能保存到 m
  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • FFT 的功率谱密度

    我有一段代码可以获取部分信号的 FFT 现在我正在尝试获取 PSD Fs 44100 cj sqrt 1 T 6 dt 1 Fs left test 1 right test 2 time 45 interval 636 w range t
  • 如何在 MATLAB 中可视化球体的交集?

    似乎这个问题在一些地方被问过 包括SO https stackoverflow com questions 35130336 draws the intersecting volume of two spheres in matlab 我最
  • 在 Excel 中打印 MATLAB 图窗并调整其大小

    我在 MATLAB 中有两个带有手柄的图形hFig1 and hFig2 我想将它们打印到 Excel 中的特定单元格 单元格 E3 和 I3 并将它们重新调整为 2 英寸 x 3 英寸 我尝试过使用 AddPictures对象处理程序和使
  • 计算数组中接下来的 n 个元素的乘积

    我想计算下一个的乘积n矩阵的相邻元素 号码n要相乘的元素数应在函数的输入中给出 例如 对于此输入 我应该从第一个开始计算每 3 个连续元素的乘积 p ind max product 1 2 2 1 3 1 3 这给出了 1 2 2 2 2

随机推荐

  • 02_ue4界面介绍

    1 菜单栏 1 文件 加载保存项目和关卡等 2 编辑 项目设置 标准的复制和粘贴操作 3 窗口 打开视图和其他面板 如果不小心关了窗口 可以在里面找 4 帮助 获得在线文档等帮助 2 工具栏 快速访问常用工具 1 保存当前关卡 2 对当前关
  • Flink 水位线

    水位线是什么 窗口 有了 但是要知道我们面对的是实时数据 而这些数据随时会出现延迟的情况 从几秒到几小时都有可能 如果要忽略这些数据 那么显然对于结果的计算是不准确的 可是要等待这些延迟数据的话 那岂不是等同于批处理了 我们等不了那么久的
  • CentOS7上安装 Apache

    在 CentOS 7 上安装 Apache 的方法如下 1 首先打开终端 并使用 sudo 命令以 root 权限运行 sudo su 2 更新软件包列表 yum update 3 安装 Apache 服务器和常用工具 yum instal
  • C++【对象模型】

    文章目录 索引 一 默认构造函数 1 何时默认构造函数会自动生成 2 编译器合成有用的构造函数四种情况 2 1 类中内含带有默认构造的类成员 2 2 带有默认构造的基类 2 3 带有虚函数的类 2 4 带有一个虚基类的类 索引 C 对象模型
  • Jetbrain项目管理全家桶

    sudo mkdir p m 750 opt hub data opt hub conf opt hub logs opt hub backups sudo chown R 13001 13001 opt hub data opt hub
  • ppt地图分布图一块一块的怎么做_学会“地图话”,走遍天下都不怕!

    PPT是维他命 hi 这里是PPT是维他命 谢谢你的关注 我们一起进步 hello大家 又 好久不见了 心虚 距离上次更新已经快两个月了 说好的半月更 说好的尽快发地球公转 都是我的锅 从十一开始因为加课时一直在调整节奏 忙到原地陀螺转 这
  • Vue中使用七牛云上传报错o.upload.addEventListener is not a function以及其他报错问题

    1 运行提示o upload addEventListener is not a function 解决方案 此方法不是根本解决办法 问题3的解决办法是最终解决方案 找到node modules mockjs dist mock js 第8
  • 北京大学肖臻老师《区块链技术与应用》公开课 06-BTC-网络

    总述 用户将交易发布到比特币网络上 节点收到这些交易之后 将其打包到区块里 节点将区块发布到比特币网络中 新发布的区块在比特币网络中如何传播 The Bitcoin Network 比特币工作在应用层 application layer B
  • 羞羞的报告:2020年轻人性爱数据报告。

    VI 腾讯新闻谷雨数据出品 ID guyudata 转自 小蚊子数据分析 今天开工第一天 就来分享点数据相关的轻松的内容 2020年 多少人实现了性爱需求的满足 多少人处于性需求的 贫困线 以下 在性幻想 性需求的表达等方面 男女之间的抉择
  • 云杰恒指:7.29恒指期货实盘指导交易复盘

    对于一个成熟交易者来说 盈利是市场给的 没有属于我们的行情 我们坚持不会开仓 看不懂的行情不开仓 直到交易信号出现 然后精准出击 获得属于我们自己的利润 曾有人对技术分析过度依赖 在一次爆仓后找到我 我给出的答案是技术分析本来就是一会准一会
  • 一致性 Hash 算法(分布式或均衡算法)

    简介 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希 DHT 实现算法 设计目标是为了解决因特网中的热点 Hot spot 问题 初衷和CARP十分类似 一致性哈希修正了CARP使用的简单哈希算法带来的问题 使得分布式哈希 D
  • Python爬取研招网数据

    一 爬虫定制部分 导入相关的包 import requests import lxml html import chardet import pandas as pd import numpy as np 请求头获取页面 def get p
  • Spring Boot 代码混淆(proguard-maven-plugin的使用说明)

    什么是代码混淆 就是将代码的通过工具使其可读性变差 越差越好 Proguard是什么 官网地址 www guardsquare com proguard 该工具主要是为了实现Java以及Android App的代码混淆工作 从官网的说明可以
  • 批量爬取百度图片

    输入关键字和要爬取的数量 直接爬取图片并保存到本地 这个比较简单 直接使用即可 import requests import json word input 输入您需要爬取的关键字 page num int input 需要爬取多少页 一页
  • Linux 进程手撕笔记——万字深剖详解

    目录 传统艺能 冯 诺依曼体系 内存 控制器 如何搞管理 进程 操作系统立大功 进程查看 进程的 PID 获取进程 PID fork 进程状态 Linux 进程状态 进程优先级 为什么会有优先级 Linux 优先级相关操作 传统艺能 小编是
  • Java线程池的正确关闭方法,awaitTermination还不够

    问题说明 今天发现了一个问题 颠覆了我之前对关闭线程池的认识 一直以来 我坚信用shutdown awaitTermination关闭线程池是最标准的方式 不过 这次遇到的问题是 子线程用到BufferedReader 而BufferedR
  • 利用STM32CubeMX软件生成USB_DEVICE_SD卡虚拟U盘

    一 测试平台 MCU STM32F429NIH6 工具 STM32CubeMX软件 编译软件 MDK 二 配置步骤 1 打开STM32CubeMX软件 创建新的工程文件 先生成一个的串口的收发例程 需要实现将串口收到的数据发送的出来 生成串
  • 【华为OD机试 】新工号中数字的最短长度(C++ Java JavaScript Python)

    华为od机试共有3道题 分值为100 100 200 总分为400分 考试时间 2 5h 每道题目都需要通过测试用例来得分 全通过则为满分 华为od机试是在牛客网上进行的 采用ACM模式 华为od机试目标院校分数为160分 华为od机试非目
  • ideavim 解决烦人的中英文切换问题

    先下载插件IdeaVimExtension 然后终端输入 set keep english in normal and restore in insert 注意前面有个冒号
  • 利用遗传算法求解函数极值

    1 利用遗传算法求解函数极值 例1 利用遗传算法求函数 f x 11sin 6x 7cos 5x x 的最大值点 解 在MATLAB中编制绘制函数曲线的代码 运行得到题中函数的曲线图如下图所示 从下图中可以看出 该函数有多个极值点 如果使用