用遗传算法求函数最大值一:编码和适应值

下面使用一个具体的例子来解释遗传算法。

问题如下:

求函数 f(x)=9×sin(5x)+8×cos(4x), x∈[5,10] 的最大值。

设置参数

首先需要设定几个参数:

popsize         = 30;       % 种群规模chromlength     = 10;       % 染色体长度pc              = 0.5;      % 交叉概率pm              = 0.05;     % 变异概率maxgen          = 20;       % 最大迭代数lx = 5; ux = 10;

MATLAB

上面分别设定了遗传算法的参数和自变量x的取值范围。

下面是对几个参数选取的说明:

参数

太大

太小

常用值

种群规模

难以收敛且浪费资源

近亲交配,产生病态基因

0~100

变异概率

可能破坏已有的有利模式

多样性下降太快,容易丢失有效基因

0.0001~0.2

交叉概率

可能破坏已有的有利模式

不能有效更新种群

0.4~0.99

进化代数

容易早熟后浪费资源

不容易收敛

100~500

初始化

初始化的种群是随机的,这里使用二进制对自变量进行编码,初始化子程序如下:

function pop = initpop(popsize, chromlength)% 初始化种群,二进制编码% popsize       input  种群规模% chromlength   input  染色体长度% pop           output popsize x chromelength的二进制矩阵pop = round(rand(popsize, chromlength));end

MATLAB

目标函数值

由于自变量采用二进制编码,因此需要首先将种群中的染色体从二进制转化为十进制。下面的子程序将二进制编码转换成十进制:

function rpop = decodebinary(pop)% 将二进制矩阵中的每一行转化为十进制数% pop   input  二进制矩阵% rpop  output 十进制列向量[n, l] = size(pop);temp = zeros(l, 1);for i = 1:l    temp(i,1) = 2^(l-i);endrpop = pop * temp;end

MATLAB

使用该函数对染色体进行解码:

function rpop = decodechrom(pop, spoint, length)% 将每行中列为spoint : spoint+length-1的二进制矩阵转化为十进制数% pop       input  种群% spoint    input  开始位置% length    input  长度% rpop      output 十进制列向量tpop = pop(:, spoint: spoint+length-1);rpop = decodebinary(tpop);end

MATLAB

decodechrom()decodebinary()的区别是,decodechrom()可以使用参数spointlength指定需要解码的列,而decodebinary()不行。

最后,使用下面的子程序求出目标函数值:

function [objvalue] = calobjvalue(pop, lx, ux)% 计算目标函数值,需根据实际情况重写% pop       input  种群% lx        input  自变量最小值% ux        input  自变量最大值% objvalue  output 目标函数值decchrom = decodechrom(pop, 1, size(pop, 2));  % 将二进制转化为十进制x = decchrom / (2^size(pop ,2)-1) * (ux - lx) + lx;objvalue = 9 * sin(5 * x) + 8 * cos(4 * x);end

MATLAB

calobjvalue()函数首先将二进制解码为十进制,将解码后的数值对应到自变量变化范围,最后求出函数值。

适应值

f(x)为目标函数值,F(x)为适应值,这里采用下面的策略求适应值,但是此方法并不适用于所有情况,需要需根据实际情况重写:

对于最小化问题:

对于最大化问题:

下面是代码实现:

function fitvalue = calfitvalue(objvalue, opt)% 根据目标函数值生成适应度值,需根据实际情况重写% objvalue      input  目标函数值% opt           input  操作模式,指定为'min'或'max'% fitvalue      output 适应度值fitvalue = zeros(size(objvalue,1), 1);for i = 1 : size(objvalue, 1)
    if strcmp(opt, 'min')
        if objvalue(i) < 0
            temp = -objvalue(i);
        else
            temp = 0;
        end
    else
        if objvalue(i) > 0
            temp = objvalue(i);
        else
            temp = 0;
        end
    end
    fitvalue(i) = temp;endfitvalue = fitvalue';

MATLAB

原文发布于微信公众号 - mwangblog(mwangblog)

原文发表时间:2018-09-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Petrichor的专栏

tensorflow编程: Layers (contrib)

min(max(features, 0), 6)。即对 tf.nn.relu 的优化,防止 relu过后 某些 极端值 依然 大于6

1972
来自专栏C/C++基础

Dijkstra算法求单源最短路径

在一个连通图中,从一个顶点到另一个顶点间可能存在多条路径,而每条路径的边数并不一定相同。如果是一个带权图,那么路径长度为路径上各边的权值的总和。两个顶点间路径长...

2151
来自专栏Java Web

最长公共子序列问题

问题描述: 求两个字符序列的公共最长子序列。 ---- 最长公共子串 在回到子序列问题之前,先来了解一下子串的问题。 例如,HISH和FISH两个字符序列的公...

3514
来自专栏数值分析与有限元编程

有限元 | 二次样条梁单元

样条梁单元是样条函数与有限元法相结合的产物。有限元法将结构分割成若干单元,位移场采用分段插值或者分区插值。常用的插值方法有Lagrange插值,Hermite插...

3828
来自专栏小樱的经验随笔

MATLAB命令大全+注释小结

一、常用对象操作:除了一般windows窗口的常用功能键外。 1、!dir 可以查看当前工作目录的文件。   !dir& 可以在dos状态下查看。 2、who ...

3344
来自专栏人工智能LeadAI

pytorch入门教程 | 第二章:Autograd

autograd自动微分 假如我们有一个向量x=(1,1)当成input,经过一系列运算得到了output变量y,如下图所示: ? 如图所示,向量x经过与4和自...

38412
来自专栏崔庆才的专栏

TensorFlow RNN Cell源码解析

本文介绍下 RNN 及几种变种的结构和对应的 TensorFlow 源码实现,另外通过简单的实例来实现 TensorFlow RNN 相关类的调用。 RNN R...

5045
来自专栏数值分析与有限元编程

一维变带宽存储刚度矩阵

我们知道,集成之后的整体刚度矩阵是一个对称的稀疏带状矩阵,如图1所示。这样的矩阵包含大量的0元素,占用大量的存储空间。为了节约存储空间,可采取一些方法对刚度矩阵...

4016
来自专栏编程坑太多

人工智能python的tensorflow基础

1243
来自专栏专知

用RNN构建文本生成器(TensorFlow Eager+ tf.keras)

【导读】本文翻译自TensorFlow官网新出的教程《Text generation using a RNN with eager execution》,该教程...

3103

扫码关注云+社区